Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

11

10.08.2008, 22:18

Aber laut MSDN nicht an der ShowCursor() Funktion.

Zitat

[in] Specifies whether the internal display counter is to be incremented or decremented. If bShow is TRUE, the display count is incremented by one. If bShow is FALSE, the display count is decremented by one.


=> Nimm das Ding aus der Schleife bzw veränder den Zustand nur dann, wenn du das auch wirklich brauchst. Für zweiters schaust du dir nochmal die MSDN Seite zu GetAsyncKeyState an!

Edit: Ausserdem würde so eine Änderung die Abwärtskompatabilität doch wohl sehr stark in Mitleidenschaft gezogen haben ... An dieses Verhalten hab ich mich irgendwie auch nicht mehr erinnert. Hab das vermutlich immer nur bei wirklichem Bedarf verändert.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

12

10.08.2008, 23:13

Probier mal folgendes:

[cpp]
if((GetAsyncKeyState(VK_SPACE) & 0x8001) != 0)
ShowCursor(false);
else
ShowCursor(true);

Das sollte den Cursor einschalten, Wenn die Taste unten ist und sie das beim letzten aufruf noch nicht war.

PS: Sry fürs vorsagen^^

Socke

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

13

10.08.2008, 23:24

Spielverderber ^^

Aber wo wir grad beim "Spoilern" sind: Er hätte auch halt den Sichtbarkeitszustand des Cursors in einer Variable speichern und ne "eigene" ShowCursor() Funktion schreiben können, die halt nur was ändert wenn der geforderte "neu" Zustand anders als der "ist" Zustand ist. Die kann er dann von egal wo aufrufen und sich sicher sein, dass nix querschießt.

Und man kann sich allgemein auch per GetCursorInfo() bzw die PCURSORINFO Struktur informieren, ob der Cursor gerade sichtbar ist.

14

13.08.2008, 02:41

Erstmal danke an alle, für eure Hilfestellungen :)
Ich hab mir die Bit-Operationen nochmals angesehen und allmälich dämmerts mir ;)
Bezüglich dem GetAsyncKeyState:
Wenn ich das richtig verstanden habe steht das letzte Bit für den aktuellen Zustand der Taste (Gedrückt == 1 Nicht-Gedrückt == 0).
Das erste Bit wird gesetzt wenn die Taste beim letzten Aufruf noch _nicht_ gedrückt war, richtig? Für was sind den alle andern 14 Bits? Kann man damit auch noch was anfangen?

@Socke
Bei deinem Code Vorschlag

Quellcode

1
2
3
4
if((GetAsyncKeyState(VK_SPACE) & 0x8001) != 0)
ShowCursor(false);
else
ShowCursor(true);

werd ich aber dennoch nicht ganz schlau. Weil so ist ja die erste Bedingung wahr, auch wenn das erste Bit auf 0 gesetzt ist. Ist das letze Bit gesetzt ( 1000 0000 0000 0000), Ist der Wert != 0 und demnach true. Das erste Bit fällt da ja gar nicht ins Gewicht, solange das letzte Bit auf 1 steht.
Oder begehe ich nen Überlegungsfehler?

Zitat von »"unsigned long"«

Jonathan_Klein
Nonsens. Sein Problem ist, er erkennt nicht das "else" in seiner "Schleife". Das ist alles.

Kannst du das etwas genauer erklären, wie du das meinst?
Das "else" wird ja einfach dann aufgerufen, wenn die "if" Bedingug nicht zutrifft (in diesem Fall hat es ja keine weitere "else if" Bedingugen)
die "if" Bedingug ist ja an GetasyncKeyState gekoppelt. Würde diese "if" Bedingung greifen, obschon die Taste gar nicht gerückt ist, dann würde sich das bei allen andern Tastenabfragen ja ebenfalls bemerkbar machen (Ich habe die gesammte Tastaturabfrage auf diese Weise realisiert).
"Erkennen" muss er aber eines von beidem. Entweder "if" oder "else".
Oder meinst du was anderes?

15

23.08.2008, 19:02

Das ist Win-Api, stimmts?

Warum dann nicht mit WM_KEYDOWN?

So hier halte ich mal einen Vortrag: GetAsyncKeyState ist NICHT gedacht für eine Tastenabfrage in deinem Sinn, die Funktion liefert dir ungefähr 1000 * JA zurück wenn du sie so aufrufst, weil bei jedem durchlauf geprüft wird, ob die Taste gedrückt IST.

Bei WM_KEYDOWN (fügt man unter oder über WM_PAINT oder sonstwohin in die case abfrage in die CALLBACK funktion ein) wird geprüft, ob die taste gedrückt IST, also du bekommst entweder 1 * JA, oder 1 * NEIN zurück, der code ist glaub ich so (ich mach kein win-api mehr)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
case WM_KEYDOWN
{
      switch(wParam)
      {
             case VK_SPACE
               // blablabla

              break;
           
             // Hier kann man noch mehrere Abfragen einfügen

       }
}
break;
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

16

23.08.2008, 23:31

Vllt. ließt du einfach mal, was bereits in Post 8 (7. Antwort) von mir geschrieben wurde. Danke! :roll:
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

17

24.08.2008, 13:32

Zitat von »"Arrows"«


Das ist Win-Api, stimmts?

Ja, richtig.

Zitat von »"Arrows"«


Warum dann nicht mit WM_KEYDOWN?

Weil das WM_KEYDOWN-Erreigniss vom eingestellten "Tastatur-Interval" abhängig ist und es zudem etwas umständlicher ist, Daten in die Callback Funktion zu bekommen (Stichwort Globale Variabeln)

Zitat


So hier halte ich mal einen Vortrag: GetAsyncKeyState ist NICHT gedacht für eine Tastenabfrage in deinem Sinn, die Funktion liefert dir ungefähr 1000 * JA zurück wenn du sie so aufrufst, weil bei jedem durchlauf geprüft wird, ob die Taste gedrückt IST.

Die Funktion GetAsyncKeyState liefert nicht 1000 * JA zurück, sondern eine short Bitmaske nachdem sie aufgerufen wurde - und das genau einmal. Es ist auch der Sinn, das die Inputabfrage in _jedem_ Schleifendurchgang durchgeführt wird.

Zitat


Bei WM_KEYDOWN (fügt man unter oder über WM_PAINT oder sonstwohin in die case abfrage in die CALLBACK funktion ein) wird geprüft, ob die taste gedrückt IST, also du bekommst entweder 1 * JA, oder 1 * NEIN zurück, der code ist glaub ich so (ich mach kein win-api mehr)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
case WM_KEYDOWN
{
      switch(wParam)
      {
             case VK_SPACE
               // blablabla

              break;
           
             // Hier kann man noch mehrere Abfragen einfügen

       }
}
break;

Dieses Verfahren ist für nahezu jedes Spiele-Programm, oder ein Programm dass änliche/gleiche Anspürche an die Input-Abfrage stellt suboptimal.
Edit:
Obwohl du das zugegebenermassen nicht wissen kannst, da ich diesbezüglich nicht genau gesagt habe um was es geht...

Zitat von »"Deviloper"«

Vllt. ließt du einfach mal, was bereits in Post 8 (7. Antwort) von mir geschrieben wurde. Danke! :roll:

An wen war das jetzt gerichtet? ^^

Wäre trotzdem nice, wenn jemand die eine oder andere Antwort auf meine noch offenen Fragen hat :)

Werbeanzeige