Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.10.2003, 21:04

Probleme mit Klassen

Also ich komme absolut nicht weiter.

Folgender Code:

NC_DI_Init.h

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <dinput.h>
#include "globales.h"


// Allgemeine Klasse für jedes Eingabegerät

class Geraeteerstellung
{
public:
    
    LPDIRECTINPUT8          lpDI;           // Direct Input(R) - Objekt
    LPDIRECTINPUTDEVICE8    lpDIGeraet;
    int DI_Init_general(HINSTANCE hinst, LPDIRECTINPUT8 lpDI);
};


// Klasse für eine Tastatur mit maximal 256 tasten

class Tastatur
{
private:
    char Key_Buffer[256];

public:

    int Tastatur_Init(LPDIRECTINPUT8 lpDI, LPDIRECTINPUTDEVICE8 lpDIGeraet, HWND    hwnd);
    //int Tastatur_Eingabe();

};


NC_DI_Init.cpp

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>
#include "NC_DI_Init.h"
#include <dinput.h>
#include "globales.h"



// Methoden-Implementierung der allgemeinen Geräteklasse

int Geraeteerstellung::DI_Init_general(HINSTANCE hinst, LPDIRECTINPUT8 lpDI)
{
    if (FAILED(DirectInput8Create(hinst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&lpDI, NULL)))
    {
        MessageBox(NULL, "Fehler beim Erstellen des Direct Input Objektes", "Fehlermeldung", MB_OK);
        
        
    }
    MessageBox(NULL, "KEIN Fehler beim Erstellen des Direct Input Objektes", "Fehlermeldung", MB_OK);
    return (1);

}

// Methoden-Implementierung der Tastaturklasse

int Tastatur::Tastatur_Init(LPDIRECTINPUT8 lpDI, LPDIRECTINPUTDEVICE8 lpDIGeraet, HWND hwnd)
{
    lpDIGeraet = NULL;
    if (FAILED(lpDI->CreateDevice(GUID_SysKeyboard, &lpDIGeraet, NULL)))
    {
        MessageBox(NULL, "Fehler beim Erstellen des Tastaur-Objektes", "Fehlermeldung", MB_OK);
        return 1;
    }

    if (FAILED(lpDIGeraet->SetDataFormat(&c_dfDIKeyboard)))
    {
        MessageBox(NULL, "Fehler beim Einstellen des Datenformates", "Fehlermeldung", MB_OK);
        return 1;
    }

    if (FAILED(lpDIGeraet->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)))
    {
        MessageBox(NULL, "Fehler beim Einstellen der Kooperationsebene", "Fehlermeldung", MB_OK);
        return 1;
    }

    if (FAILED(lpDIGeraet->Acquire()))
    {
        MessageBox(NULL, "Fehler beim AKtivieren der Tastatur", "Fehlermeldung", MB_OK);
        return 1;
    }

    else
    {
        MessageBox(hwnd, "Alles OK!!!", "Hinweis", MB_OK);
        return 0;
    }
}


NC_DI_Main.cpp

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include "NC_DI_Init.h"
#include "globales.h"





LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, 
                            LPARAM lparam)
   {
   
   switch(message)
       {    
       case WM_DESTROY: 
           {
         PostQuitMessage(0);
         return(0);
           } break;

       default:break;
      } // switch

   return (DefWindowProc(hwnd, message, wparam, lparam));

   } // WindowProc

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,
                        LPSTR lpcmdline, int ncmdshow)
   {

   WNDCLASSEX  winclass;
   HWND                     hwnd;
   MSG                      message;
   const char szclassname[] = "Klassenname";
   Geraeteerstellung        Device;
   Tastatur                 Keyboard;   

   winclass.cbSize         = sizeof(WNDCLASSEX);
   winclass.style              = CS_HREDRAW | CS_VREDRAW;
   winclass.lpfnWndProc    = WindowProc;
   winclass.cbClsExtra      = 0;
   winclass.cbWndExtra      = 0;
   winclass.hInstance       = hinst;
   winclass.hIcon              = LoadIcon(NULL, IDI_APPLICATION);
   winclass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
   winclass.hbrBackground   = (HBRUSH)GetStockObject(WHITE_BRUSH);
   winclass.lpszMenuName    = NULL;
   winclass.lpszClassName   = szclassname;
   winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

   if (!RegisterClassEx(&winclass))
    return(0);

   if (!(hwnd = CreateWindowEx(NULL,
                szclassname,
                "3D Spieleprogrammierung - Titelleiste",
                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                    0,0,
                    400,300,
                    NULL,
                    NULL,
                    hinst,
                    NULL)))
      return(0);

   ShowWindow(hwnd, ncmdshow); // überflüssig wenn WS_VISIBLE
   UpdateWindow(hwnd);         // überflüssig wenn WS_VISIBLE

   while(GetMessage(&message,NULL,0,0))
       { 
       TranslateMessage(&message);
       DispatchMessage(&message);
       } // while

   Device.DI_Init_general(hinst, lpDI);
   Keyboard.Tastatur_Init(lpDI, lpDIGeraet, hwnd);

   return message.wParam;

   } // WinMain



wenn ich nun kompiliere, dann kommt leider eine Anreihung von fehlern:

Zitat

--------------------Konfiguration: Windowfenster - Win32 Debug--------------------
Kompilierung läuft...
NC_Main.cpp
c:\dxsdk\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
c:\c++\nc_d3d_engine\windowfenster\nc_main.cpp(78) : error C2065: 'lpDI' : nichtdeklarierter Bezeichner
c:\c++\nc_d3d_engine\windowfenster\nc_main.cpp(79) : error C2065: 'lpDIGeraet' : nichtdeklarierter Bezeichner
Ueberspringen... (keine relevanten Aenderungen gefunden)
NC_DI_Init.cpp
Fehler beim Ausführen von cl.exe.

Windowfenster.exe - 2 Fehler, 0 Warnung(en)



BITTE HELFT MIR!!!![/code]

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

14.10.2003, 21:30

Allgemeiner Logikfehler sag ich nur :D

Device.DI_Init_general(hinst, lpDI);
Keyboard.Tastatur_Init(lpDI, lpDIGeraet, hwnd);

ich mein, lpDI und lpDIGeraet sind in class Geraeteeinstellungen drin. also musst eine Instanz der Geraeteeinstellung erstellen z.b. so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Instanzen erstellen
Geraeteeinstellung Tastatur;
Geraeteeinstellung Maus;

// ===========================
// Tastatur:
// benutzen:
   Device.DI_Init_general(hinst, Tastatur.lpDI);   // auf das lpID Objekt von Tastatur zugreifen
   Keyboard.Tastatur_Init(Tastatur.lpDI, Tastatur.lpDIGeraet, hwnd);    // auf das lpIDGeraet Objekt von Tastatur zugreifen

// ===========================
// Maus:
// benutzen:
   Device.DI_Init_general(hinst, Maus.lpDI);   // auf das lpID Objekt von Maus zugreifen
   Mouse.Maus_Init(Maus.lpDI, Maus.lpDIGeraet, hwnd);    // auf das lpIDGeraet Objekt von Maus zugreifen


Also ich mein, wozu haste denn sonst die Klasse "Geraeteeinstellung"? ;)

p.s.:
Paar sachen zum Style:
1. Geraeteeinstellung: Ist ne klasse, sollte man mit dem Präfix C beginnen. z.B.: CGereateeinstellung (wegen übersichtlichkeit)
2. Ähme Englische Klassen, Funktions, Variablen und Markonamen kommen einfach besser in ner Englischen Programmiersprache :D
3. get und set funktionen sind bei klassen unverzichtbar! und nix mit Public variablen :)
4. MessageBox für Debugzwecke? Das kann böse böse enden, vorallem wenn der Backbuffer bei nem Error die messagebox noch übermalt oder das Programm abschmiert. Tipp: Textdateien
5. Includeguards wirken WUNDER! (hab die bei "NC_DI_Init.h" vermisst!) sowie ein Umfangreiches Dateidesign.
z.B. so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Datei:           Types.h
// //////////////////////////////////////////////////////////////////////////////////
// Autor:           Patrick Ullmann                             © Xarent Interactive
// Erstellt:        05.10.03
// Änderungen:     05.10.03    (Patrick)   Datei erstellt
//          09.10.03    (David)     PI Definition und Linker eingerichtet.
// //////////////////////////////////////////////////////////////////////////////////
// Beschreibung:    Diverse Dateitypdefinitionen und Makros

#ifndef _TYPES_H_
#define _TYPES_H_

// I N C L U D E S //////////////////////////////////////////////////////////////////
    // Bei Win32 muss die Windows.h includiert werden!
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif

    // Standardheader für das Programm
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#include <cmath>
#include <vector>

    // SDL und OpenGL includieren
#include <SDL\SDL.h>
#include <GL\gl.h>
#include <GL\glu.h>
#include <GL\glaux.h>

// L I N K E R //////////////////////////////////////////////////////////////////////
    // Windows kann diese Libs selbst linken, sonst muss man manuel dran.
#ifdef _WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib") 
#endif

// D E F I N I T I O N E N //////////////////////////////////////////////////////////
    // Diese Dateitypen sind normalerweise in der windef.h drin, wir nehmen aber aus
    // Portablen gründen unsere eigenen Definitionen, die denen aus 
    // der Windef.h entsprechen.
typedef unsigned long       DWORD;
typedef unsigned short      WORD;
typedef unsigned char       BYTE;
typedef unsigned int        UINT;

    // PI ist sehr wichtig!!
const float PI = 3.1415926535897932f;

    // Bei Win32 muss man die definition von main aufheben wegen SDL
#ifdef _WIN32
#undef main
#endif

    // enum für verschiedene Filetypes
enum FILE_TYPE
{
    FILE_UNKNOW = 0,
    FILE_TGA    = 1,
    FILE_BMP    = 2,
    FILE_PNG    = 3
};

// M A K R O S //////////////////////////////////////////////////////////////////////
    // Manche Compiler kennen dieses Makro nicht, drum selbstdefinieren.
#ifndef __FUNCTION__
#define __FUNCTION ("unknow")
#endif

    // Da ich ne Faule Sau bin benutz ich dieses Makro einfach mal :D
#ifndef LOG_PARAMS
#define LOG_PARAMS __FILE__, __LINE__, __FUNCTION__
#endif

#ifndef PROTOKOLL
#define PROTOKOLL CLog::getInstance()
#endif

#ifndef VIDEO
#define VIDEO CVideo::getInstance()
#endif

#ifndef KEYBOARD
#define KEYBOARD CKeyboardManager::getInstance()
#endif

#ifndef GAMEMANAGER
#define GAMEMANAGER CGameManager::getInstance()
#endif 

#ifndef TEXTUREMANAGER
#define TEXTUREMANAGER CTextureManager::getInstance()
#endif 

#ifndef ENTITYMANAGER
#define ENTITYMANAGER CEntityManager::getInstance()
#endif 

// F U N K T I O N E N //////////////////////////////////////////////////////////////
    // Noch keine

// S T R U K T U R E N //////////////////////////////////////////////////////////////
    // Noch keine

#endif

Ist recht übersichtlich und Effektiv :) Soetwas sollte man sich angewöhnen :)

Tschüüüs, :angel:
Patrick

3

14.10.2003, 21:39

das habe ich doch gemacht


Quellcode

1
2
Geraeteerstellung      Device; 
   Tastatur               Keyboard;

4

14.10.2003, 21:43

Ich habe jetzt geschrieben:

Quellcode

1
2
Device.DI_Init_general(hinst, Device.lpDI);
   Keyboard.Tastatur_Init(Device.lpDI, Device.lpDIGeraet, hwnd);




Jetzt kommt noch die Warnung:

--------------------Konfiguration: Windowfenster - Win32 Debug--------------------
Kompilierung läuft...
NC_Main.cpp
C:\c++\NC_D3D_Engine\Windowfenster\NC_Main.cpp(78) : warning C4700: Lokale Variable 'Device' wurde ohne Initialisierung verwendet
Linker-Vorgang läuft...

Windowfenster.exe - 0 Fehler, 1 Warnung(en)


Und wenn dann die Anwendung ausgeführt wird, kommt ein Fehler wegen Speicherüberlauf.
Woran liegt das?

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

5

14.10.2003, 21:47

Hmmmm evtl. fehlender Konstruktor oder weil du ein Objekt (Device.lpDI & Device.lpDIGeraet) per Parameter an eine Funktion übergibst der selben klasse. (würde ich eher sagen, hab deinen Code nur schnell überflogen. :))

6

14.10.2003, 21:51

tatsächlich war es der zweite Fall.

jetzt kommt die Fehlermeldung, dass die Kooperationsebene nicht eingestellt werden konnte.

Das ist ja wohl kein fehler von mit, oder?
Das ist ja eine von mir definierte Fehlermeldung

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

14.10.2003, 21:55

jop das ist ein anderer Fehler, am besten du Fängst per HRESULT den Rückgabewert der DI Funktion ab und guckst im SDK was dieser Rückgabewert zu bedeuten hat. Ich kenn mich mit DX leider net mehr besonders aus ;D (SDL + OpenGL User halt ;))

8

14.10.2003, 22:00

Ich habe den Fehler gefunden.

Es liegt an HWND hwnd

Es scheint, als würde ich der Funktion die Variable falsch übergeben, denn nur bei der Kooperationslevelfunktion wird er gebraucht und da versagt er.

Wie kann ich denn das hwnd korrekt an die Funktion übergeben?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (!(hwnd = CreateWindowEx(NULL, 
                szclassname, 
                "3D Spieleprogrammierung - Titelleiste", 
                WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
                 0,0, 
                400,300, 
                NULL, 
                NULL, 
                hinst, 
                NULL))) 
      return(0); 

   ShowWindow(hwnd, ncmdshow); // überflüssig wenn WS_VISIBLE 
   UpdateWindow(hwnd);         // überflüssig wenn WS_VISIBLE 

   while(GetMessage(&message,NULL,0,0)) 
      { 
      TranslateMessage(&message); 
      DispatchMessage(&message); 
      } // while 

   Device.DI_Init_general(hinst, lpDI); 
   Keyboard.Tastatur_Init(lpDI, lpDIGeraet, hwnd); // HIER<---------------

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

14.10.2003, 22:06

hmmm also richtig ist die HWND übergabe schon... hmmm.

Probier mal folgendes aus:

HWND g_hwnd; // in die Main schreiben und den benutzen

in der Cpp von DI schreibste oben das rein:

extern HWND g_hwnd;

und benutzt den in deiner Funktion.

Kämme mir recht komisch vor wenn das Funzen würde, aber naja versuch isses wert :D (iiih globale Variablen ;D)

10

14.10.2003, 22:10

seltsam!

Quellcode

1
hr = lpDIGeraet->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);


dann geht es???? :roll:

Werbeanzeige