Probleme mit Keyboard

Für allgemeine Fragen zur Programmierung mit PureBasic.
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag von Max. »

ts-soft hat geschrieben:@Max
und meins von 1:00

sind 30 Sekunden zu lang :?:
Willkommen auf der Erde, Fremdling! Wir nennen die Zeitspanne von 0 Uhr 30 bis 1 Uhr 00

30 Minuten :mrgreen:
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 »

wie auch immer, diskussionen über antwortzeiten im board sind hier wohl eher Bild

@max

stattgegeben. es ist fraglich, ob ein einfacher wechsel auf einzelnen tastendruck korrekt funktioniert, selbst mit delay(50) oder einer anderen zeitsteuerung.

allerdings sollte auch das keyboardreleased von dem ersten und einzigen examine abgefragt werden. wie du ja richtig angemerkt hast, läuft die schleife normalerweise mehrfach während eines tastendrucks durch.

hier mal rohcode aus dem handgelenk:

Code: Alles auswählen

ExamineKeyboard()

If KeyboardPushed(Taste) And Flag = 0
    ...Aktion...
    Flag = 1
EndIf

If KeyboardReleased(Taste)
    Flag = 0
EndIf
IMHO ist dies die klassische lösung, im sinne von überschaubarem Programmierstil.

man sollte sich nicht scheuen, flags zu benutzen. diese sollten ruhig auch Long sein, für die performance (32bit Vars für 32bit CPU). immer dran denken: auch ein rechner mit 256MB Ram hat 'ne auslagerungsdatei für alle fälle.

ausserdem hat ein Long auch 'nur' 4 Byte, das bedeutet du müsstest schon 256 Flags benutzen, um ein einziges Kilobyte zu verbraten.
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:wie auch immer, diskussionen über antwortzeiten im board sind hier wohl eher Bild

@max

stattgegeben. es ist fraglich, ob ein einfacher wechsel auf einzelnen tastendruck korrekt funktioniert, selbst mit delay(50) oder einer anderen zeitsteuerung.

allerdings sollte auch das keyboardreleased von dem ersten und einzigen examine abgefragt werden. wie du ja richtig angemerkt hast, läuft die schleife normalerweise mehrfach während eines tastendrucks durch.

hier mal rohcode aus dem handgelenk:

Code: Alles auswählen

ExamineKeyboard()

If KeyboardPushed(Taste) And Flag = 0
    ...Aktion...
    Flag = 1
EndIf

If KeyboardReleased(Taste)
    Flag = 0
EndIf
IMHO ist dies die klassische lösung, im sinne von überschaubarem Programmierstil.
Durchaus möglich, dass man auf ExamineKeyboard() öfters verzichten kann - oder es sogar "falsch" ist, wenn man es streng nimmt.

Ich habe nur versucht, den Text aus der Hilfe zu interpretieren:
Syntax

ExamineKeyboard()
Description

Update the keyboard state. It must be called before using the KeyboardInkey(), KeyboardPushed() or KeyboardReleased() commands.
Ist IMO mißverständlich. Es steht nirgends, dass es nur einmal aufgerufen werden muß, aber ok... kann diskutiert werden.

Der erste Satz ließ mich dann Richtung "doch vor jedem Keyboard-relevanten Aufruf verwenden" tendieren... schliesslich möchte ich ja den upgedateten Zustand...
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 »

natürlich muss das nicht nur einmal aufgerufen werden, ich persönlich halte es lediglich für übersichtlicher, es nur einmal zu tun.
wenn man es z.B. in einer entwicklungsphase mal auskommentieren möchte, sucht man sich nen wolf, wenns mehrfach in einer schleife steht.

examine ermittelt den momentanen status, dieser kann dann mit beliebig vielen 'pushed' und 'released' interpretiert werden.

> Deine Beiträge klingen desöfteren besserwisserisch.

ja, sorry :oops: , ich weiss es, aber manchmal kann ich nicht wirklich was dagegen tun, ich bin nunmal ein mensch, der seine ansichten recht leidenschaftlich vertritt :wink: es ist niemals bös' gemeint.

in diesem fall war es eigentlich unwichtig dass du schneller warst, und einen vorschlag gemacht hast, der meinem stilempfinden zuwiderläuft.
das Neuling ihn dann aber angenommen hat, und das vielleicht nur deshalb, weil ich nicht auchnoch den anfang das progs reingepatched hab, hat mich dann halt doch ein bisschen gefuchst.

das war dann eigentlich der grund, warum ich die diskussion von zaun gebrochen hab, weil ich finde, das man sich von anfang an einen überschaubaren programmierstil zulegen sollte.

[edit] und um nochmal besserwisserisch zu klingen :wink: : zitieren bitte nicht immer vollständige posts, sondern nur den satz, auf den du bezug nimmst.
Zuletzt geändert von Kaeru Gaman am 25.11.2004 15:48, insgesamt 1-mal geändert.
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:natürlich muss das nicht nur einmal aufgerufen werden, ich persönlich halte es lediglich für übersichtlicher, es nur einmal zu tun.
wenn man es z.B. in einer entwicklungsphase mal auskommentieren möchte, sucht man sich nen wolf, wenns mehrfach in einer schleife steht.

examine ermittelt den momentanen status, dieser kann dann mit beliebig vielen 'pushed' und 'released' interpretiert werden.
Bist Du sicher? Ist nicht böse gemeint, aber mit KeyboardPushed lagst Du falsch.
> Deine Beiträge klingen desöfteren besserwisserisch.

ja, sorry :oops: , ich weiss es, aber manchmal kann ich nicht wirklich was dagegen tun, ich bin nunmal ein mensch, der seine ansichten recht leidenschaftlich vertritt :wink: es ist niemals bös' gemeint.

in diesem fall war es eigentlich unwichtig dass du schneller warst, und einen vorschlag gemacht hast, der meinem stilempfinden zuwiderläuft.
das Neuling ihn dann aber angenommen hat, und das vielleicht nur deshalb, weil ich nicht auchnoch den anfang das progs reingepatched hab, hat mich dann halt doch ein bisschen gefuchst.

das war dann eigentlich der grund, warum ich die diskussion von zaun gebrochen hab, weil ich finde, das man sich von anfang an einen überschaubaren programmierstil zulegen sollte.
Sorry, habe ich auch gleich wieder rauseditiert. Schließlich müssten wir dann der fairness halber auch diskutieren, dass ich arrogant klinge. :lol:
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 »

na klasse... jetzt steht hier 'n kommentar von mir zu etwas, was du garnicht mehr drinstehen hast :cry: ( :lol: )

ich denke wir alle klingen mal besserwisserisch oder arrogant. guck dir nur die anderen threads an (z.B. Danilo vs. Freedimension).
ich finde das sogar normal, wenn kreative leute, die die gleiche entwicklungsumgebung benutzen und unterschiedliche ansichten haben, mal so klingen.

solange keiner überenpfindlich ist und sich zu schnell auf den schlips getreten fühlt, ist das ja auch in ordnung. :mrgreen:

also max, hoffentlich könne wir uns noch oft freundschaftlich fetzen :wink:

achja... und bitte sparsamer zitieren :wink:

[EDIT]

> Bist Du sicher? Ist nicht böse gemeint, aber mit KeyboardPushed lagst Du falsch.

öh, wie jetzt? hast du meinen codeschnipsel mal eingebaut und getestet?
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:na klasse... jetzt steht hier 'n kommentar von mir zu etwas, was du garnicht mehr drinstehen hast :cry: ( :lol: )
[/quote]

Siehste, die Antwortzeiten sind doch erheblich. :lol:
öh, wie jetzt? hast du meinen codeschnipsel mal eingebaut und getestet?
Ja, sowohl auf dem PC siehe Sig, als auch auf meinem Centrino Notebook. Verhält sich nicht wessentlich besser als der Ur-Code und auf alle Fälle unvorhersehbar.
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
PBNeuling
Beiträge: 4
Registriert: 25.11.2004 00:57

Beitrag von PBNeuling »

Ich wollte mich bei euch allen nochmal bedanken für euere schnelle
hilfe, Bin ja Neuling und nicht so erfahren in PureBasic kommt Zeit
kommt Rat...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@PBNeuling
ist gar kein thema. imo ist dieses forum dafür auch da.

@Max.
also, ich weiss ja nicht, was du da verbrochen hast, wie hast du denn meinen codeschnipsel eingebaut?
vielleicht zeigst du deinen kompletten code mal, bei mir läufts nämlich absolut einwandfrei.

hier mal tutto completti:

Code: Alles auswählen

InitKeyboard()      ;Inits not checked,
InitSprite()        ;I simply demand DX
OpenScreen(1024,768,32,"KeyTest")

UseJPEGImageDecoder()
TransparentSpriteColor(-1,0,0,0)
LoadSprite(0,"1.jpg",0)
LoadSprite(1,"2.jpg",0)
LoadSprite(2,"3.jpg",0)

Flag.l
x.l = 489
y.l = 371
Face = 0

Repeat

    ExamineKeyboard()
    ClearScreen(0,0,0)
    DisplayTransparentSprite(Face,x,y)

    If KeyboardPushed(#PB_Key_Up)
        y-4:If y<-13 : y=755 : EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Down)
        y+4:If y>755 : y=-13 : EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Left)
        x-4:If x<-13 : x=1011 : EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Right)
        x+4:If x>1011 : x=-13 : EndIf
    EndIf

    If KeyboardPushed(#PB_Key_Space) And Flag = 0
        Face+1 : If Face > 2 : Face = 0 : EndIf
        Flag = 1
    EndIf
    If KeyboardReleased(#PB_Key_Space) : Flag = 0 : EndIf
    FlipBuffers()
    
Until KeyboardPushed(#PB_Key_Escape)
hab extra noch andere keyboard-abfragen eingebaut, um das vollständig auszutesten.

PS: um deiner frage vorzubeugen: ja, ich habe das auch mit einer cursor-taste anstelle von space getestet. der code ist einwandfrei (*besserwiss*,*protz*) :wink:
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:@PBNeuling
ist gar kein thema. imo ist dieses forum dafür auch da.

@Max.
also, ich weiss ja nicht, was du da verbrochen hast, wie hast du denn meinen codeschnipsel eingebaut?
vielleicht zeigst du deinen kompletten code mal, bei mir läufts nämlich absolut einwandfrei.

hier mal tutto completti:

Code: Alles auswählen

InitKeyboard()      ;Inits not checked,
InitSprite()        ;I simply demand DX
OpenScreen(1024,768,32,"KeyTest")

UseJPEGImageDecoder()
TransparentSpriteColor(-1,0,0,0)
LoadSprite(0,"1.jpg",0)
LoadSprite(1,"2.jpg",0)
LoadSprite(2,"3.jpg",0)

Flag.l
x.l = 489
y.l = 371
Face = 0

Repeat

    ExamineKeyboard()
    ClearScreen(0,0,0)
    DisplayTransparentSprite(Face,x,y)

    If KeyboardPushed(#PB_Key_Up)
        y-4:If y<-13 : y=755 : EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Down)
        y+4:If y>755 : y=-13 : EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Left)
        x-4:If x<-13 : x=1011 : EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Right)
        x+4:If x>1011 : x=-13 : EndIf
    EndIf

    If KeyboardPushed(#PB_Key_Space) And Flag = 0
        Face+1 : If Face > 2 : Face = 0 : EndIf
        Flag = 1
    EndIf
    If KeyboardReleased(#PB_Key_Space) : Flag = 0 : EndIf
    FlipBuffers()
    
Until KeyboardPushed(#PB_Key_Escape)
hab extra noch andere keyboard-abfragen eingebaut, um das vollständig auszutesten.

PS: um deiner frage vorzubeugen: ja, ich habe das auch mit einer cursor-taste anstelle von space getestet. der code ist einwandfrei (*besserwiss*,*protz*) :wink:
Rofl, sorry, Du hast doch echt einen an der Waffel oder bist unglaublich dreist.

Ja, klingt feindselig. Ist auch so gemeint, bis Du wenigstens ansatzweise mal mas verbnünftiges Beiträgst. :allright:

Und nein, Deinen Stuss quote ich jetzt auch komplett - der Vollständigkeit halber. Aber nun mal schön langsam mit den alten Pferden.

1. Was ich vebrochen habe? _Deinen_ Code zu verwenden.

Nur zur Erinnerung; das war der Ausgangspunkt:

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) 
Nun hast Du ja Deine gesamte Brainpower in die Waagschale geworfen, erinnerst Du Dich?

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)
Du hast ja auch schön erklärt, was man tun soll:
(der anfang bis incl openscreen bleibt)
AH JA. Mach mer doch mal:

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)
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)
Einverstanden? Ok...

Nun... der Code ist leider Schrott. Ich habe auch versucht zu ergründen, woran das liegt. Hast Du wohl leider nicht verstanden.

Aber macht nix, Du hast ja was Neues auf die Beine gestellt - ne, den Code quote ich jetzt nicht. Aber das ist wohl das Übelste was seit langem zu sehen war.

Bau einfach mal in jede Abrage ne Zählvariable ein und lass das Program auf einem halbwegs schnellen Rechner laufen:

Code: Alles auswählen

Repeat

    ExamineKeyboard()
    ClearScreen(0,0,0)
    DisplayTransparentSprite(Face,x,y)

    If KeyboardPushed(#PB_Key_Up)
        y-4:If y<-13 : y=755 : EndIf
        Keyup+1
    EndIf
    If KeyboardPushed(#PB_Key_Down)
        y+4:If y>755 : y=-13 : EndIf
        Keydown+1
    EndIf
    If KeyboardPushed(#PB_Key_Left)
        x-4:If x<-13 : x=1011 : EndIf
        Keyleft+1
    EndIf
    If KeyboardPushed(#PB_Key_Right)
        x+4:If x>1011 : x=-13 : EndIf
        keyright+1
    EndIf

    If KeyboardPushed(#PB_Key_Space) And Flag = 0
        Face+1 : If Face > 2 : Face = 0 : EndIf
        Flag = 1
    EndIf
    If KeyboardReleased(#PB_Key_Space) : Flag = 0 : EndIf
    FlipBuffers()
   
Until KeyboardPushed(#PB_Key_Escape)

Debug keyup
Debug keydown
Debug keyleft
Debug keyright
Ne, ehrlich. Wenn ich das sehe, frage ich mich ob Du überhaupt nen PB Compiler hast. :lol:
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Antworten