Joystick-Abfrage innerhalb eines Timers

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Rick_72

Betreff: Joystick-Abfrage innerhalb eines Timers

BeitragSa, Aug 29, 2009 0:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen!

Mein Jump&Run läuft innerhalb eines Timers zB mit 50Hz.

Der Joystick, der eine Spielfigur steuert, wird zyklisch 50mal pro Sekunde abgefragt, entsprechende Aktionen abgeleitet (zB Figur nach rechts) und der Bildschirm anschliessend neu aufgebaut.

So weit, so gut. Probleme tauchen beim Feuerknopf auf: steht die Figur vor einem Schalter und drückt man den Feuerknopf, so soll der Schalter betätigt werden *aber nur einmal!* Was zur Zeit aber passiert ist, dass der Schalter 50mal in der Sekunde umgeschaltet wird (das ist ja auch logisch, denn ich frage den Joystick in jedem timer-Zyklus neu ab). Wegen des Timers kann ich auf WaitJoy etc. nicht zurückgreifen. Störe ich den Timer, zerhaut's auch den Bildschirmaufbau.

Habt ihr eine Idee, wie man das in den Griff bekommt? Wie kann ich den Feuerknopf sozusagen entprellen? Einmal Drücken soll den Schalter einmal umschalten.

Vielen Dank!


___________
Blitz3D V1.99

mpmxyz

BeitragSa, Aug 29, 2009 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm...
Kann es sein, dass du GetJoy gebrauchen kannst?
Wenn du mal nach einem Befehl suchst, dessen Name dir nicht einfällt, kann ich dir die Hilfe nur empfehlen.

mfG
mpmxyz

Edit: Dieser Code sollte auch ganz hilfreich sein:
BlitzBasic: [AUSKLAPPEN]
Schuss=(JoyDown(Knopf)<>0) Or (JoyHit(Knopf)<>0)

Dadurch kannst du die Möglichkeiten von "JoyDown" und "JoyHit" kombinieren.
  • Zuletzt bearbeitet von mpmxyz am Sa, Aug 29, 2009 0:40, insgesamt 2-mal bearbeitet

M0rgenstern

BeitragSa, Aug 29, 2009 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Machst du das ganze mit Joydown?

Wenn ja dann versuchs einfach mal mit Joyhit.

Lg, M0rgenstern

Rick_72

BeitragSa, Aug 29, 2009 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze JoyDown() für die Abfrage. Um das Problem zu verdeutlichen mal ein PseudoCode:

Code: [AUSKLAPPEN]


schalter = 0
tile = 0

Repeat
   
   WaitTimer(timer)
   
   Cls
   
   If JoyDown(1) Then
      If schalter=1 Then schalter=0 Else schalter=1
   EndIf
   
   If schalter Then
      If tile=0 Then tile=1 Else tile=0
      DrawImage Animation,10,10,tile+1
   EndIf
   
Until KeyHit(1)


Die Animation hat zwei Bilder, die abwechselnd gezeigt werden (tile=0, tile=1) - das ist aber unwichtig für das Problem.

Es ist mit diesem Code nicht möglich, die Animation sauber ein-bzw. auszuschalten. Da JoyDown(1) in der Frequenz des Timers abgefragt wird, geht nach einem Knopfdruck die Animation beliebig an und aus.

Das muss doch besser gehen! Aber wie??

Nicdel

BeitragSa, Aug 29, 2009 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Von JoySticks hab ich keine Ahnung, aber das hier:

Code: [AUSKLAPPEN]
If schalter=1 Then schalter=0 Else schalter=1


ist so geschickter:

Code: [AUSKLAPPEN]
schalter = 1-schalter
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Rick_72

BeitragSa, Aug 29, 2009 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
GetJoy()! Gerade mal GetJoy() in den Code eingeflickt. Scheint besser zu funktionieren. Ich werde diese Version mal austesten.

Bis dahin schon mal Danke für Eure Antworten!

Rick_72

BeitragSa, Aug 29, 2009 10:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicdel hat Folgendes geschrieben:
Von JoySticks hab ich keine Ahnung, aber das hier:

Code: [AUSKLAPPEN]
If schalter=1 Then schalter=0 Else schalter=1


ist so geschickter:

Code: [AUSKLAPPEN]
schalter = 1-schalter


Dewegen schrieb ich ja "PseudoCode". Ich wollte ja auch nur zeigen, dass der Timer die Joystick-Abfrage "stört". Und damit man sofort versteht, was der Schalter macht, ist eine If-Anweisung hilfreicher - finde ich.
Trotzdem Danke für den Hinweis! Du hast natürlich völlig Recht, so würde man das nicht programmieren.

hazumu-kun

BeitragSa, Aug 29, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
JoyHit
Ist dein Freund.
Da wird nur einmal drauf reagiert, bzw nur der Hit nicht das Down gezählt.

Anders würde es so gehen, wenn dein Joystick an sich schon sehr schlimmes kontaktprellen hat.

BlitzBasic: [AUSKLAPPEN]

timerfreq= 60

timer= CreateTimer (timerfreq)
While Not KeyHit (1)
; Bildschirmaufbau

If JoyDown(blabla) And (Not joy_pressed) Then
drücke_schalter ()
joy_pressed= 1
ElseIf (Not JoyDown(blabla)) And joy_pressed Then
count= count+1
EndIf

If count> 500/timerfreq ;count muss größer sein als timerzyklen für 500ms nötig sind
count= 0
joy_pressed= 0
EndIf

WaitTimer (timer)
Wend
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group