 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.04.2004, 10:32 Titel: Mausproblem |
|
|
Hallo erstmal an alle
Ich habe es endlich geschafft auf das Forum zu klicken, dass zu dem genialen Buch von Christian Rousselle gehört.
Aber ich habe ein Problem.
Und zwar will ich eine Mausunterstüzung, die mir nicht nur meldet das die Mausbewegt wurde, sondern mir die Koordinaten zurück gibt.
Ich habe das zur Zeit so realisiert, dass ich mir am Anfang die Koordinaten auf die Mitte setze und mir sie in einer Variable merke und immer wenn die Maus bewegt wurde, habe ich das Movement drauf addiert und natürlich geguckt, ob sie schon über die Grenze hinausgeschossen ist.
Wenn ja dann halt wieder die Koordinaten auf die Grenze setzen, aber jetzt wirkt das alles ein bissl abgehackt.
Wenn mir jemand helfen kann, würde ich mich sehr freuen, wenn ihr den Quelltext braucht, dann einfach sagen und ich poste ihn.
Und die Abfrage ob ein Button gedrückt wurde, funktioniert auch irgendwie nur halb.
Also dann vielen Dank schon einmal im Vorraus.
Ciao _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.04.2004, 11:06 Titel: |
|
|
Benutz du DirectX oder Windows Nachrichten?
Wenn du nur einen Cursor brauchst, kannst du mit zwei globalen Variablen (CursorXPos, Cursor YPos) immer die aktuelle Position speichern. Einfach in der Nachrichtenverarbtung bei jedem MOUSEMOVE die Werte neu setzen.
Wenn du DirectX benutzt, und die Mausbewegung ruckelig ist, liegt es wahrscheinlich daran, das du den Puffer nicht komplett auslist, sondern nur den letzten Eintrag. Dann würd ich anders als im Buch beschrieben GetDeviceState benutzen. Falls das dein Problem sein sollte, kann ich das noch mal näher erläutern. Ich hab ne Klasse für Diret Input mit der ich einen einfachen, aber funktionellen Cursor hab. Wenn du willst, erklär ich dir das alles mal. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.04.2004, 21:00 Titel: |
|
|
Also ich benutze DirectX und habe die Klasse aus dem Buch benutzt und dann umgeschrieben, weil diese ja nur die Bewegung gemeldet hatte.
Naja und dann hatte ich mir das halt so gemacht, dass ich mir in zwei Varibalen die alte Cursorposition gemerkt habe und wenn sich der Cursor bewegt hatte einfach die Veränderung dazu zählen.
Natürlich unter Beachtung der Bildschirmgrenzen.
Ja und nun stockt sie halt und ich wüßte nicht, wie ich mir mit DirectX einen anderen Cursor mache.
Könntest du mir mal deine Klasse vorstellen.
Und sie mir erklären, wie ich da mein Problem umgehen kann.
Ciao _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.04.2004, 21:26 Titel: |
|
|
Also das Problem ist Folgendes:
Die Klasse aus dem Buch benutz Polling und eine Puffer. In diesem schreibt DirectX alle Mausbewegungen. Wie dir aber sicher auch schon aufgefallen ist, ist das dort entweder eine Veränderung um die X oder um die Y Achse beinhaltet ist und nie beides. Das liegt daran, das zwischen den abfragen nicht nur ein neuer Puffereintrag gespeichert wird, sondern mehrere. Wenn du die Maus schräg bewegs, macht er einen Puffereintrag für die XRichtung und einen für die YRichtung. Für flüssige Bewegung musst du also nicht nur den letzten Eintrag sondern alle auslesen.
Dafür solltst du am besten überprüfen, wie viele neue einträge hinzugekommen sind. Dazu gabs hier im Forum aber schon mal ein Thread.
Das mit den Puffer ist kompliziert, aber es gibt ne Alternative. Einfach statt GetDeviceData GetDeviceState benutzen. Wurde auch im besagten Thread geklärt.
Benutz einfach mal die Forensuche und schau was du findest. Wenn du den Thread nicht finden kannst, kann ich ihn auch noch mal raussuchen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 19.04.2004, 19:34 Titel: |
|
|
Also ich habe nun schon alles bei den anderen Themen zur Maus durchprobiert, aber entweder bekamm ich eine ruckelfreie Bewegung, dann aber keine absoluten Koordinaten, oder halt anders rum.
Kannst du mir mal sagen, was ich falsch mache?
Hier meine beiden Funktionen.
Initialisierung:
Code: |
BOOL CInputManager::Init(HWND hWnd,HINSTANCE hInst,int Device)
{
m_CurrentDevice = Device;
// DirectInput8-Objekt anlegen
if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION,
IID_IDirectInput8,(void**)&m_lpDI,NULL)))
{
MessageBox(hWnd,"Fehler beim Anlegen des DirectInput8-Objekts","Fehler",MB_OK);
return FALSE;
}
// gewähltes Gerät 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;
} |
Abfragen:
Code: | int CInputManager::getMouseInput(int *mx,int *my, BOOL *mb1, BOOL *mb2)
{
DWORD NumElements = 1;
DIDEVICEOBJECTDATA data[16];
ZeroMemory(&data,sizeof(data));
HRESULT hr;
if (FAILED(m_lpDIDevice->Poll()))
{
hr = m_lpDIDevice->Acquire();
while (hr==DIERR_INPUTLOST)
hr = m_lpDIDevice->Acquire();
}
if (FAILED(m_lpDIDevice->GetDeviceData(sizeof(data[16]),data,&NumElements,0)))
{
// die Mouse wurde zwischenzeitlich
// von einer andere Anwendung genutzt
// Kontrolle wiederholen
m_lpDIDevice->Acquire();
return 0;
}
// bestimmen, in welche Richtung die Mouse bewegt wurde
// und ob eine Mouse-Taste gedrückt wurde
for (int i = 0;i< NumElements;i++)
{
switch(data[i].dwOfs)
{
case DIMOFS_X:
m_MouseX += data[i].dwData;
break;
case DIMOFS_Y:
m_MouseY += data[i].dwData;
break;
case DIMOFS_BUTTON0:
*mb1 = TRUE;
break;
case DIMOFS_BUTTON1:
*mb2 = TRUE;
break;
}
}
*mx = m_MouseX;
*my = m_MouseY;
SetCursorPos(m_MouseX,m_MouseY);
return 1;
} |
Kannst du mir sagen, wo mein Fehler liegt?
Vielen Dank. _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.04.2004, 20:28 Titel: |
|
|
SetCursorPos(...) ist eine sehr gewagte Funktion da diese recht verzögert ausgeführt wird, also der Kursor wird zwar in der Funktion anständig für das setzten auf eine ausgewählte Position vorbereitet doch bei Rechenintensiven Programmen wie DX kann es zu hässlichen Verzögerungen kommen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 20.04.2004, 08:17 Titel: |
|
|
Ja, also soll ich diese Funktion nun nicht benutzen, aber wie soll ich dann bitte den Cursor an die Start Position 0,0 zum Beispiel setzen? _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 20.04.2004, 10:48 Titel: |
|
|
Da du ja DirectX nutzt kannst du eine Cursorgrafik an die virtuelle Stelle der maus Blitten dazu erstellst du dir 2 Variablen MausX und MausY (sowas hast du glaube ich ja schon) und an diese Stelle blittest du dann deinen Cursor. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 20.04.2004, 18:30 Titel: |
|
|
Ja ich meine aber etwas anderes, denn ich muss je um absolute Koordinaten zu bekommen, am Anfang meine MausX und MausY mit Werten vorbelegen und dann den Cursor an die Stelle setzen.
Wie kann ich denn das machen, ohne die Funktion SetCursorPos?
Ciao _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 20.04.2004, 19:46 Titel: |
|
|
Beim Programmstart kannst du ohne Probleme mit SetCursorPos arbeiten, in der Schleife macht es eventuell nur Probleme. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.04.2004, 23:47 Titel: |
|
|
cih versteh nicht, wozu du es überhaupt brauchst...
a) du benutzt den windows-zeiger
du holst dir die koordinaten einfach mit GetCursorPos, da brauchst du DX im grunde gar nicht.
b) du hast einen eigenen mauszeiger
am anfang stellst du ihn auf 0, 0....initialisierst mouseX/mouseY mit 0 und veränderst die position relativ mit dem was du von DX bekommst. |
|
Nach oben |
|
 |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 21.04.2004, 19:46 Titel: |
|
|
Ja das habe ich nun gemacht und wie setze ich nun den Cursor, wenn er über die Bildschirmbegrenzung hinaus geht wieder auf die Grenze?
Kann mir nicht mal jemand seine GetInput Funktion posten, damit ich mir dass mal angucken kann, wie ihr das gamacht habt?
Ciao _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.04.2004, 21:03 Titel: |
|
|
Das ist nun wicklich primitiv einfach:
Ich glaube du denkst einfach nur zu kompliziert. So nach dem Motto den wald vor lauter Bäumen nicht sehen.
Wie hat es den wohl Christian mit den Sprites gemacht?
Wie Begrenz man denn Variablen?
if(MausXPos>SCR_WIDTH)
{
MausXPos=SCR_WIDTH;
}
if(MausXPos<0)
{
MausXPos=0;
}
das ganze natürlich auch mit den Y Koordinaten. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 21.04.2004, 22:18 Titel: |
|
|
@todesgilde: ja zeig uns mal den Code, so können wir dir wirklich besser helfen und am besten erläuterst du uns dein Problem ein wenig deutlicher, denn ich glaube nicht jeder versteht dein Problem so wie du es gerne hättest. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
todesgilde Mini JLI'ler
Anmeldedatum: 16.04.2004 Beiträge: 15 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 22.04.2004, 16:53 Titel: |
|
|
Also erstmal vielen Dank, dass ihr euch auch allen den Kopf mit zerbrecht.
Ne also erstens steht meine Version vom Quelltext schon dar und zweitens bin ich der Meinung, dass wir irgendwie an ein ander vorbei quatschen.
Das mit den Variablen begrenzen ist jawohl kein Problem.
Denn wenn ich denn Cursor bewege und er die Bildschirm Grenze errreicht hat, kann ich ihn nochweiter bewegen und genau das will ich nicht.
Na OK, oder ihr meint, dass wenn er drüber ist, soll ich einfach wieder die Koordinaten auf die Grenzen setzen.
Aber dann bewegt er sich und ist noch nicht im Bildschirm, aber die Koordinaten werden schon wieder verändert.
Versteht ihr was ich meine.
Was ist eigentlich besser GetDeviceState oder GetDeviceData?
Ciao _________________ Constantinidis Craven alias DER HEXER
Es ist nicht tot,
was ewig lebt,
bis das der Tod
die Zeit besiegt.
Constantin |
|
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
|