|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 12.10.2009, 20:22 Titel: Maus Tasten gehen Nicht !!! |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 13.10.2009, 18:22 Titel: |
|
|
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 |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 13.10.2009, 22:25 Titel: |
|
|
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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 14.10.2009, 13:47 Titel: |
|
|
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 |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 15.10.2009, 00:05 Titel: |
|
|
Na dann prüf mal ob du CInputManager::GetInput() irgendwo aufrufst und ob die Bedingung USE_MOUSE == m_CurrentDevice erfüllt ist .
Ü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 |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 31.10.2009, 23:46 Titel: |
|
|
kp......habs nicht hinbekommen |
|
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
|