gelöst : Mehrere keydown+entsprechende Animationen zuordnen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

BaseTH

BeitragDo, Nov 17, 2011 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Prog,

Du solltest dir unbedingt den bereits von Xeres genannten LoadAnimImage Befehl ansehen. Dieser Befehl sollte für Animationen verwendet werden. Du brauchst dann nur eine Bilddatei in der alle Animationsstufen nebeneinander enthalten sind.

Dieses hat für dich folgende Vorteile:

- weniger Schreibarbeit
- dadurch auch mehr Übersicht im Quellcode

Der Maskimage Befehl darf auch hier erst nach dem laden der Animationsdatei erfolgen.

Der Vorteil hier ist:

- Du musst nur noch eine Bilddatei laden
- Die Maskierung per Maskimage bezieht sich auf alle einzelnen Frames in der Animationsdatei. Der Befehl muss also nur einmal ausgeführt werden.

Zu der Frage:

Zitat:
wie meist du das mit:

- 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


Wenn du durch deinen Timer z.B. 10 Frames hast und dein X-Wert sich pro Schleifendurchlauf um 4 erhöht dann verändert sich der ursprüngliche X-Wert in einer Sekunde um 40 Einheiten denn 10 * 4 = 40.

Wenn du nun aber nicht mehr 10 Frames sondern 20 Frames hast dann verändert sich dein X-Wert um 80 Einheiten in einer Sekunde denn 20 * 4 = 80.

Damit du nun die selbe Veränderung des X-Wertes bei der höheren Framezahl erziehlst musst du die Vergrößerung des Wertes nach unten korregieren. Da wir nicht 80 Einheiten wollen sondern nur 40 müssen wir nicht X = X + 4 rechnen sondern nur noch X = X + 2 denn 20 * 2 ergibt 40. Smile

Gruß,
BaseTH
 

Prog

BeitragSa, Nov 19, 2011 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Da bin ich wieder Wink

@Xeres der Beitrag war cool Smile danke, so verrückte Sachen kriege ich niemals auf die reihe ;P

@BaseTH sind die Aktualisierung abstände jetzt besser Smile?

habe alles mal zusammen gebastelt :S aber wenn ich zwei tasten auf ein male drücke dann verdoppelt sich die Figur O.o ist das normal? , ich hänge euch das Programm mit Bilder an :S es funktionieren nur die UP, UP+L und UP+ R

BlitzBasic:

frameTimer = CreateTimer(60)
p_Speed = 5
x=200
y=96

lauft_n = LoadAnimImage("magier_frames/läuft_n.bmp", 96, 96, 0, 7)
lauft_ne = LoadAnimImage("magier_frames/läuft_ne.bmp", 96, 96, 0, 7)
lauft_e = LoadAnimImage("magier_frames/läuft_e.bmp", 96, 96, 0, 7)
lauft_se = LoadAnimImage("magier_frames/läuft_se.bmp", 96, 96, 0, 7)
lauft_s = LoadAnimImage("magier_frames/läuft_s.bmp", 96, 96, 0, 7)
lauft_sw = LoadAnimImage("magier_frames/läuft_sw.bmp", 96, 96, 0, 7)
lauft_w = LoadAnimImage("magier_frames/läuft_w.bmp", 96, 96, 0, 7)
lauft_nw = LoadAnimImage("magier_frames/läuft_nw.bmp", 96, 96, 0, 7)

MaskImage(lauft_n, 110, 80, 52)
MaskImage(lauft_ne, 110, 80, 52)
MaskImage(lauft_e, 110, 80, 52)
MaskImage(lauft_se, 110, 80, 52)
MaskImage(lauft_s, 110, 80, 52)
MaskImage(lauft_sw, 110, 80, 52)
MaskImage(lauft_w, 110, 80, 52)
MaskImage(lauft_nw, 110, 80, 52)

Repeat

If MilliSecs() > bTimer + 80 Then

bTimer = MilliSecs()

If KeyDown(200) Then ;UP
Cls
frame = (frame + 1) Mod 7
y = y - p_Speed
DrawImage lauft_n, x, y, frame

If KeyDown(205) Then ;UP + R

x = x + p_Speed
DrawImage lauft_ne, x, y, frame

EndIf

If KeyDown(203) Then ;UP + L

x = x - p_Speed
DrawImage lauft_nw, x, y, frame

EndIf

Flip

EndIf

EndIf


WaitTimer(frameTimer)
Until KeyHit(1)
FreeTimer frameTimer


https://www.blitzforum.de/upload/file.php?id=11155

Edit: ok, ich versuche es mal Wink
  • Zuletzt bearbeitet von Prog am Sa, Nov 19, 2011 0:56, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Nov 19, 2011 0:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein lauffähiges Programm ist nett, aber ein Blick auf den Code geht schneller...
Du zeichnest in jedem Fall ein Bild, wenn man hoch drück - wenn man Rechts/Links drückt, wird ein zweites Bild über das erste gezeichnet.
Alles in ein ElseIf block packen oder das zu zeichnende Bild in einer temporären Variable speichern.
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)

BaseTH

BeitragSa, Nov 19, 2011 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Prog,

Ich kann dann Programm so leider nicht testen da ich selber nur mit BlitzMax programmiere.

Das mit der doppelten Anzeige beim drücken zweier Tasten im selben Moment passiert da du jeweils einen Drawbefehl in der If Bedingung hast.

BlitzBasic:

If KeyDown(205) Then ;UP + R
x = x + p_Speed
DrawImage lauft_ne, x, y, frame
EndIf

If KeyDown(203) Then ;UP + L
x = x - p_Speed
DrawImage lauft_nw, x, y, frame
EndIf


Das Problem sollte z.B. so lösbar sein.

BlitzBasic:

If KeyDown(203) And KeyDown(205) = 0 Then ;UP + L
x = x - p_Speed
DrawImage lauft_nw, x, y, frame
EndIf


Jetzt wird die If-Bedingung für die linke Pfeiltaste nur durchgeführt wenn die rechte Pfeiltaste nicht gedrückt wird. Für die If-Bedingung der rechten Pfeiltaste ist das Prinzip gleich. Smile

Hoffe du kannst damit etwas anfangen. Optimalerweise speicherst du in einer Variablen welche Imagedatei gezeichnet werden soll und hast dann später außerhalb der Keydown-Bedingungen einen Bereich indem du die Grafik die gezeichnet werden soll per If-Bedingung steuerst.

Gruß,
BaseTH

************************************

Ich habe hier gemütlich noch geschrieben und Xeres war schneller Smile


Gruß,
BaseTH
 

Prog

BeitragSo, Nov 20, 2011 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo alle beisammen Smile

ich habe mal nachgedacht über Xeres und BaseTH Tipp, ich habe versucht die schräg-lauf Animation , die halt mit zwei tasten druck aktiviert werden, in eine while schleife gepackt und ich muss sagen das hat geholfen aber...... wenn ich nun in die schleife gerate schießt die Prozessor Benutzung auf 60% <.< leider, ich habe auch in der schleife ein frametimer eingebaut damit die Animation nicht so schnell wiederholt wird (selbst Mord?) aber ich glaube das die schleife zu schnell ausgeführt wird :/ kann man sie nicht verlangsamen?

BlitzBasic:

Graphics 800,600,32,2
SetBuffer BackBuffer()

frameTimer = CreateTimer(60)
p_Speed = 4
x=200
y=500

lauft_n = LoadAnimImage("magier_frames/läuft_n.bmp", 96, 96, 0, 7)
lauft_ne = LoadAnimImage("magier_frames/läuft_ne.bmp", 96, 96, 0, 7)
lauft_e = LoadAnimImage("magier_frames/läuft_e.bmp", 96, 96, 0, 7)
lauft_se = LoadAnimImage("magier_frames/läuft_se.bmp", 96, 96, 0, 7)
lauft_s = LoadAnimImage("magier_frames/läuft_s.bmp", 96, 96, 0, 7)
lauft_sw = LoadAnimImage("magier_frames/läuft_sw.bmp", 96, 96, 0, 7)
lauft_w = LoadAnimImage("magier_frames/läuft_w.bmp", 96, 96, 0, 7)
lauft_nw = LoadAnimImage("magier_frames/läuft_nw.bmp", 96, 96, 0, 7)

MaskImage(lauft_n, 110, 80, 52)
MaskImage(lauft_ne, 110, 80, 52)
MaskImage(lauft_e, 110, 80, 52)
MaskImage(lauft_se, 110, 80, 52)
MaskImage(lauft_s, 110, 80, 52)
MaskImage(lauft_sw, 110, 80, 52)
MaskImage(lauft_w, 110, 80, 52)
MaskImage(lauft_nw, 110, 80, 52)

Repeat

If MilliSecs() > bTimer + 100 Then

;------------------------------ UP - UP+R - UP+L -------------------------------------------------


If KeyDown(200) Then ;UP
Cls
bTimer = MilliSecs()
frame = (frame + 1) Mod 7
y = y - p_Speed
DrawImage lauft_n, x, y, frame
Flip
EndIf

;If KeyDown(200) And KeyDown(205) = 1 Then ;UP + R
; Cls
; bTimer = MilliSecs()
; frame = (frame + 1) Mod 7
; x = x + p_Speed
; DrawImage lauft_ne, x, y, frame
; Flip
;EndIf

While KeyDown(200) And KeyDown(205) = 1

If MilliSecs() > internBTimer + 100 Then
Cls
internBTimer = MilliSecs()
frame = (frame + 1) Mod 7
x = x + p_Speed
y = y - p_Speed
DrawImage lauft_ne, x, y, frame
Flip
EndIf

Wend


If KeyDown(200) And KeyDown(203) = 1 Then ;UP + L
Cls
bTimer = MilliSecs()
frame = (frame + 1) Mod 7
x = x - p_Speed
DrawImage lauft_nw, x, y, frame
Flip
EndIf
EndIf

Xeres

Moderator

BeitragSo, Nov 20, 2011 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, Schleifen sind keine Lösung. Das ganze Programm muss Ablaufen, sonst hast du noch größere Probleme.
Was du tun musst, ist nur 1x Drawimage in dem If-Block auf zu rufen. Das Flip gehört nicht in diesen Block, das muss immer aufgerufen werden.

Deine (gekürzte) variante:
BlitzBasic:
If KeyDown(200) Then ;UP

DrawImage lauft_n, x, y, frame

If KeyDown(205) Then ;UP + R
DrawImage lauft_ne, x, y, frame
EndIf

If KeyDown(203) Then ;UP + L
DrawImage lauft_nw, x, y, frame
EndIf

EndIf

Erst wir immer lauft_n gezeichnet, dann wird entschieden, ob R und L gedrückt werden - alles unabhängig voneinander: wenn man alle 3 Tasten drückt, werden alle 3 Bilder gezeichnet.

Mit ElseIf:
BlitzBasic:
If KeyDown(200) And KeyDown(205) Then ;UP + R
DrawImage lauft_ne, x, y, frame
ElseIf KeyDown(200) And KeyDown(203) Then ;UP + L
DrawImage lauft_nw, x, y, frame
ElseIf KeyDown(200) Then ;UP
DrawImage lauft_n, x, y, frame
EndIf
Aus diesem einen Block kann nur eine Möglichkeit ausgewählt werden. Wenn man alle 3 Tasten drückt, bekommt die erste Variante den Vorzug.
Ich hoffe, du siehst den Unterschied.
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)
 

Prog

BeitragMo, Nov 21, 2011 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Xeres, habe ziemlich viel ausprobiert, beobachtet und getestet =D dank euch

und ja ich sehe den unterschied „jetzt“ Wink

werde den Beitrag umbenennen falls das geht und biss zum nächsten mal

Gruß

Prog Wink

Midimaster

BeitragDi, Nov 22, 2011 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
schau dir doch mal mein timer tutorial an. es passt genau zu deinen fragen:

https://www.blitzforum.de/foru...hp?t=34436
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group