Probleme mit Keyboard

Für allgemeine Fragen zur Programmierung mit PureBasic.
PBNeuling
Beiträge: 4
Registriert: 25.11.2004 00:57

Probleme mit Keyboard

Beitrag von PBNeuling »

Hallo,


Ich bin schon fast am verzweifeln, Hier mein Problem, Ich möchte
wenn ich die Up Taste drücke das immer der nächste Sprite auf den
Bildschirm angezeigt wird. Hier meinen Code

Code: Alles auswählen

UseJPEGImageDecoder()

If InitSprite() = 0                                               
  MessageRequester("Fehler","Konnte dx nicht finden",0)        
EndIf                                                        

If InitKeyboard()=0                                               ;
 
  MessageRequester("Fehler","Konnte dx nicht finden",0)           ; 
EndIf                                                          

If OpenScreen(1024,768,32,"Vollbild") = 0                          ;
  MessageRequester("Fehler","Konnte kein Vollbild erstellen ",0) 
EndIf                                                
LoadSprite(0,"C:\s\Folie1.jpg",#PB_Sprite_Memory)
   

Repeat                                               
  ExamineKeyboard() 
  FlipBuffers()  And  ClearScreen(0,0,0)
  DisplaySprite(0,-1,-1)                         
  If  KeyboardPushed( #PB_Key_Up) 
    FreeSprite(0)
    LoadSprite(0,"C:\s\Folie2.jpg",#PB_Sprite_Memory)  
EndIf
    If KeyboardPushed(#PB_Key_Up)
    LoadSprite(0,"C:\s\Folie3.jpg",#PB_Sprite_Memory)  
    EndIf  
    Until KeyboardPushed(#PB_Key_Escape)             


Folie3 wird nie Angezeigt obwoll ich auf Up Drücke..

de Andy..

Edit by NicTheQuick: Code-Tags gesetzt
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag von Max. »

KeyboardPushed stoppt nicht den Ablauf Deines Programmes.

Ich habe mich mit den "Game" Libs noch nie richtig beschäftigt, aber so sollte es funktionieren:

Code: Alles auswählen

UseJPEGImageDecoder()

If InitSprite() = 0
MessageRequester("Fehler","Konnte dx nicht finden",0)
EndIf

If InitKeyboard()=0 ;

MessageRequester("Fehler","Konnte dx nicht finden",0) ;
EndIf

If OpenScreen(1024,768,32,"Vollbild") = 0 ;
MessageRequester("Fehler","Konnte kein Vollbild erstellen ",0)
EndIf
LoadSprite(0,"C:\s\Folie1.jpg",#PB_Sprite_Memory)

i=1
Repeat

FlipBuffers() And ClearScreen(0,0,0)
DisplaySprite(0,-1,-1)

ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up )

  i=i+1
  If i>3
    i=1
  EndIf
  FreeSprite(0)
  LoadSprite(0,"C:\s\Folie"+Str(i)+".jpg",#PB_Sprite_Memory)
  Repeat
  ExamineKeyboard()
  Until KeyboardReleased(#PB_Key_Up)
EndIf
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape) 
Es wird also gewartet, bis der Key auch wieder losgelassen wird, um ein "Nachprellen" zu vermeiden. Oder so. :wink:

Übrigens:

Das finde ich interessant:

Code: Alles auswählen

FlipBuffers() And ClearScreen(0,0,0) 
Kann Dir keine rationale Erklärung bieten - es scheint ja zu funktionieren. Aber ich würde nicht vertrauen, dass das die verschiedenen PB Releases so bleibt...
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, da hast du einen grundsätzlichen denkfehler drin.

in deiner hauptschleife überprüfst du das keyboard (examine) und danach steht, was er bei jedem durchlauf macht, wenn UP gedrückt wird.

so wie du das geschrieben hast, reagiert er in jedem durchlauf damit, dass er sprite 2 lädt. bei dem zweiten if ist die taste schon abgefragt, und demnach passiert garnichts.

so etwas sollte man mit einer variablen lösen, die bei jedem UP hochgezählt wird.

ausserdem: LoadSprite-operationen dauern ziemlich lang. die erledigt man normalerweise am anfang direkt nach openscreen, keinesfalls in der hauptschleife.

das sprite-prinzip von DX unterscheidet sich grundsätzlich vom sprite-prinzip des C64 (mir kommt dein code so vor, als hättest du vorher aufm C64 sprites programmiert.)

die sprites von DX sind im grunde nichts anderes als textures, also kleine bitmaps, die im graka-speicher stehn, oder, wie in deinem fall, im hauptspeicher. jede dieser bitmaps kannst du beliebig oft auf dem bildschirm darstellen.

probier mal folgendes (der anfang bis incl openscreen bleibt):

Code: Alles auswählen

LoadSprite(0,"C:\s\Folie1.jpg",#PB_Sprite_Memory)
LoadSprite(1,"C:\s\Folie2.jpg",#PB_Sprite_Memory)
LoadSprite(2,"C:\s\Folie3.jpg",#PB_Sprite_Memory)

Nr.l  ; definiert variable Nr als long

Repeat
    ExamineKeyboard()
    FlipBuffers()        ; kein and hier dazwischen!
    ClearScreen(0,0,0)   ; von wem stammt das eigentlich?

    DisplaySprite(Nr,-1,-1)   ; wieso eigentlich hinter dem rand?

    If KeyboardPushed(#PB_Key_Up )
        Nr = Nr + 1
        If Nr > 2 : Nr = 0 : EndIf
    EndIf

Until KeyboardPushed(#PB_Key_Escape)
hier lädst du erst die sprites in den speicher (kannst übrigens ruhig den mode '0' benutzen, dann isses sogar schneller)

in der schleife wird nur verändert, welches sprite angezeigt wird.

[edit] ich seh grad, max hat ne antwort geschrieben während ich getippt habe.

@max:
es ist negativ für die performance, wenn du in der hauptschleife ewig wartest (er will später bestimmt noch mehr machen als ein sprite anzeigen)
es genügt vollauf, eine einzige abfrage für den key zu benutzen..

das mit dem AND muss irgendwo hier im forum rumerzählt werden.

es ist schlichtweg die falsche anwendung: ein AND an dieser stelle verknüpft die beiden rückgabewerte der funktionen. sinnvoll wäre das nur, wenn man mit IF abfragen wollte, ob sie korrekt laufen, und selbst dann sollte man das anders formulieren.

vergesst es bitte einfach. es ist nicht nur unnütz, sondern auch noch hässlich und es verstösst gegen sämtliche konventionen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
PBNeuling
Beiträge: 4
Registriert: 25.11.2004 00:57

Beitrag von PBNeuling »

Erst mal Danke für euere Antworten, Der Code von Max geht spitze
genau das habe ich gesucht.. de andy
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

FlipBuffers() And ClearScreen(0,0,0)
ist von der Syntax her völliger Blödsinn, auch wenn es Funktioniert.

ClearScreen() gibt sowie immer 0 zurück, so das das Ergebnis immer 0 sein wird

Code: Alles auswählen

FlipBuffers() : ClearScreen(0,0,0)
ist kürzer und Syntaktisch korrekt (hoffe ich)

[Edit] hat sich erledigt, drei Thread gleichzeitig während ich schreibe
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nun, für den moment mag das ok sein, ich persönlich halte ein dreifaches examine, um auf eine taste zu warten, die garnicht mehr gedrückt sein KANN (den diese information wurde ja schon abgefragt) für überflüssig. sorry.

ein mal examine am anfang der schleife
jede taste, die eine funktion haben soll, genau einmal auswerten.

wenn du das so lässt, und noch ein bisschen was dazu schreibst hier und da... dann lässt du den code zwei wochen oder vier liegen, und dann blickt keiner mehr, was da eigentlich gemacht werden soll.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag von Max. »

Kaeru Gaman hat geschrieben: @max:
es ist negativ für die performance, wenn du in der hauptschleife ewig wartest (er will später bestimmt noch mehr machen als ein sprite anzeigen)
es genügt vollauf, eine einzige abfrage für den key zu benutzen..
Setz noch ein Delay(1) in die Schleife, dann sollte es kein Problem mit der Performance geben.

Bei mir genügt es übrigens nicht, nur KeyboardPushed zu verwenden, woran auch immer das liegen mag - Geschwindigkeit des Rechners, Qualität der Tastatur. Ich würde mich allerdings wundern, wenn es nur mir so ginge...
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag von Max. »

ts-soft hat geschrieben:[Edit] hat sich erledigt, drei Thread gleichzeitig während ich schreibe
Ich weiss ja nicht, wielange Ihr über ein Posting brütet, meins ist von 0:30. 8)
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag von Max. »

Kaeru Gaman hat geschrieben:nun, für den moment mag das ok sein, ich persönlich halte ein dreifaches examine, um auf eine taste zu warten, die garnicht mehr gedrückt sein KANN (den diese information wurde ja schon abgefragt) für überflüssig. sorry.
Sorry, das ist nicht richtig. Natürlich kann sie noch gedrückt sein. Mach einfach mal Debug KeyboardPushed(#PB_Key_Up ) und probier es aus. Ich bekomme als Ergebnis durchaus auch mehrere Ausgaben, ausser wenn ich wirklich nur mit spitzen Fingern vorsichtig einmal drauftippe..

Bei "normalem" Gebrauch, sind durchaus 3 oder 4 Events drin.

Edit:

Die Schleife läuft auf meiner Kiste (rechnerisch, mit Debugger) in 2ms durch. Lässt Du die Taste nicht innerhalb der 2ms los, hast Du schon wieder einen "Treffer" auf gedrückt...
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@Max
und meins von 1:00

sind 30 Sekunden zu lang :?:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten