JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=147b5b0a21a68b63eabe96ce5fc1b39bMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

direct input

 
Neues Thema eröffnen   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
magigman
Junior JLI'ler



Anmeldedatum: 25.09.2007
Beiträge: 87

Medaillen: Keine

BeitragVerfasst am: 06.06.2009, 15:24    Titel: direct input Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 07.06.2009, 00:08    Titel: Antworten mit Zitat

Hallo,
versuche mit Debugger die Absturzzeile zu finden. Dann kann man weiter schauen.
Möglicherweise liegt es gar nicht an DI.

MfG
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
magigman
Junior JLI'ler



Anmeldedatum: 25.09.2007
Beiträge: 87

Medaillen: Keine

BeitragVerfasst am: 07.06.2009, 11:44    Titel: Antworten mit Zitat

wenn ich ProcessInput() weglasse, funktioniert es... Rolling Eyes
_________________
Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 07.06.2009, 12:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 07.06.2009, 14:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magigman
Junior JLI'ler



Anmeldedatum: 25.09.2007
Beiträge: 87

Medaillen: Keine

BeitragVerfasst am: 07.06.2009, 14:41    Titel: Antworten mit Zitat

danke es funktioniiiieeeert!!!!1 Very Happy
_________________
Wer einen Rechtschreibefehler findet, darf ihn behalten, in ein Regal stellen und jedem der vobei geht sagen, dass ER ihn gefunden hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
magigman
Junior JLI'ler



Anmeldedatum: 25.09.2007
Beiträge: 87

Medaillen: Keine

BeitragVerfasst am: 07.06.2009, 17:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 08.06.2009, 07:27    Titel: Antworten mit Zitat

schau dir die grundlagen zu DirectX und einer Spiele Schleife nochmal an Wink
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
magigman
Junior JLI'ler



Anmeldedatum: 25.09.2007
Beiträge: 87

Medaillen: Keine

BeitragVerfasst am: 08.06.2009, 14:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 08.06.2009, 19:20    Titel: Antworten mit Zitat

so wies dasteht meine ich das auch^^ Ohja und evt Dubble Buffering mal anschauen^^ könnte helfen^^
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
magigman
Junior JLI'ler



Anmeldedatum: 25.09.2007
Beiträge: 87

Medaillen: Keine

BeitragVerfasst am: 09.06.2009, 12:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum