Seite 2 von 4

Verfasst: 25.11.2004 11:09
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:

Verfasst: 25.11.2004 15:07
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.

Verfasst: 25.11.2004 15:20
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...

Verfasst: 25.11.2004 15:33
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.

Verfasst: 25.11.2004 15:48
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:

Verfasst: 25.11.2004 15:54
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?

Verfasst: 25.11.2004 16:05
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.

Verfasst: 25.11.2004 20:31
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...

Verfasst: 25.11.2004 22:19
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:

Verfasst: 26.11.2004 00:14
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: