  | 
				
					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 
 |