| 
			
				|  | JLI Spieleprogrammierung 
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| magigman Junior JLI'ler
 
 
 
 Anmeldedatum: 25.09.2007
 Beiträge: 87
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 06.06.2009, 15:24    Titel: direct input |   |  
				| 
 |  
				| hallo... ich habe ein problem. ich habe versucht mit direct input klarzukommen.
 mein programm lässt sich auch ohne fehler kompilieren, aber wenn ich es starte, stürtzt es direkt wieder ab.
 
 
  	  | CPP: |  	  | #include "Direct3D.h" #include "Sprite.h"
 #include <iostream>
 #include <dinput.h>
 
 
 BOOL InitDirectInput(HINSTANCE hInst);
 
 // Objekte/Speicher freigeben
 void CleanUpDirectInput(void);
 
 // Eingaben behandeln
 void ProcessInput(void);
 
 BOOL CALLBACK EnumJoystickCallback(const DIDEVICEINSTANCE* pDInstance, LPVOID lpContext);
 
 // Anwendungsfenster erzeugen
 HWND CreateMainWindow(HINSTANCE hInstance);
 
 // Callback Funktion zur Nachrichtenbehandlung
 LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
 
 // Das Fensterhandle
 HWND hWnd = 0;
 
 int Weapon = 0;
 
 const char* FILE_NAME = "SuperFlash.png";
 const char* FILE_COAT = "Mantel1.png";
 const char* FILE_COAT2 = "Mantel2.png";
 const char* FILE_HEAD;
 const char* FILE_GLASSES;
 const char* PRIMARY_WEAPON;
 const char* SECONDARY_WEAPON;
 const char* NEAR_WEAPON = "Messer1.png";
 const char* NEAR_WEAPON2 = "Messer2.png";
 const char* FILE_NAME2 = "SuperFlashl.png";
 const char* FILE_NAME3 = "city1.png";
 // Sprite-Position
 int x = 500;
 int y = 0;
 int a = -5;
 int Energy = 10000;
 FILE *Datei;
 FILE *Life;
 FILE *Exp;
 FILE *Level;
 
 char Puffer[6];
 int Leben = 1000;
 int XP = 0;
 int Stufe = 1;
 
 char *String;
 
 int xx = 0;
 int yy = 0;
 int aa = xx + 1024;
 
 LPDIRECTINPUT8 lpDI = NULL;
 
 LPDIRECTINPUTDEVICE8 lpDIKeyboard = NULL;
 
 
 // Instanz der Klasse CDirect3D
 CDirect3D Direct3D;
 
 // Instanz der Klasse CSprite
 CSprite Sprite;
 CSprite Mantel;
 CSprite Knife;
 
 // DateinaCSprite Mantelme des Sprite
 // Windows main-Funktion
 int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 int nCmdShow)
 {
 
 
 // Fenster erzeugen und Handle speichern
 hWnd = CreateMainWindow(hInstance);
 
 // Wenn der Rueckgabewert 0 ist, ist ein Fehler aufgetreten
 if(0 == hWnd)
 {
 MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
 return -1;
 }
 
 // Direct3D initialisieren
 if(!Direct3D.Init(hWnd, FALSE))
 {
 return -1;
 }
 
 if(!InitDirectInput(hInstance))
 {
 MessageBox(0, "Fehler bei der Initialisierung von DirectInput", "Fehler", MB_OK);
 return -1;
 }
 
 // Farbe die beim Loeschen verwendet werden soll
 Direct3D.SetClearColor(D3DCOLOR_XRGB(0, 0, 0));
 
 Direct3D.SetBackground(FILE_NAME3, xx, yy, aa);
 
 Sprite.SetPosition(x, y);
 
 Sprite.Create(Direct3D.GetDevice(), FILE_NAME);
 
 Mantel.SetPosition(x, y);
 
 Mantel.Create(Direct3D.GetDevice(), FILE_COAT);
 
 Knife.SetPosition(x, a);
 
 Knife.Create(Direct3D.GetDevice(), NEAR_WEAPON);
 
 // Struktur, in der Informationen zur Nachricht gespeichert werden
 MSG msg = { 0 };
 
 while(msg.message != WM_QUIT)
 {
 if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 else
 {
 ProcessInput();
 }
 CleanUpDirectInput();
 
 Sprite.SetPosition(x, y);
 
 Knife.SetPosition(x, a);
 
 Mantel.SetPosition(x, y);
 // Zeichnen des Sprites
 Mantel.Draw();
 Knife.Draw();
 Sprite.Draw();
 
 
 
 Datei = fopen("Energylog.txt", "r");
 while(!feof(Datei))
 {
 fgets(Puffer,6,Datei);
 Direct3D.DrawText(Puffer, 80, 10, 0xFFFF0000);
 }
 fclose(Datei);
 Direct3D.DrawText("Energy: ", 10, 10, 0xFFFF0000);
 Direct3D.EndScene();
 }
 
 // Rueckgabewert an Windows
 return 0;
 }
 
 
 
 // Fenster erzeugen
 HWND CreateMainWindow(HINSTANCE hInstance)
 {
 WNDCLASSEX wndClass =
 {
 sizeof(WNDCLASSEX),                                 // Groesse angeben
 CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile
 MessageHandler,                                     // Callback-Funktion
 0,                                                  // Zusaetzliche Angaben
 0,                                                  // nicht benoetigt
 hInstance,                                          // Anwendungsinstanz
 LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
 LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
 (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weisser Pinsel
 NULL,                                               // kein Menue
 "WindowClass",                                      // Der Name der Klasse
 LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
 };
 
 // Klasse registrieren
 RegisterClassEx(&wndClass);
 
 return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
 "WindowClass",          // Klassenname
 "BattleOfHeroes",          // Fenstertitel
 WS_OVERLAPPEDWINDOW |   // Fenster
 WS_VISIBLE,             // Eigenschaften
 50, 50,                 // Anfangsposition
 1024, 768,  // und Groesse des Fensters
 NULL,                   // Handle des Elternfensters
 NULL,                   // Handle des Menues
 hInstance,              // Anwendungsinstanz
 NULL);                  // wird nicht benoetigt
 }
 
 
 // Diese Funktion wird von Windows aufgrufen, wenn
 // eine Nachricht fuer Ihr Programm vorliegt
 LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 // testen, um welche Nachricht es sich handelt
 switch(msg)
 {
 // Programm beenden, wenn das Fenster
 // geschlossen wird
 case WM_DESTROY:
 PostQuitMessage(0);
 return 0;
 break;
 
 case WM_KEYDOWN:
 switch(wParam)
 {
 // Bei F1 einen Screenshot speichern
 case VK_F1:
 Direct3D.CreateScreenshot("c:\\screenshot.bmp");
 break;
 
 // Wenn ESC gedrueckt, Programm beenden
 case VK_ESCAPE:
 DestroyWindow(hWnd);
 break;
 }
 break;
 }
 // Standardnachrichtenverarbeitung von Windows
 return DefWindowProc(hwnd, msg, wParam, lParam);
 }
 
 BOOL InitDirectInput(HINSTANCE hInst)
 {
 // DirectInput8-Objekt anlegen
 if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION,
 IID_IDirectInput8, reinterpret_cast<void**>(&lpDI), NULL)))
 {
 MessageBox(hWnd, "Fehler beim Anlegen des DirectInput8-Objekts", "Fehler", MB_OK);
 return FALSE;
 }
 
 // Geraet fuer die Tastatur festlegen
 if(FAILED(lpDI->CreateDevice(GUID_SysKeyboard, &lpDIKeyboard, NULL)))
 {
 MessageBox(hWnd, "Fehler beim Anlegen des Tastatur-Geraets", "Fehler", MB_OK);
 return FALSE;
 }
 
 // c_dfDIKeyboard ist eine vordefinierte Variable
 if(FAILED(lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard)))
 {
 MessageBox(hWnd, "Fehler beim Setzen des Datenformats", "Fehler", MB_OK);
 return FALSE;
 }
 
 // Kooperationsebene festlegen
 if(FAILED(lpDIKeyboard->SetCooperativeLevel(hWnd, DISCL_FOREGROUND |
 DISCL_NONEXCLUSIVE)))
 {
 MessageBox(hWnd, "Fehler beim Setzen des Kooperationsebene (DirectInput)", "Fehler", MB_OK);
 return FALSE;
 }
 
 // Zugang zur Tastatur verschaffen
 lpDIKeyboard->Acquire();
 
 return TRUE;
 }
 
 
 void ProcessInput(void)
 {
 // alle Tasten der Tastatur
 bool bKeyboard[256];
 
 int y = 20; int x = 20;
 
 if(FAILED(lpDIKeyboard->GetDeviceState(sizeof(bKeyboard), (LPVOID)&bKeyboard)))
 {
 // die Tastatur wurde zwischenzeitlich
 // durch eine andere Anwendung genutzt
 // Kontrolle wiederholen
 lpDIKeyboard->Acquire();
 return;
 }
 
 // die gedrueckte Taste ausgeben
 if(bKeyboard[DIK_LEFT])
 {
 Beep(100,100);
 }
 }
 
 
 void CleanUpDirectInput(void)
 {
 if(NULL != lpDIKeyboard)
 {
 lpDIKeyboard->Unacquire();
 lpDIKeyboard->Release();
 lpDIKeyboard = NULL;
 }
 
 if(NULL != lpDI)
 {
 lpDI->Release();
 lpDI = NULL;
 }
 }
 
 | 
 
 danke bereits im vorraus
 _________________
 Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
 |  |  
		| Nach oben |  |  
		|  |  
		| Maxim Senior JLI'ler
 
 
 
 Anmeldedatum: 28.03.2004
 Beiträge: 249
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 07.06.2009, 00:08    Titel: |   |  
				| 
 |  
				| Hallo, versuche mit Debugger die Absturzzeile zu finden. Dann kann man weiter schauen.
 Möglicherweise liegt es gar nicht an DI.
 
 MfG
 |  |  
		| Nach oben |  |  
		|  |  
		| magigman Junior JLI'ler
 
 
 
 Anmeldedatum: 25.09.2007
 Beiträge: 87
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 07.06.2009, 11:44    Titel: |   |  
				| 
 |  
				| wenn ich ProcessInput() weglasse, funktioniert es...  _________________
 Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
 |  |  
		| Nach oben |  |  
		|  |  
		| Maxim Senior JLI'ler
 
 
 
 Anmeldedatum: 28.03.2004
 Beiträge: 249
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 07.06.2009, 12:40    Titel: |   |  
				| 
 |  
				| Hallo, du kannst mit einem Debugger genau anschauen ob dein DI-Device-Zeiger gültig ist ect. und das bringt dich viel weiter als nur Zeilen im Code auskommentieren.
 Also dein lpDIKeyboard-Zeiger ist nach dem ersten Durchlauf der Hauptschleife nicht mehr gültig, weil du in der der Hauptschleife CleanUpDirectInput(); aufrufst.
 
 MfG
 |  |  
		| Nach oben |  |  
		|  |  
		| DirectXer Dark JLI'ler
 
  
 
 Anmeldedatum: 05.02.2005
 Beiträge: 1201
 Wohnort: Köln
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 07.06.2009, 14:11    Titel: |   |  
				| 
 |  
				| außerdem siehst du dann ggf fehlermeldungen in der ausgabe unten die sehr hilfreich sein können. sonst kannst du das debug-level hochstellen. auch der andere thread hier direkt unter dir (problem) enthält schon hinweise wie dus angehen kannst ;) |  |  
		| Nach oben |  |  
		|  |  
		| magigman Junior JLI'ler
 
 
 
 Anmeldedatum: 25.09.2007
 Beiträge: 87
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 07.06.2009, 14:41    Titel: |   |  
				| 
 |  
				| danke es funktioniiiieeeert!!!!1  _________________
 Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
 |  |  
		| Nach oben |  |  
		|  |  
		| magigman Junior JLI'ler
 
 
 
 Anmeldedatum: 25.09.2007
 Beiträge: 87
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 07.06.2009, 17:36    Titel: |   |  
				| 
 |  
				| mhhh... es funktioniert zwar, aber wenn ich ein sprite bewege, hängt es manchmal und zieht eine spur hinter sich her, die erst nach sekunden verschwindet. _________________
 Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
 |  |  
		| Nach oben |  |  
		|  |  
		| fkrauthan Junior JLI'ler
 
  
 Alter: 34
 Anmeldedatum: 10.04.2005
 Beiträge: 96
 Wohnort: Germering
 Medaillen: Keine
 
 
 |  |  
		| Nach oben |  |  
		|  |  
		| magigman Junior JLI'ler
 
 
 
 Anmeldedatum: 25.09.2007
 Beiträge: 87
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 08.06.2009, 14:00    Titel: |   |  
				| 
 |  
				|  	  | Zitat: |  	  | schau dir die grundlagen zu DirectX und einer Spiele Schleife nochmal an Wink | 
 ???
 _________________
 Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
 |  |  
		| Nach oben |  |  
		|  |  
		| fkrauthan Junior JLI'ler
 
  
 Alter: 34
 Anmeldedatum: 10.04.2005
 Beiträge: 96
 Wohnort: Germering
 Medaillen: Keine
 
 
 |  |  
		| Nach oben |  |  
		|  |  
		| magigman Junior JLI'ler
 
 
 
 Anmeldedatum: 25.09.2007
 Beiträge: 87
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 09.06.2009, 12:57    Titel: |   |  
				| 
 |  
				| hab´s schon hinbekommen danke!!! *CLOSED* _________________
 Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 Deutsche Übersetzung von phpBB.de
 |