Tastenabfrage funktioniert nur in eine Richtung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Lunatic

Betreff: Tastenabfrage funktioniert nur in eine Richtung

BeitragSa, Apr 19, 2008 10:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebes blitzforum,

da ich noch in der Übungsphase bin und quasi grade am Anfang stehe gibt es bei mir noch einige Peinliche Fehler. Und zwar habe ich eine Figur eingebaut die sich auf "D" nach rechts und auf "A" nach links bewegen sollte. Drückt man keine Taste bleibt er in der Richtung in die man zuletzt gelaufen ist.

Das Problem ist folgendes:
Die Taste D funktioniert Problemlos ich kann stehenbleiben und danach D drücken und er läuft. Wenn ich jedoch die Taste A drücke während ich stehe bewegt er sich keinen zentimeter. Nur wenn ich D gedrückt habe und blitzschnell kurz darauf A drücke läuft er zurück.

Ich bedanke mich schon mal im voraus.
Grüße
Lunatic
P.S. Flushkeys() wurde schon probiert.

Code: [AUSKLAPPEN]
Graphics 640, 480
SetBuffer BackBuffer()

richtung = 2
xkoord = 0
ykoord = 0
variable = LoadAnimImage("trooprunner.bmp", 48, 55, 0, 5)
variable2 = LoadAnimImage("trooprunner2.bmp", 48, 55, 5, 5)
MaskImage variable, 255, 255, 255
MaskImage variable2, 255, 255, 255


Repeat

If KeyHit(1) Then End


While KeyDown(30)
Cls
If MilliSecs() > tmrRunner2 + 50 Then
tmrRunner2 = MilliSecs()
frmRunner2 = (frmRunner2 + 1) Mod 5
xkoord = xkoord - 3
EndIf
DrawImage variable2, xkoord, ykoord, frmRunner2
richtung = 1 ;links
Flip
Wend

While Not KeyHit(32)
Cls
If richtung = 1
DrawImage variable2, xkoord, ykoord, frmRunner2
ElseIf richtung = 2
DrawImage variable, xkoord, ykoord, frmRunner
EndIf
Flip
Wend

While KeyDown(32)
Cls
If MilliSecs() > tmrRunner + 50 Then
tmrRunner = MilliSecs()
frmRunner = (frmRunner + 1) Mod 5
xkoord = xkoord + 3
EndIf
DrawImage variable, xkoord, ykoord, frmRunner
richtung = 2 ;rechts
Flip

Wend

Forever

ZaP

BeitragSa, Apr 19, 2008 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde anstatt den Schleifen eher If's nehmen, denn die While-Schleifen unterbrechen den Programflow, also etwa so:

Code: [AUSKLAPPEN]

Wiederhole
 
  wenn(Taste(A))
    laufenachlinks()
  ende wenn

  wenn(Taste(S))
    laufenachrechts()
  ende wenn

  wenn nicht taste(A) oder Taste(S)
    stelleAnimFrameWiederHer()
  ende wenn

für immer


oder halt

Code: [AUSKLAPPEN]

repeat
 
  dir% = KeyDown(32)-KeyDown(30)

  if dir%
    X = X+dir%
  endif

until keyhit(1)
Starfare: Worklog, Website (download)
 

Lador

BeitragSa, Apr 19, 2008 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Morgen Lunatic.

Warum so viele Dauerschleifen? Mach es doch mit If, ich glaube dann lösen sich deine Probleme von selbst.

Code: [AUSKLAPPEN]
Repeat
 Cls
 If KeyDown(1) Then Exit
 ...
 Flip
Forever
End


Bei "..." setzt du eben alles ein, was wichtig ist. Laden der Bilder etc. bleibt vor der Hauotschleife wie in deinem Beispiel, ich wollte dir nur demonstrieren, wie du eine Hauptschleife machen solltest (natürlich kannst du auch While statt Repeat und Wend statt Until/Forever nehmen). Also bei "..." z.B. die Spielerbewegung, das Zeichnen der Bilder etc. 5 While in einer Repeat-Schleife verlangsamt dein Programm nur. Außerdem werden sie ja jedes mal ausgeführt, und nicht nur, wenn eine bestimmte Bedingung passt. Ich würde sagen, ändere deinen Code erst einmal so, und dann sehen wir, ob es immer noch ein Problem gibt.

MFG Lador
 

Lunatic

BeitragSa, Apr 19, 2008 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr vielen Dank,

es geht nun. Ich habe die IF statt Schleifenvariante benutzt und er kann nun aus dem Stand in beide Richtungen Problemlos laufen. Daraus entsteht nun ein neues Problem und zwar zappelt er in beide Richtungen wenn man a und d gleichzeitig drückt.

Wäre euch sehr dankbar wenn auch dies gelöst werden könnte. Ich habe auch wieder Flushkeys() probiert.
Es müsst eine Möglichkeit Tastendrücke zu verbieten wenn bereits eine Taste gedrückt ist, allerdings sehe ich keinen Weg das zu bewerkstelligen.

Ich danke im voraus
Grüße Lunatic

Code: [AUSKLAPPEN]
Graphics 640, 480
SetBuffer BackBuffer()

richtung = 2
xkoord = 0
ykoord = 0
variable = LoadAnimImage("trooprunner.bmp", 48, 55, 0, 5)
variable2 = LoadAnimImage("trooprunner2.bmp", 48, 55, 5, 5)
MaskImage variable, 255, 255, 255
MaskImage variable2, 255, 255, 255


Repeat
Cls
If KeyHit(1) Then End


If KeyDown(30)
Cls
If MilliSecs() > tmrRunner2 + 50 Then
tmrRunner2 = MilliSecs()
frmRunner2 = (frmRunner2 + 1) Mod 5
xkoord = xkoord - 3
EndIf
DrawImage variable2, xkoord, ykoord, frmRunner2
richtung = 1 ;links
Flip
EndIf

If Not KeyHit(32) Or KeyHit(30)
Cls
If richtung = 1
DrawImage variable2, xkoord, ykoord, frmRunner2
ElseIf richtung = 2
DrawImage variable, xkoord, ykoord, frmRunner
EndIf
Flip
EndIf

If KeyDown(32)
Cls
If MilliSecs() > tmrRunner + 50 Then
tmrRunner = MilliSecs()
frmRunner = (frmRunner + 1) Mod 5
xkoord = xkoord + 3
EndIf
DrawImage variable, xkoord, ykoord, frmRunner
richtung = 2 ;rechts
EndIf

Forever
  • Zuletzt bearbeitet von Lunatic am Sa, Apr 19, 2008 11:00, insgesamt einmal bearbeitet

Hubsi

BeitragSa, Apr 19, 2008 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Lador hat Folgendes geschrieben:
Außerdem werden sie ja jedes mal ausgeführt, und nicht nur, wenn eine bestimmte Bedingung passt.


While ist kopfprüfend, das heisst sie wird nur ausgeführt wenn die Bedingung wahr ist. Repeat wird mindestens einmal durchlaufen, dann wird erst geprüft. Aber der Origianlcode ist natrülich auch Käse, soweit schon richtig Very Happy


Code: [AUSKLAPPEN]
wenn nicht (taste(a) und taste(b))
  wenn taste(a) blabla()
  wenn taste(b) blubb()
ende wenn[quote]

In Code umwandeln kannst Du das gerne selbst :)
 

buja

BeitragSa, Apr 19, 2008 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das mit dem Laden der Bilder in der Schleife ist aber keine so gute idee -.-

Repeat
... ;HIER WÜRD ICH KEINE BILDERLADEN
blabla
Forever

Da kannse ganz schnell deinen Pc zum abschmieren bringen.

Lad die Bilder vor der Repeat...Forever Schleife mit loadimage() und zeichne sie dann mit drawimage() in der Schleife.

[EDIT]: Sry, hatte übersehen, das haben die Vorposter schon verbessert
...
 

Lunatic

BeitragSa, Apr 19, 2008 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja gelöst habe ich das dank eurer Hilfe recht souverän =)

Allerdings gibt es eben immer noch das Problem, dass wenn man a & d gleichzeitig drückt, der char in beide Richtungen zappelt. Ich habe gedacht das ich das per Code: [AUSKLAPPEN]
If KeyDown(30) And KeyDown(32) Then

lösen kann, jedoch ist mir kein befehl bekannt der die bewegung stoppt.

Liebe Grüße
Lunatic
 

Lador

BeitragSa, Apr 19, 2008 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hubsi:
Oh ja stimmt, bei While ist das nicht so. Gar nicht bedacht. Ich arbeite nur meistens mit Repeat, deswegen.

@Lunatic:
Wie wärs, wenn du bei jedem Tastendruck einer Bewegung eine Variable auf 1 setzt? Dann musst du eben überprüfen, ob die Variable 0 ist (natürlich musst du sie auch wieder auf 0 setzen, wenn die Taste nicht mehr gedrückt wird). Wenn ja: laufen. Wenn nein: stehen bleiben.

MFG Lador

ZaP

BeitragSa, Apr 19, 2008 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde es so leichter:

Code: [AUSKLAPPEN]

richtung = KeyDown(32) - KeyDown(30)


wenn S (32) gedrückt wird, dann rechnet er 1 - 0, also eins, und richtung wäre damit auch eins. Drückt man nur A (30), rechnet er 0 - 1 -> -1 und richtung wäre demzufolge -1. Drückt man beides, ist das 1 - 1, also 0.
Und die Variable 'richtung' kann man dann bequem auf die Koordinaten addieren.
Starfare: Worklog, Website (download)
 

Lunatic

BeitragSa, Apr 19, 2008 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@Lador

Das hatte ich mir auch schon gedacht dann wären wir aber bei: Code: [AUSKLAPPEN]
If laufen = 0 ;nicht laufen Then


Es gibt ja dann immer noch keine Möglichkeit den Charakter Stoppen zu lassen.

Edit: Problem solved Wink kann geclosed werden, vielen dank nochmals
 

demonboy

BeitragFr, Nov 14, 2008 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi sry das mir das thema erst jetzt aufgefallen ist aber könnte man nicht auch so machen?
Code: [AUSKLAPPEN]

If Keydown(30) Then
...
Elseif Keydown(32) Then
...
EndIf

Und wenn man möchte das wenn keine taste gedrückt wird ein andere grafik angezeigt wird dann kann man noch nen else einfügen oder???
ACHTUNG!!!
Newbiealarm:
Ich habe erst vor kurzem mit dem programmieren von BB angefangen!!!

Xeres

Moderator

BeitragFr, Nov 14, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum fragst du lange nach? Ausprobieren ob's funktioniert wird in jedem Fall schneller sein. Zumal das ja auch von dem restlichen Code abhängt, und davon, was du erreichen möchtest...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group