JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Maus Tasten gehen Nicht !!!

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 12.10.2009, 20:22    Titel: Maus Tasten gehen Nicht !!! Antworten mit Zitat

ich kapier nicht genau warum aber ich hab alles aus dem Buch übernommen, trotzdem geht es nicht um die Maustasten erkennen zu können Reicht da dieser Befehl ?

Code:

case DIMOFS_BUTTON0:
                MouseInput += MOVE_FIRE;
            break;

        case DIMOFS_BUTTON1:
                MouseInput += MOVE_FIRE;
            break;


Könnt ihr mir irgendwie helfen ???

Gruß Robin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.10.2009, 15:48    Titel: Antworten mit Zitat

Zeig mal mehr Code.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 13.10.2009, 18:22    Titel: Antworten mit Zitat

ok hier ist die gesammte Inputmanager.cpp

CPP:
#include "InputManager.h"
#include "global.h"
#include <cstdio>

CInputManager::CInputManager(void)
{
    m_CurrentDevice = 0;
    m_lpDI = NULL;
    m_lpDIDevice = NULL;
}

CInputManager::~CInputManager()
{
    // Eingabegeraet freigeben
    if(NULL != m_lpDIDevice)
    {
        m_lpDIDevice->Unacquire();
        m_lpDIDevice->Release();
        m_lpDIDevice = NULL;
    }

    // DirectInput8-Objekt freigeben
    if(NULL != m_lpDI)
    {
        m_lpDI->Release();
        m_lpDI = NULL;
    }
}


BOOL CInputManager::Init(HWND hWnd, HINSTANCE hInst, int Device)
{
    m_CurrentDevice = Device;

    // DirectInput8-Objekt anlegen
    if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION,
                                 IID_IDirectInput8, reinterpret_cast<void**>(&m_lpDI), NULL)))
    {
        MessageBox(hWnd, "Fehler beim Anlegen des DirectInput8-Objekts", "Fehler", MB_OK);
        return FALSE;
    }

    // gewaehltes Geraet initialisieren
    switch(m_CurrentDevice)
    {
        case USE_KEYBOARD:
                return initKeyboard(hWnd);
            break;
        case USE_MOUSE:
                return initMouse(hWnd);
            break;
        case USE_JOYSTICK:
                return initJoystick(hWnd);
            break;
        default:
                m_CurrentDevice = USE_KEYBOARD;
                return initKeyboard(hWnd);
    }
    return TRUE;
}

int CInputManager::GetInput(void)
{
    // Eingabe des gewaehlten Geraets zurueckgeben
    if(USE_MOUSE == m_CurrentDevice)
    {
        return getMouseInput();
    }
    else if(USE_JOYSTICK == m_CurrentDevice)
    {
        return getJoystickInput();
    }
    else
    {
        return getKeyboardInput();
    }

    return 0;
}


int CInputManager::getKeyboardInput(void)
{
       // alle Tasten der Tastatur
        char     buffer[256];

        if(FAILED(m_lpDIDevice->GetDeviceState(sizeof(buffer), (LPVOID)&buffer)))
        {
            // die Tastatur wurde zwischenzeitlich
            // durch eine andere Anwendung genutzt
            // Kontrolle wiederholen
            m_lpDIDevice->Acquire();
            return 0;
        }

        // bestimmen welche Taste gedrueckt wurde
        // und Tastenkombination zurueckgeben
        int Keys = 0;

        if(buffer[DIK_A])
        {
            Keys += MOVE_LEFT;
        }
        else if(buffer[DIK_D])
        {
            Keys += MOVE_RIGHT;
        }

        if(buffer[DIK_SPACE])
        {
            Keys += MOVE_JUMP;
        }

        if(buffer[DIK_LSHIFT])
        {
            Keys += MOVE_RUN;
        }
        if(buffer[DIK_W])
        {
            Keys += MOVE_FORWARD;
        }
        else if(buffer[DIK_S])
        {
            Keys += MOVE_BACKWARD;
        }
        if(buffer[DIK_NEXT])
        {
            Keys += TURN_DOWN;
        }
        else if(buffer[DIK_PRIOR])
        {
            Keys += TURN_UP;
        }

        if(buffer[DIK_L])
        {
            Keys += SUN;
        }

        if(buffer[DIK_R])
        {
            Keys += LVL;
        }

        return Keys;
}

int CInputManager::getJoystickInput(void)
{
    int JoystickInput = 0;

    DIJOYSTATE2 JoystickState;

    // Poll aufrufen, um Daten abfragen zu koennen
    if(FAILED(m_lpDIDevice->Poll()))
    {
        // wenn ein Fehler auftriff, Joystick zurueckfordern
        m_lpDIDevice->Acquire();
        return 0;
    }

    // Joystick-Status (Achsenposition, Knoepfe, ... abfragen)
    m_lpDIDevice->GetDeviceState(sizeof(JoystickState), &JoystickState);


    // der Wert fuer die X- und Y-Achse wird jeweils auf 1000 gesetzt
    // sobald der Joystick eine Position, die 1/3 (333 = TOLERANCE)
    // in eine Richtung abweicht einnimmt, wird dies als Bewegung interpretiert

    if(JoystickState.lX < -JOY_TOLERANCE)
    {
        JoystickInput += TURN_LEFT;
    }
    else if(JoystickState.lX > JOY_TOLERANCE)
    {
        JoystickInput += TURN_RIGHT;
    }

    if(JoystickState.lY < -JOY_TOLERANCE)
    {
        JoystickInput += TURN_UP;
    }
    else if(JoystickState.lY > JOY_TOLERANCE)
    {
        JoystickInput += TURN_DOWN;
    }

    // testen, ob ein Knopf gedrueckt wurde
    for(int i=0;i<128;i++)
    {
        if(JoystickState.rgbButtons[i])
        {
            JoystickInput += MOVE_FIRE;
            break;
        }
    }

    return JoystickInput;
}

int CInputManager::getMouseInput(void)
{
    DWORD NumElements = 1;
    DIDEVICEOBJECTDATA data;
    ZeroMemory(&data, sizeof(data));

    if(FAILED(m_lpDIDevice->GetDeviceData(sizeof(data), &data, &NumElements, 0)))
    {
        m_lpDIDevice->Acquire();
        return 0;
    }

    int MouseInput = 0;

    int Movement = data.dwData;


    if (data.dwOfs == DIMOFS_BUTTON0)
    {
         MouseInput += MOVE_FIRE;
         return MouseInput;
    }

    // bestimmen, in welche Richtung die Mouse bewegt wurde
    // und ob eine Mouse-Taste gedrueckt wurde
    switch(data.dwOfs)
    {
        case DIMOFS_X:
                if(Movement < 0)
                {
                    MouseInput += TURN_LEFT;
                }
                else
                {
                    MouseInput += TURN_RIGHT;
                }
            break;

        case DIMOFS_Y:
                if(Movement < 0)
                {
                    MouseInput += TURN_UP;
                }
                else
                {
                    MouseInput += TURN_DOWN;
                }
            break;

        case DIMOFS_BUTTON0:
            if(data.dwData)
            {
                    MouseInput += MOVE_FIRE;
                    MessageBox(0, "Hier ist Maaaaaaaaaaa du Arsch aufgetreten", "Fehler", MB_OK);
            }
            break;

        case DIMOFS_BUTTON1:
            if(data.dwData)
            {
                MouseInput += MOVE_FIRE;
            }
            break;
    }

    return MouseInput;
}

BOOL CInputManager::initKeyboard(HWND hWnd)
{

    // Geraet festlegen
    if(FAILED(m_lpDI->CreateDevice(GUID_SysKeyboard, &m_lpDIDevice, NULL)))
    {
        MessageBox(hWnd, "Fehler beim Anlegen des Geraets", "Fehler", MB_OK);
        return FALSE;
    }

    // c_dfDIKeyboard ist eine vordefinierte Variable
    if(FAILED(m_lpDIDevice->SetDataFormat(&c_dfDIKeyboard)))
    {
        MessageBox(hWnd, "Fehler beim Setzen des Datenformats", "Fehler", MB_OK);
        return FALSE;
    }

    // Kooperationsebene festlegen
    if(FAILED(m_lpDIDevice->SetCooperativeLevel(hWnd, DISCL_FOREGROUND |
                                                     DISCL_NONEXCLUSIVE)))
    {
        MessageBox(hWnd, "Fehler beim Setzen des Kooperationsebene (DirectInput)", "Fehler", MB_OK);
        return FALSE;
    }

    // Zugang zur Tastatur verschaffen
    m_lpDIDevice->Acquire();

    return TRUE;
}


BOOL CInputManager::initMouse(HWND hWnd)
{
 // Geraet fuer die Mouse festlegen
    if(FAILED(m_lpDI->CreateDevice(GUID_SysMouse, &m_lpDIDevice, NULL)))
    {
        MessageBox(hWnd, "Fehler beim Anlegen des Geraets", "Fehler", MB_OK);
        return FALSE;
    }

    // c_dfDIMouse ist eine vordefinierte Variable
    if(FAILED(m_lpDIDevice->SetDataFormat(&c_dfDIMouse)))
    {
        MessageBox(hWnd, "Fehler beim Setzen des Datenformats", "Fehler", MB_OK);
        return FALSE;
    }

    // Kooperationsebene festlegen
    if(FAILED(m_lpDIDevice->SetCooperativeLevel(hWnd, DISCL_FOREGROUND |
                                                  DISCL_NONEXCLUSIVE)))
    {
        MessageBox(hWnd, "Fehler beim Setzen des Kooperationsebene (DirectInput)", "Fehler", MB_OK);
        return FALSE;
    }

    // Eigenschaften fuer das Geraet setzen (Puffergroesse)
    DIPROPDWORD DIProperties;
    ZeroMemory(&DIProperties, sizeof(DIProperties));
    DIProperties.diph.dwSize       = sizeof(DIPROPDWORD);
    DIProperties.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    DIProperties.diph.dwObj        = 0;
    DIProperties.diph.dwHow        = DIPH_DEVICE;
    // Puffer groesse festlegen
    DIProperties.dwData            = 16;

    // Puffergroesse fuer Mouseeingaben setzen
    m_lpDIDevice->SetProperty(DIPROP_BUFFERSIZE, &DIProperties.diph);

    // Zugang zur Mouse verschaffen
    m_lpDIDevice->Acquire();
    return TRUE;
}


BOOL CInputManager::initJoystick(HWND hWnd)
{
    GUID JoyGUID;
    if(FAILED(m_lpDI->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoystickCallback,
                                &JoyGUID, DIEDFL_ATTACHEDONLY)))
    {
       MessageBox(hWnd, "Fehler beim Abzaehlen der Eingabegeraete", "Fehler", MB_OK);
       return FALSE;
    }

    // Versuchen den Joystick einzurichten,
    if(FAILED(m_lpDI->CreateDevice(JoyGUID, &m_lpDIDevice, NULL)))
    {
        MessageBox(hWnd, "Fehler beim Anlegen des Geraets", "Fehler", MB_OK);
        return FALSE;
    }

    // c_dfDIJoystick2 ist eine vordefinierte Variable
    if(FAILED(m_lpDIDevice->SetDataFormat(&c_dfDIJoystick2)))
    {
        MessageBox(hWnd, "Fehler beim Setzen des Datenformats", "Fehler", MB_OK);
        return FALSE;
    }

    // Kooperationsebene festlegen - Joystickeingaben sind nur fuer dieses
    // Programm bestimmt und koennen exklusiv nur fuer dieses Programm genutzt werden.
    if(FAILED(m_lpDIDevice->SetCooperativeLevel(hWnd, DISCL_FOREGROUND |
                                                   DISCL_EXCLUSIVE)))
    {
        MessageBox(hWnd, "Fehler beim Setzen des Kooperationsebene (DirectInput)", "Fehler", MB_OK);
        return FALSE;
    }

    // Joystick-Bereich bestimmen
    DIPROPRANGE JoystickRange;
    ZeroMemory(&JoystickRange, sizeof(JoystickRange));
    JoystickRange.diph.dwSize       = sizeof(JoystickRange);
    JoystickRange.diph.dwHeaderSize = sizeof(DIPROPHEADER);

    // Setzen der Werte fuer die X-Achse
    JoystickRange.diph.dwObj        = DIJOFS_X;
    JoystickRange.diph.dwHow        = DIPH_BYOFFSET;
    JoystickRange.lMin              = -1000;
    JoystickRange.lMax              =  1000;

    // DIPROP_RANGE - Bereich der Achsen
    if(FAILED(m_lpDIDevice->SetProperty(DIPROP_RANGE, &JoystickRange.diph)))
    {
        MessageBox(hWnd, "Fehler beim Setzen der Joystickeigenschaften (X-Achse)", "Fehler", MB_OK);
        return FALSE;
    }

    // Setzen der Werte fuer die Y-Achse (gleiche Werte wie fuer X)
    JoystickRange.diph.dwObj        = DIJOFS_Y;

    if(FAILED(m_lpDIDevice->SetProperty(DIPROP_RANGE, &JoystickRange.diph)))
    {
        MessageBox(hWnd, "Fehler beim Setzen der Joystickeigenschaften (X-Achse)", "Fehler", MB_OK);
        return FALSE;
    }

    // Zugang zum Joystick verschaffen
    m_lpDIDevice->Acquire();

    return TRUE;
}


BOOL CALLBACK CInputManager::EnumJoystickCallback(const DIDEVICEINSTANCE* pDInstance, LPVOID lpContext)
{
    // die GUID des gefundenen Geraets kopieren
    memcpy(lpContext, &pDInstance->guidInstance, sizeof(pDInstance->guidInstance));

    // ansonsten wird dieser (als erstes gefundener) Joystick verwendet
    return DIENUM_STOP;
}


Edit(Kampfhund): Code-Tags durch cpp-Tags ersetzt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 33
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 13.10.2009, 22:25    Titel: Antworten mit Zitat

Also eine Sache, die an diesem Code sehr verdächtig ist, ist dass du switch benutzt um die Werte von data.dwOfs zu prüfen. So weit ich das Verstehe wird data.dwOfs als Bitfield verwendet (also ein 32-bit integer in dem bis zu 32 boolsche Werte gespeichert werden). Mit switch und case überprüfst du auf Gleichheit, das heißt du kommst nur zu den entsprechenden Anweisungen wenn ausschließlich das entsprechende Bit im Bitfield auf 1 steht. Wenn mehrere der Bits gesetzt sind (d.h. mehrere Zustände gleichzeitig gegeben sind), dann wird keine der Bedingungen eintreffen.

Versuch stattdessen mal sowas:
CPP:
if(data.dwOfs|DIMOFS_X){
                if(Movement < 0)
                {
                    MouseInput += TURN_LEFT;
                }
                else
                {
                    MouseInput += TURN_RIGHT;
                }
}
if(data.dwOfs|DIMOFS_Y){
                if(Movement < 0)
                {
                    MouseInput += TURN_UP;
                }
                else
                {
                    MouseInput += TURN_DOWN;
                }
}
if(data.dwOfs|DIMOFS_BUTTON0){
            if(data.dwData)
            {
                    MouseInput += MOVE_FIRE;
            }
}
if(data.dwOfs|DIMOFS_BUTTON1){
            if(data.dwData)
            {
                MouseInput += MOVE_FIRE;
            }
}

_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 14.10.2009, 13:47    Titel: Antworten mit Zitat

es funktioniert nicht.... hab das gefühl ob das programm dies:

Code:

int CInputManager::getMouseInput(void) {

// ...

}


garnicht benutzt da ich dort überall messageboxen hinmachen kann und dann nichts im programm erscheint...

Gruß Robin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 33
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 15.10.2009, 00:05    Titel: Antworten mit Zitat

Na dann prüf mal ob du CInputManager::GetInput() irgendwo aufrufst und ob die Bedingung USE_MOUSE == m_CurrentDevice erfüllt ist Wink .

Übrigens: Wenn du das mit Messageboxen debuggst hast du wohl noch nicht den Umgang mit dem Debugger raus. Wenn du Visual Studio benutzt ist das ansich ganz einfach und sehr nützlich. Klick in der grauen Leiste links neben deinem Quellcode irgendwo hin so dass dort ein roter Punkt erscheint. Das sind Haltepunkte. Dann führe dein Programm durch drücken von F5 im Debug Modus aus. Sobald der Code, bei einem der Haltepunkte ausgeführt wird, wird das Programm angehalten und der Quellcode in den Vordergrund geholt. Du kannst dann mit F10 und F11 schrittweise durch den Code gehen oder die Ausführung des Programms mit F5 fortsetzen. Wenn das Programm gerade gehalten ist kannst du auch in dem Fenster "Überwachen", das standardmäßig links unten zu finden ist, die momentanen Werte von Variablen sehen. Damit solltest du eigentlich schnell herausfinden können weshalb GetMouseInput() nicht aufgerufen wird.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 31.10.2009, 23:46    Titel: Antworten mit Zitat

kp......habs nicht hinbekommen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung 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