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