Seite 1 von 2

Sporadische Events von Keyboardreleased

Verfasst: 26.09.2006 18:08
von Alves
Hi, da bin ich mal wieder mit auch mal was Code.

Also bei mir ist es so, dass ich mehrere Bilder nacheinander anzeigen lasse, so ähnlich wie Powerpoint.

Mit Pfeil Links und Rechts lässt sic hdie Bildid verändern, also Bild davor, näxchstes Bild.

Bloß reagiert Keyboardreleased sehr sporadisch auf die EIngaben, irgendwelche Vorschläge?

Code: Alles auswählen

Enumeration
  #bild1
  #bild2
  #bild5
  #bild3
  #bild4
EndEnumeration  

Global bildid
Global bildx
Global bildx
Global zaehler

bild1.s="C:\hallotestordner\hallo.bmp"
bild2.s="C:\hallotestordner\hallo2.bmp"
bild3.s="C:\hallotestordner\hallo3.bmp"
bild4.s="C:\hallotestordner\hallo4.bmp"
bild5.s="C:\hallotestordner\hallo5.bmp"
zaehler=1
mouse=0

InitSprite()
InitMouse()
InitKeyboard()

OpenScreen(1024, 768, 32, "Die Simpsons - Kurzreferat") 

LoadSprite(#bild1, bild1)
LoadSprite(#bild2, bild2)
LoadSprite(#bild3, bild3)
LoadSprite(#bild4, bild4)
LoadSprite(#bild5, bild5)

Repeat
  Select zaehler
    Case 1
      bildid = #bild1
    Case 2
      bildid = #bild2
    Case 3
      bildid = #bild3
    Case 4
      bildid = #bild4
    Case 5
      bildid = #bild5
  EndSelect
          
  bildx = 1024-SpriteWidth(bildid)
  bildx = bildx/2
  bildy = 768-SpriteHeight(bildid)
  bildy = bildy/2
  
  
  ExamineMouse()
  ExamineKeyboard()
  ClearScreen(0,0,0)
  DisplayTransparentSprite(bildid, bildx, bildy)
  FlipBuffers()
  
  

  If KeyboardReleased(#PB_Key_Right)
    zaehler+1
  ElseIf KeyboardReleased(#PB_Key_Left)
    zaehler-1
  EndIf  
  
  ;Delay(0)
  
Until KeyboardPushed(#PB_Key_Escape)  
   
  
PS: Ja, zu Testzwecken benutze ich gern das Wort "hallo" :freak:

Verfasst: 26.09.2006 18:10
von roherter
benutze Getasynckeystate_() ,werte müsste ich nachschlagen sag bescheid wenn du sie brauchst
:)

Verfasst: 26.09.2006 18:10
von DarkDragon
Ist mir vor kurzem auch aufgefallen in PB 4

Verfasst: 26.09.2006 18:21
von Kaeru Gaman
> benutze Getasynckeystate_()

auf gar keinen Fall!

wozu gibts 'ne Keyboard-Lib.



@Alves

probier mal, auf das Push zureagieren statt auf das released.
natürlich musst du dann nen Flag einbaun, damits dir nich wegläuft.
außerdem solltest du Minimum und Maximum des Zählers prüfen,
ich hab dafür mal 2 konstanten ergänzt...

check doch mal, obs damit soweit funzt,
natürlich musst du am anfang des programms die Konstanten noch auf adäquate werte setzen.

Code: Alles auswählen

  If KeyboardPushed(#PB_Key_Right) And Key = 0
    Key = 1
    zaehler+1 
    If zaehler > #Zaehl_Max
      zaehler = #Zaehl_Min
    EndIf
  ElseIf KeyboardPushed(#PB_Key_Left) And Key = 0
    Key = 1
    zaehler-1 
    If zaehler < #Zaehl_Min
      zaehler = #Zaehl_Max
    EndIf
  Else
    Key = 0
  EndIf

Verfasst: 26.09.2006 18:23
von Alves
Die Werte zu Getasynckeystate habe ich, aber da habe ich wieder das gleiche Problem, was ich schon mit Keyboardreleased umgehen wollte.

Er zählt nämlich auch bei gedrückt gehalten den Zähler hoch.

Verfasst: 26.09.2006 18:26
von Kaeru Gaman
schau mal oben...

ich arbeite lieber mit Flags als mit Released, weil ich es lieber habe,
wenn mein prog gleich reagiert, nicht hinterher.

Verfasst: 26.09.2006 18:33
von Alves
Danke für deine Routine, aber sie bringt die gleichen Mögklichkeiten mit wie Keyboardpushed, allerdings mit Zaehl_Min. Sie reagiert so, als hätte sie gar keine Flags, da sie einfach mit einmal drücken die ganzen Bilder druchläuft.

Verfasst: 26.09.2006 18:37
von Kaeru Gaman
yo.. isn Flüchtigkeitsfehler drin...

mom...

[edit]
argl.. voll die denkblockade... ich hab sowas doch schon 37.000mal gemacht...

mom...

[edit2]
so, nun aber..

das elseif hatte mich etwas durcheinander gebracht...
das macht es gleich viel komplexer.
hier mal die lösung mit komplett getrennten Ifs für die beiden tasten:

Code: Alles auswählen

  If KeyboardPushed(#PB_Key_Right) 
    If Right = 0
      Right = 1
      zaehler+1 
      If zaehler > #Zaehl_Max
        zaehler = #Zaehl_Min
      EndIf
    EndIf
  Else
    Right = 0
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left) 
    If Left = 0
      Left = 1
      zaehler-1 
      If zaehler < #Zaehl_Min
        zaehler = #Zaehl_Max
      EndIf
    EndIf
  Else
    Left = 0
  EndIf 
man könnte das Flag auch in ein komplett umschließendes IF mit #PB_Key_Any einbaun,
wenn man immer nur eine taste zur zeit drücken kann...

so is aber irgendwie klarer und übersichtlicher.

(edit: copyfehler korrigiert)

Verfasst: 26.09.2006 18:47
von mk-soft
KeyboardPushed(#PB_Key_Left) ist kein einmaliges ereignis, sonder steht solange an wie die Taste gedrückt wird.

Müste so gehen. Nicht getestet

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Left)
  If fm_left_key = 0 ; Flankenmerker
    x + 1
    fm_left_key = 1 ; Flankenmerker setzen
  EndIf
EndIf
If KeyboardPushed(#PB_Key_Left) = 0
  If fm_left_key
    fm_left_key = 0 ; Flankenmerker rücksetzen
  EndIf
EndIf
FF :wink:

Edit: zu langsam

Verfasst: 26.09.2006 18:48
von Kaeru Gaman
@mk

genau.

schau dir mein 2tes edit an.

ist praktisch genauso wie deines, bis darauf, dass anstatt des zweiten If ein Else auch reicht... ;)