Zwischen Frameindizes hin- und her (Pingpong)?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

PacMani

Betreff: Zwischen Frameindizes hin- und her (Pingpong)?

BeitragSa, Okt 15, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich habe z.B. ein Bild mit 8 Frames für eine Animation.
Wenn die Animation einmal durchgelaufen ist, soll sie wieder zurücklaufen. Die Indizes der zu zeichnenden Frames würden also entsprechen:
0 1 2 3 4 5 6 7 6 5 4 3 2 1 [... und wieder von vorne].

Momentan merke ich mir in einer zweiten Variable neben dem zu zeichnenden Frameindex, ob die Zahl beim nächsten Tick hoch oder runter gezählt werden soll, ungefähr so:
Code: [AUSKLAPPEN]
If Hochzaehlen Then
    If AktuellerFrame = AnzahlFrames - 1 Then
        Hochzaehlen = False
    Else
        AktuellerFrame = AktuellerFrame + 1
    End If
Else
    If AktuellerFrame = 0 Then
        Hochzaehlen = True
    Else
        AktuellerFrame = AktuellerFrame - 1
    End If
End If


Aber das sind 13 Zeilen Code um einen solchen Pingpong-Effekt hinzukriegen. Geht das nicht auch leichter? Wie macht ihr das?

Eingeproggt

BeitragSa, Okt 15, 2011 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist ja ziemlich egal da deine 13 Zeilen Code nicht wirklich belastend für den PC sind... aber ich habs mit weniger Code geschafft Smile

Lauffähiger Testcode:
BlitzBasic: [AUSKLAPPEN]
Graphics 400,300,0,2
SetBuffer BackBuffer()

Local step_var=1
Local AktuellerFrame=0
Local AnzahlFrames=7

Repeat
AktuellerFrame = AktuellerFrame + step_var
If AktuellerFrame = 0 Or AktuellerFrame = AnzahlFrames - 1 Then
step_var=step_var * (-1)
EndIf

Text 0,0,AktuellerFrame
Flip 0 : Cls
Delay 800
Until KeyHit(1)
End


Der eigentliche "Zähl-Teil" ist dabei nur 4 Zeilen lang Cool
BlitzBasic: [AUSKLAPPEN]
	AktuellerFrame = AktuellerFrame + step_var
If AktuellerFrame = 0 Or AktuellerFrame = AnzahlFrames - 1 Then
step_var=step_var * (-1)
EndIf


mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

PacMani

BeitragSa, Okt 15, 2011 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah super Idee.
Besser als einen Boolean zu benutzen.

BlitzMoritz

BeitragSa, Okt 15, 2011 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Annahme, dass die Bildchen nicht besonders groß sind und deren Laden nicht viel Speicher belegt, würde ich ja ganz einfach die Animationen aus den gewünschten 14 Frames zusammenstellen und das dann durchlaufen lassen - ist zwar keine Antwort auf deine Code-Frage, bräuchte aber keine extra if-Abfrage und ergäbe somit die höchste Geschwindigkeit.
 

PacMani

BeitragSa, Okt 15, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist klar, dass das geht. Aber ich wollte das allgemein codetechnisch mal wissen, wie die optimale Lösung aussieht Wink

Der Eisvogel

BeitragSa, Okt 15, 2011 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde es so machen:
BlitzBasic: [AUSKLAPPEN]
Graphics 320,240
SetBuffer BackBuffer()

Local frame

Repeat
Cls

frame = frame + 1
If frame > 7 Then frame = frame - 14

Text 10, 10, "Current Frame: " + Abs(frame)

Flip 0
Delay 500
Until KeyHit(1)
End


MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

PacMani

BeitragSa, Okt 15, 2011 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Idee finde ich sogar noch besser Very Happy
 

PhillipK

BeitragSa, Okt 15, 2011 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mist Sad

Ich hatte sowas immer über einen array mit indices gelöst und den einfach von 0 bis Len durchgezählt und ihren entsprechenden wert als frame verwendet.

Der Eisvogel hats uns allen gezeigt *g*

BlitzMoritz

BeitragSa, Okt 15, 2011 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
PhillipK hat Folgendes geschrieben:
Mist Sad Der Eisvogel hats uns allen gezeigt *g*

Aber wieso denn? Dein Vorschlag ist doch gut. Sieht vielleicht nicht so doll aus, braucht aber (abgesehen vom mod) kein if und kein Abs und ist somit schneller und besser:
BlitzBasic: [AUSKLAPPEN]
Local f%
Dim index%(14)
index(0) = 0
index(1) = 1
index(2) = 2
index(3) = 3
index(4) = 4
index(5) = 5
index(6) = 6
index(7) = 7
index(8) = 6
index(9) = 5
index(10) = 4
index(11) = 3
index(12) = 2
index(13) = 1

Graphics 320,240

Repeat
Cls

f = (f+1) Mod 14

Text 10, 10, "Current Frame: " + index(f)

Flip 0
Delay 500
Until KeyHit(1)
End


Und mit BlitzMax sähe es sogar noch besser aus Wink :
BlitzMax: [AUSKLAPPEN]
Graphics 320,240
Local f%, index%[] = [0,1,2,3,4,5,6,7,6,5,4,3,2,1]

Repeat
Cls

f = (f+1) Mod 14
DrawText "Current Frame: " + index[f], 10, 10

Flip 0
Delay 500
Until KeyHit(KEY_ESCAPE)
End

Außerdem ließe dieser Weg über bestimmte Indizes ja noch weitere beliebige Kombinationen zu, falls nötig ...
 

PhillipK

BeitragSa, Okt 15, 2011 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir gings um diese Zeile

BlitzBasic: [AUSKLAPPEN]
If frame > 7 Then frame = frame - 14


Soweit hatte ich nie gedacht. Mad

Naja zugegeben, damit lassen sich auch diverse einzelbilder zu Animationen zusammenfrickeln (Beispiel: 2 Laufen-bilder und danach 5 "Springen" bilder, die perfekt anknüpfen aber total andere indices haben) - aber jede möglichkeit sollte auf ihren nutzen angepasst werden Smile

Ich weiß nicht, ob ein mod mehr oder weniger "rechenaufwand" betreibt, wie ein if, aber ist ja auch egal.

Ist das problem nun gelöst? =)
 

PacMani

BeitragSa, Okt 15, 2011 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Von Assembler her würde ich sagen, Mod ist aufwendiger als If. If ist ja nur CMP und Rumgespringe, Mod gibt's ja nicht direkt als ASM-Befehl, oder?^^
Aber Mod war ja eh nur für Animationen ohne Pingpong gedacht.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group