gelöst : Mehrere keydown+entsprechende Animationen zuordnen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Prog

Betreff: gelöst : Mehrere keydown+entsprechende Animationen zuordnen

BeitragDi, Nov 15, 2011 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,

wenn ich die zweite Kombination benutze dann werden irgend wie beide Bedingungen ausgeufert :/ kann man das beheben?

zb:

Code: [AUSKLAPPEN]
;up
If KeyDown(200) Then
Cls
frame = frame + 1
DrawImage bild[frame],0,0
Delay 150
If frame = 8 Then frame = 0
Flip
EndIf

;up and r
If (KeyDown(200) And KeyDown(205)) Then
Cls
frame = frame + 1
DrawImage bild_x1[frame],0,0
Delay 150
If frame = 8 Then frame = 0
Flip
EndIf


Prog
  • Zuletzt bearbeitet von Prog am Mo, Nov 21, 2011 21:39, insgesamt 2-mal bearbeitet
 

PacMani

BeitragDi, Nov 15, 2011 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Zuerst ist es hilfreich, Code einzurücken.

Dann fällt auch auf, dass natürlich beide Teile ausgeführt werden, wenn Oben UND Rechts gedrückt wird, da ja Oben definitiv immer gedrückt wird. Richtig wäre es so:
BlitzBasic: [AUSKLAPPEN]
If KeyDown(200) Then
;Alles im If bis zum EndIf ist eingerückt - nur das wird ausgeführt, wenn das einrückende If wahr ist
Cls
frame = frame + 1
;Taste oben ist wegen des ersten Ifs hier ja definitiv immer gedrückt, weitere Überprüfung, ob zusätzlich noch rechts gedrückt ist.
If KeyDown(205) Then
DrawImage bild_x1[frame],0,0
Else
DrawImage bild[frame],0,0
EndIf
Delay 150
If frame = 8 Then frame = 0
Flip
EndIf
  • Zuletzt bearbeitet von PacMani am Di, Nov 15, 2011 19:04, insgesamt 2-mal bearbeitet

ZEVS

BeitragDi, Nov 15, 2011 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau meinst du mit "ausgeufert"? Wird nichts ausgeführt, stürzt das Programm ab (Fehlermeldung?), gibt es Compilerfehler?
Auf jeden Fall setzt du bei der zweiten If-Abfrage sehr unkonventionell Klammern, die nicht nötig wären:
BlitzBasic: [AUSKLAPPEN]
If KeyDown(200) And KeyDown(205) Then

Außerdem kann man Code einrücken, besonders wenn man will, dass sich ihn jemand anders durchliest.
Vom Befehl Delay lässt du bitte die Finger, siehe hierzu https://www.blitzforum.de/foru...hp?t=33684.

ZEVS

Xeres

Moderator

BeitragDi, Nov 15, 2011 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Was exakt möchtest du tun? Dem Code nach sieht es nach Animation aus - und da solltest du als erstes Delay komplett vergessen und nur 1x Flip benutzten. Ansonsten handelst du dir in Zukunft schnell Probleme ein.
Für Tasten-Kobinationen sind ein paar Variablen wohl gut geeignet um die Eingaben korrekt zu interpretieren - da reicht ein If nicht aus.
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)

Lakorta

BeitragDi, Nov 15, 2011 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir raten, die Ergebnisse von KeyDown() und/oder KeyHit() zwischenzuspeichern.
z.B.
Code: [AUSKLAPPEN]

KeyHit_ESC = KeyHit(1)
KeyDown_Leertaste = KeyDown(57)

Dieses dann immer am anfang der Hauptschleife und dann prüfen, ob diese Werte 1 entsprechen:
BlitzBasic: [AUSKLAPPEN]

If KeyHit_ESC Then End

If KeyDown_Leertaste Then
;Irgendwas
EndIf

~EDITIERT~

Syntax-box und Codetag vertragen sich nicht - korrigiert.
Xeres
---
 

Prog

BeitragDi, Nov 15, 2011 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
@pac-man danke ich werde es mal ausprobieren Smile, Code einzurücken notiere ich mir Wink

@zevs ausgeufert = ausgeführt sorry Smile, die Bedingung wird ausgeführt, das Programm stürzt nicht ab und keine Fehlermeldung, das Problem ist das beide if auf einmal laufen :S, ich benutze den delay um die Bewegung von mein Bild nicht so flitzen zu lassen :/ gibt es da eine andere Variante? Ohne den Rechner zu bremsen?

@Xeres ja es handelt sich um Animation Smile, ich mochte eine Spielfigur steuern und dazu die entsprechende Animation ausfuhren, mochte auch verschiedene Levels aufbauen Smile

@Lakorta originell Smile
 

Prog

BeitragDi, Nov 15, 2011 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Pac-Man hat Folgendes geschrieben:
Zuerst ist es hilfreich, Code einzurücken.

Dann fällt auch auf, dass natürlich beide Teile ausgeführt werden, wenn Oben UND Rechts gedrückt wird, da ja Oben definitiv immer gedrückt wird. Richtig wäre es so:
BlitzBasic: [AUSKLAPPEN]
If KeyDown(200) Then
;Alles im If bis zum EndIf ist eingerückt - nur das wird ausgeführt, wenn das einrückende If wahr ist
Cls
frame = frame + 1
;Taste oben ist wegen des ersten Ifs hier ja definitiv immer gedrückt, weitere Überprüfung, ob zusätzlich noch rechts gedrückt ist.
If KeyDown(205) Then
DrawImage bild_x1[frame],0,0
Else
DrawImage bild[frame],0,0
EndIf
Delay 150
If frame = 8 Then frame = 0
Flip
EndIf


Pac-Man frage Very Happy

und wenn ich noch eine dritte Variante einfügen mochte?

Zb: momentan geht nur up , up R und wenn ich up L einfügen mochte? Habe es mit elseif versucht aber da klappt was nicht O.o
 

PacMani

BeitragDi, Nov 15, 2011 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Was klappt denn da nicht?
BlitzBasic: [AUSKLAPPEN]
If KeyDown(205) Then
dingsdabumsda
Else If KeyDown(Tastencode) Then
blablabla
End If


Vielleicht solltest du bei diesen Unsicherheiten noch mal ein Grundkenntnis-Tutorial durchlesen Wink

Xeres

Moderator

BeitragDi, Nov 15, 2011 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@Prog: Mit dem Zitieren ganzer Beiträge und Doppelpost machst du dich unbeliebt. Bitte Editiere Beiträge, falls du etwas hinzu zu fügen hast.
Danke.
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)

ZEVS

BeitragDi, Nov 15, 2011 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Prog hat Folgendes geschrieben:
@zevs ausgeufert = ausgeführt sorry Smile, die Bedingung wird ausgeführt, das Programm stürzt nicht ab und keine Fehlermeldung, das Problem ist das beide if auf einmal laufen :S, ich benutze den delay um die Bewegung von mein Bild nicht so flitzen zu lassen :/ gibt es da eine andere Variante? Ohne den Rechner zu bremsen?

Zentraler Artikel: https://www.blitzforum.de/foru...hp?t=25242
Du kannst hierfür individuelle Timer verwenden, die du entsprechend startest und stoppst (CreateTimer, PauseTimer, ResumeTimer. Stellt sich die Frage, wieso du überhaupt ein Delay zwischen Zeichnen und Flip hast. Nach Flip sollte eigentlich alles angezeigt werden, sofern du double-bufferst (SetBuffer BackBuffer())

ZEVS
 

PacMani

BeitragDi, Nov 15, 2011 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
WaitTimer dürfte einfacher sein
 

Prog

BeitragMi, Nov 16, 2011 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@zeres sorry :S für den Doppelpost ich glaube dass war ein klick zu viel Sad

danke noch mal an alle morgen lese ich mir alles nochmals durch und schreibe alles von vorne und diesmal rücke ich den Code mal ein Wink

melde mich morgen Very Happy
 

Prog

BeitragMi, Nov 16, 2011 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin Smile

habe alles von vorne geschrieben und nun geht die Steuerung Very Happy habe auch ein „MaskImage“ eingebunden aber er zuckt leider :/ na ja..

P.S: ich poste den Code mal , wenn ihr vorschlägt habt so wie Code einzurücken, Verbesserungen usw. würde ich mich freuen Wink
BlitzBasic: [AUSKLAPPEN]

frameTimer = CreateTimer(18)

L = 800
H = 600

x = L/2
y = H/2
p_Speed = 5

Graphics L,H,32,2
SetBuffer BackBuffer()

;Massen Arrays ^^“

;Prog Start

Repeat

If KeyDown(200) Then ;UP
Cls
frame = frame + 1
y = y - p_Speed
MaskImage bild[frame],110,80,52
DrawImage bild[frame],x,y
If KeyDown(205) Then ;UP + R
x = x + p_Speed
;MaskImage bild_x1[frame],110,80,52
DrawImage bild_x1[frame],x,y
EndIf
If KeyDown(203) Then ;UP + L
x = x - p_Speed
;MaskImage bild_x4[frame],110,80,52
DrawImage bild_x4[frame],x,y
EndIf
WaitTimer(frameTimer)
If frame = 8 Then frame = 0
Flip 0
EndIf

.
.
.

Until KeyHit(1)
FreeTimer frameTimer


@xeres ich hab´s vergessen sorry :S

BaseTH

BeitragMi, Nov 16, 2011 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Prog,

Habe da einen Vorschlag und eine Frage.

- den Maskimage-Befehl würde ich immer vor die Hauptschleife setzen da dieser dann nur einmal ausgeführt werden muss, der Befehl ist auch für animierte Bilder nutzbar.

- findest du deinen frameTimer mit 18 fps nicht etwas gering?

Gruß,
BaseTH
 

PacMani

BeitragMi, Nov 16, 2011 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Du rückst ein - das ist gut. Aber an einigen Stellen rückst du noch falsch ein Wink
Hier nur ein Beispiel:
BlitzBasic: [AUSKLAPPEN]

If KeyDown(205) Then ;UP + R
x = x + p_Speed ;<-- wieso rückst du hier doppelt ein? Das obige If erzeugt nur eine Einrückung
;MaskImage bild_x1[frame],110,80,52
DrawImage bild_x1[frame],x,y ;<-- hier hört die Einrückung plötzlich auf. Warum? Die Befehle befinden sich weiterhin im gleichen If-Block wie x = x + p_Speed und das auskommentierte MaskImage
EndIf ;<-- EndIf (oder End If) beendet den If block und steht damit auf der Höhe des Ifs, das den Block startet


Richtig wäre es so:
BlitzBasic: [AUSKLAPPEN]

If KeyDown(205) Then ;UP + R
x = x + p_Speed
;MaskImage bild_x1[frame],110,80,52
DrawImage bild_x1[frame],x,y
EndIf


Tip: Benutz IDEal anstatt den grässlichen Blitz-Editor. IDEal rückt für dich größtenteils automatisch ein - und benutzt anstatt des Tab-Zeichens gleich 4 Leerzeichen, was das Bearbeiten einfacher macht Smile
 

Prog

BeitragMi, Nov 16, 2011 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo BaseTH,

nun ich habe es auch versucht den frametimer etwas hoher einzustellen aber da flitzte die Animation :/ zu sehr,

für den Maskimage-Befehl, habe ich selbst versucht ob er besser vor der Haupt schleife ginge aber vergebens Fehlermeldung :/, „Image does not exist“

ich lade meine Bilder so: „noob style“

BlitzBasic: [AUSKLAPPEN]

Local bild[8]
bild[1] = LoadImage("läuft n0000.BMP")
bild[2] = LoadImage("läuft n0001.BMP")
.
.
.
 

Prog

BeitragMi, Nov 16, 2011 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Pac-Man hat Folgendes geschrieben:
Du rückst ein - das ist gut. Aber an einigen Stellen rückst du noch falsch ein Wink


danke Smile werde mir mal den IDEal besorgen Wink

BaseTH

BeitragMi, Nov 16, 2011 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Prog,

vielleicht helfen dir der folgende Tipps.

- Die Bilder vor der Hauptschleife laden.
- Den Maskimage-Befehl erst danach anwenden denn das Bild muss erst geladen sein.

- die Namen der Bilddatein würde ich je nach Anwendungszweck benennen bei vielen Bilder wird es sonst schwer mit z.B. "n0000.bmp", denn die Übersicht leidet sehr bzw. ist später nicht mehr gegeben.

- Je mehr Frames du hast desto kleiner müssen die Aktualisierungabstände deiner Werte werden.

Bei 10 Frames z.B. X = X + 4
Bei 20 Frames z.B. X = X + 2

Achja und das mit den Doppelpost würde ich lassen da dieses nicht gerne gesehen wird. Smile

Gruß,
BaseTH
 

Prog

BeitragDo, Nov 17, 2011 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@BaseTH

Also wenn der MaskImage-Befehl mir die Fehler Meldung gibt, heißt das, das jeder einzelnes Array nur die Adresse beinhaltet zu jeden Frame richtig?

Also wenn ich noch jedes einzelne Bild laden muss und nochmals den MaskImage-Befehl zu jedes Bild aufrufen muss....... wow :S 500 Zeilen pur-coding.

Aber das bringt mich auf eine Idee ist es nicht besser DrawImageRect-Befeh zu benutzen?
Und einzelne frame´s mit Paint oder mit ein selbst gebastelten Prog zusammen fügen?

Das würde die Code Übersicht erleichtern oder :/? und man könnte auch RAM sparen glaube ich,

wie meist du das mit:
Zitat:
- Je mehr Frames du hast desto kleiner müssen die Aktualisierungabstände deiner Werte werden.

Bei 10 Frames z.B. X = X + 4
Bei 20 Frames z.B. X = X + 2


dass wird mein Untergang sein Wink

Zitat:
Achja und das mit den Doppelpost würde ich lassen da dieses nicht gerne gesehen wird.


Grüße

Prog

Xeres

Moderator

BeitragDo, Nov 17, 2011 5:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal grundsätzlich: Flip(0) & Waittimer benutzen Arrow Hurra, 100 % Auslastung
Wenn es um die Animation an sich geht, bastelst du dir einen Timer mit Millisecs um die Frames weiter zu schalten.
"Image does not exist" bedeutet: Das Bild konnte nicht geladen werden (du hast dich bei der Pfadangabe vertippt oder irgendwas anderes ist schief gelaufen) - wenn der Fehler bei MaskImage auftritt, dann auch bei jeder anderen Stelle, an der du versuchst, auf das Bild zu zugreifen.
Frames sind Unterteilungen in einer Bilddatei - die kann BB dir automatisch verarbeiten, siehe LoadAnimImage. Und ansonsten reduziere deine Programierarbeit mit geschickten Schleifen:
Code: [AUSKLAPPEN]
Local bild[8], i
For i=0 To 8
   bild[i]=LoadImage("läuft"+i+".bmp")
   If bild[i]=0 Then RuntimeError("Bild 'läuft"+i+".bmp' konnte nicht geladen werden!")
   MaskImage bild[i], [...]
Next
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)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group