|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Gast Gast
|
Verfasst am: 23.08.2002, 10:53 Titel: MousePosition |
|
|
Hi,
ich bin gerade bei Kapitel 20.4.1 (also DirectInput) und möchte dieses Mouse-Polling benutzen...es funzt ja auch alles nur steht da nicht wie ich die MouseKoordinaten rausbekomme...man kriegt immer nur den unterschied zur vorherigen position. Wenn ich aber jetzt ein Bild über den Mousezeiger malen will und die Startposition nicht gleich ist, dann ist der Mauszeiger und das Bild immer verschoben.
Gibt es also eine Möglichkeit die Koordinaten der Maus zu bekommen? |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 23.08.2002, 11:03 Titel: |
|
|
Versuchs mal mit Kapitel 12.3 <
Maus Nachrichten, da kannse mit GDI die Aktuelle Mausposition entnehmen < _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 11:20 Titel: |
|
|
Wenn du bei DirectInput bleiben willst, folgender Vorschlag:
Verstecke den Orginal-Mauszeiger am Programmbeginn und hole ihn erst zum Beenden wieder vor. Zeichne desweiteren ein Sprite, das du an die Maus-Input-Routine anschließt...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
Zuletzt bearbeitet von AFE-GmdG am 27.11.2002, 22:32, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Gast Gast
|
Verfasst am: 23.08.2002, 13:42 Titel: MousePosition |
|
|
Danke für die Antworten...
Ich habs jetzt erstmal mit GDI gemacht, weil ich hoffe, dass die Geschwindigkeit reicht.
Noch ne Frage zu Cursors:
Kennt jemand von euch ein Programm mit dem mann stink normale aber farbige Cursors macht? (Ich möchte kein Bild haben ) |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 14:17 Titel: |
|
|
Paintbrush
Datei 32x32 Pixel groß machen, und als *.cur speichern... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 23.08.2002, 15:17 Titel: |
|
|
wieso paintbrush , mit Visual C++ geht das doch auch unter Ressourcen ...
hab mir sogar ein schwarzen Cursoar eingefügt _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 16:56 Titel: |
|
|
Aber ich glaube nicht wirklich Farbig, oder?
Mit Paintbrush kann er auf 16,7 Millionen Farben zugreifen...
Dafür haperts an der Transparenz und der Punktpositionierung
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Hasenfuß Senior JLI'ler
Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 24.08.2002, 08:46 Titel: |
|
|
AFE-GmdG hat Folgendes geschrieben: |
Verstecke den Orginal-Mauszeiger am Programmbeginn und hole ihn erst zum Beenden wieder vor.
AFE-GmdG |
Wie macht man des? Und ausserdem kann mann doch in den Einstellungen von der Funktion CreateWindow(oder so) schon nen anderen Cursor angeben oder? |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 24.08.2002, 09:01 Titel: |
|
|
MSDN => ShowCursor(BOOL Visible);
Man kann bei CreateWindow einen Cursor angeben, der für das aktuelle Fenster verwendet wird.
Aber ich meinte so einn Mousecursor wie er z.B. in Dungeon Keeper (1 oder 2), in Black&White oder so verwendet wird, also ein voll animiertes Sprite, das statt dem simplen Zeiger verwendet wird. Außerdem ist man dann nicht auf 32x32 Pixel beschränkt...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Hasenfuß Senior JLI'ler
Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 24.08.2002, 09:15 Titel: |
|
|
Aso. An sowas hab ich in meiner Bescheidenheit gar nich gedacht!! |
|
Nach oben |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 26.11.2002, 18:23 Titel: |
|
|
AFE: ich würde nicht sagen, dass die Cursors von Dungeon Keeper und Black&White Sprites sind, sondern viel mehr 3D-Models. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 27.11.2002, 06:51 Titel: |
|
|
Es ist doch egal, ob der Mauszeiger, der angezeigt wird ein 3D-Modell ist, oder "nur" ein flaches, animiertes Sprite.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Revil Senior JLI'ler
Anmeldedatum: 28.07.2002 Beiträge: 242
Medaillen: Keine
|
Verfasst am: 28.11.2002, 18:22 Titel: |
|
|
hmm ich hab mir für mein spiel einen ingame editor gebastelt... funktioniert auch alles ganz gut soweit, nur leider "schwimmt" die maus ziemlich, also sie reagiert total träge... das nervt wenn man größere level bauen will... hat jemand ne ahnung woran das liegen kann?
Ich benutze in etwa diesen code (etwas vereinfacht):
Init:
Code: |
//Maus
lpDI->CreateDevice(GUID_SysMouse,&lpDIMouse, NULL);
lpDIMouse->SetDataFormat(&c_dfDIMouse);
lpDIMouse->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
// c_dfDIKeyboard ist eine vordefinierte Variable
if(FAILED(lpDIMouse->SetDataFormat(&c_dfDIMouse)))
{
Error("Fehler bei der Initalisierung von DirectInput! Maus Init fehlgeschlagen!");
}
DIPROPDWORD DIProperties;
//Puffer intialisieren
ZeroMemory(&DIProperties,sizeof(DIProperties));
DIProperties.diph.dwSize = sizeof(DIPROPDWORD);
DIProperties.diph.dwHeaderSize = sizeof(DIPROPHEADER);
DIProperties.diph.dwObj = 0;
DIProperties.diph.dwHow = DIPH_DEVICE;
//Puffergröße setzen
DIProperties.dwData = 16;
lpDIMouse->SetProperty(DIPROP_BUFFERSIZE,&DIProperties.diph);
|
Mausabfrage
Code: |
///MAUS
DWORD NumElements = 1;
DIDEVICEOBJECTDATA data;
ZeroMemory(&data,sizeof(data));
if(FAILED(lpDIMouse->GetDeviceData(sizeof(data),&data,&NumElements,0)))
{
lpDIMouse->Acquire();
return;
}
///MAUS!!!
if(data.dwOfs == DIMOFS_X)
{
MouseX+=data.dwData;
}
if(data.dwOfs == DIMOFS_Y)
{
MouseY+=data.dwData;
}
if(data.dwOfs == DIMOFS_BUTTON0)
{
if(data.dwData)
{
int tilexpos = (MouseX - Scroller1.ScrollerX())/32;
int tileypos = (MouseY - Scroller1.ScrollerY())/32;
SpielFeld[tilexpos][tileypos].CreateTile(tilexpos,tileypos,TileStyle); //MouseClick!
}
}
|
am anfang hab ich MouseX und MouseY global als int's initialisiert und auf je 200 gesetzt so das die maus am anfang so ziemlich rechts oben ist...
In meiner Renderfunktion, blitte ich dann ein Sprite an der Position...
edit: hm ich zähl jetzt das doppelte von data.dwData zur aktuellen mausposition, dadurch wird die maus etwas agiler, allerdings ist es immer noch nicht perfekt.. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 28.11.2002, 19:31 Titel: |
|
|
Das Problem ist allgemein geschildert ein DirectX-Puffer-Problem.
Als ich für meine Gestenabfrage mit der Maus rumgespielt habe ist mir folgendes aufgefallen:
Bewegt man die Maus GENAU nach oben oder nach unten wird nur 1 Y-Ereignis erstellt - alles klar also. Wird nur GENAU nach rechts oder links bewegt wird nur ein X-Ereignis erstellt - ebenfalls alles in Ordnung. Wenn die Maus nun aber schräg bewegt wird, werden 2 Ereignisse erstellt, eines wo nur ein X-Wert verändert wird und eines nur für den Y-Wert. Mit einem Normalem Puffer von 1, wird der 2. Wert verschluckt - die Maus kann im Extremfall nur Horizontal bewegt werden. Wird der Puffer größer vergisst er zwar nichts, aber du fragst nicht alle gepufferten Zustände ab, sondern nur einen. Erst wenn die Maus erneut bewegt wird, wird ein neues Ereignis ausgelöst - aber du erhältst noch die alten Ereignisse aus dem Puffer.
Lösung: Bei jedem Mausereignis überprüfen, wie viele Ereignisse im Puffer vorliegen und ALLE auslesen. Erst danach lohnt sich ein neuzeichnen des Cursors an der passenden Stelle.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Revil Senior JLI'ler
Anmeldedatum: 28.07.2002 Beiträge: 242
Medaillen: Keine
|
Verfasst am: 28.11.2002, 20:32 Titel: |
|
|
sehr gut, das sollte mein Problem lösen! Ich hab nicht drangedacht das der Puffer ja dann überschrieben wird...
Danke vielmals!!! |
|
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
|