Tastenabfrage funktioniert nur in eine Richtung
Übersicht

LunaticBetreff: Tastenabfrage funktioniert nur in eine Richtung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 ![]() |
||
demonboy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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!!! |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group