Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.08.2011, 17:27 Titel: Bilder nacheinander zeichnen(Animation) |
|
|
Hi
Ich habe 3 Bilder. Diese Bilder sind eine Laufanimation einer 2D-Figur. Nun möchte ich, dass wenn sie sich bewegt(nach Tastendruck), das Bild gezeichnet wird, welches die Laufanimation darstellt(Bild 1 und 2). Nachdem sie gelaufen ist, wird wieder das Ausgangsbild gezeichnet. Aber wie genau kriege ich das hin?
Müsste ungefähr so aussehen(Pseudecode):
Code: | If Tastendruck(W) Then
Male Bild2
Warte 0.2 Sekunden
Male Bild3
Warte 0.2 Sekunden
Male Bild1
End If |
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 30.08.2011, 19:47 Titel: |
|
|
Woran genau scheitert es denn? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 30.08.2011, 19:49 Titel: |
|
|
nur ne Idee und sehr pseudo
Code: | dim as integer ptr anim(2)
dim as integer frame=0
anim(0)=imagecreate()
anim(1)=imagecreate()
anim(2)=imagecreate()
while Tastendruck(w)
put(),anim(frame)
frame = ((frame+1) mod 3)'lässt den Index rotieren 0-1-2-0-1-2 usw
pause
wend |
edit:
Code: | screen 19,32
dim as integer ptr anim(3)
anim(0)= imagecreate(11,21,&H0)
anim(1)= imagecreate(11,21,&H0)
anim(2)= imagecreate(11,21,&H0)
anim(3)= imagecreate(11,21,&H0)
circle anim(0),(5,15),5,&HFF7F00
circle anim(1),(5,7),5,&HFF7F00
circle anim(2),(5,5),5,&HFF7F00
circle anim(3),(5,13),5,&HFF7F00
dim as integer x,frame
dim as single fract=0
x=300
frame=0
do
screenlock
cls
put (x,200),anim(frame)
if multikey(&h4D) then 'Pfeiltaste rechts
x +=1
fract +=.2
if fract>1 then
frame = ((frame+1) mod 4)
fract=0
end if
end if
if multikey(&h4B) then 'Pfeiltaste links
x -=1
fract +=.2
if fract>1 then
frame = ((frame+1) mod 4)
fract=0
end if
end if
screenunlock
sleep 1
loop until inkey=chr(27)
for i as integer=0 to ubound(anim)
imagedestroy anim(i)
next i |
Zuletzt bearbeitet von Muttonhead am 30.08.2011, 20:42, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.08.2011, 19:52 Titel: |
|
|
Der Spieler soll während dem Laufen ein anderes Bild haben. Und das immer abwechselnd. Also in folgender Reihenfolge:
Bild1 'Stehenbleiben
Bild2 'Laufen
Bild1 'Stehenbleiben
Bild3 'Laufen
Bild1 'Stehenbleiben
Bild2 'Laufen
Ich habe es folgendermaßen versucht:
Code: | If Laufen() Then
Chars(1).lbit+=1
If Chars(1).lbit=1 Then
Chars(1).bild=2
Elseif Chars(1).lbit=2 Then
Chars(1).bild=3
Elseif Chars(1).lbit=3 Then
Chars(1).lbit=0
Chars(1).bild=1
End If
Chars(1).chary+=1
End If |
Wenn Chars(1).bild=1 ist, dann wird Bild 1 gezeichnet. Wenn Chars(1).bild=2 ist, dann Bild 2 und so weiter. Chars(1).chary ist die Position des Spielers. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 30.08.2011, 20:36 Titel: |
|
|
Code: | If Chars(1).lbit=1 Then
Chars(1).bild=2
Elseif Chars(1).lbit=2 Then
Chars(1).bild=3
Elseif Chars(1).lbit=3 Then
Chars(1).lbit=0 |
klingt bis hierher nach
Code: | Chars(1).bild = (Chars(1).lbit + 1) mod 4 |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.08.2011, 21:23 Titel: |
|
|
Das hilft mir aber nicht weiter.  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 30.08.2011, 21:33 Titel: |
|
|
Ich würde ja wirklich gern helfen, aber ich weiß nicht, wo genau das Problem liegt. Dein Ansatz passt doch, was klappt denn nicht? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.08.2011, 22:08 Titel: |
|
|
Man läuft immer 16 Pixel auf einmal(man springt in meiner Tileengine von einem Tile zum anderen ). Nun soll das aber nicht ruckartig passieren, sondern eine fließende Bewegung, in der während dem Laufen entweder Bild 2 oder 3 gezeichnet wird, vor und nach der Bewegung aber nur Bild 1. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.08.2011, 22:19 Titel: |
|
|
1,2,1,3
könnte man auf mehrere Arten machen...
am einfachsten ist es mit einem linealen ablauf einer animation...
also bei jedem schritt quasi, ani+=1 solange bis man am ende angelangt ist und dann von vorne beginnt..
jetzt könntest du eine kopie von bild1 machen und sie als bild3 nehmen (womit bild 3 dann bild 4 wäre)
oder eine variable die den animationsablauf 'festhält')
wo dann quasi if ani=3 then bild=1
oder so ähnlich.... _________________
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 30.08.2011, 22:34 Titel: |
|
|
Zitat: | Man läuft immer 16 Pixel auf einmal(man springt in meiner Tileengine von einem Tile zum anderen ). Nun soll das aber nicht ruckartig passieren, sondern eine fließende Bewegung, in der während dem Laufen entweder Bild 2 oder 3 gezeichnet wird, vor und nach der Bewegung aber nur Bild 1. |
Code: | ' Pseudoähnlicher Code für eine Linksbewegung
FOR i AS INTEGER = 1 TO 16
PUT (posX+i, posY), animationsbildchen(i)
warte(einbisschen)
NEXT |
so in der Art? Wenn animationsbildchen(16) = Bild1 ist, dann hast du das mit 'nach der Bewegung' auch schon erledigt.
Wenn mehrere Dinge gleichzeitig bewegt werden können, wird es etwas komplizierter, ist aber mit einem Zähler je Bewegung auch gut machbar.
edit: es musste natürlich "animationsbildchen(16) = Bild1" heißen, nicht "animationsbildchen(i) = Bild1" _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 31.08.2011, 10:04, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.08.2011, 22:46 Titel: |
|
|
hm.. ok, wenn ich das so verstehe dann ist die laufanimation nur bild2 und bild3?
da hat nemored mich auf eine idee gebracht...
wenn das in einer for/next schleife läuft so wie in seinem beispiel ginge es einfach mit
Code: | for l as integer=0 to 15
?fix(l mod 2)
next l |
je ob gerade oder ungerade kommt nur 0 oder 1 bei raus das man dann aufs bild addieren könnte
funktioniert natürlich nur bei einer 2 bild animation.... _________________
 |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 14.11.2011, 18:12 Titel: |
|
|
Ich mal wieder. Das Problem ist leider immernoch nicht gelöst. Ich habe euch mal ein Bild gemalt, wie die Animation ablaufen soll:
Also wenn ich dir Taste "s" drücke, soll folgendes passieren:
Bild 1 zeichnen, 200 ms warten, Bild 2 zeichnen, 200 ms warten, Bild 3 zeichnen, 200 ms warten, wieder Bild 1 zeichnen, Stop.
Dazu habe ich folgenden Code geschrieben:
Code: | Type TChar
As String path
As Integer x,y
As Any Ptr img(12)
As Integer anim
End Type
Dim Shared As Integer Chars,Zeit,AnimTim
Dim Shared As String Key
Dim Shared As TChar Char(128)
Declare Function LoadChar(path As String)As Integer
Declare Sub DrawChar(char2 As Integer)
Function LoadChar(path As String)As Integer
Chars+=1
With Char(chars)
.path=path
For i As Integer=1 To 12
.img(i)=ImageCreate(16,19)
Bload .path+"/char"+Str(i)+".bmp",.img(i)
Next
.anim=1
End With
Return Chars
End Function
Sub DrawChar(char2 As Integer)
If Key="s" Then
If AnimTim<=Zeit-80 And Char(char2).anim=1 Then
Char(char2).y+=5
Char(char2).anim=2
End If
If AnimTim<=Zeit-80 And Char(char2).anim=2 Then
Char(char2).y+=5
Char(char2).anim=3
End If
If AnimTim<=Zeit-80 And Char(char2).anim=3 Then
Char(char2).y+=5
Char(char2).anim=1
AnimTim=Zeit
End If
End If
Put (Char(char2).x,Char(char2).y),Char(char2).img(Char(char2).anim),Trans
End Sub
Screenres 320,240,32
Var char1=LoadChar("gfx/char")
Do
Key=Inkey
Zeit+=1
Screenlock
Cls
DrawChar(char1)
Screenunlock
Sleep 1
Loop Until Key=Chr(27)
End |
Der funktioniert dummerweise nicht so wie er soll.
Die Funktion "DrawChar" müsste eigentlich alle 4 Pixel ein anderes Bild in der Animationsliste zeichnen, tut es aber leider nicht.
Das Gesamtpaket mit Sprites und Code könnt ihr hier runterladen: http://www.file-upload.net/download-3880002/Chartest.zip.html |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 14.11.2011, 18:33 Titel: |
|
|
Code: | Sub DrawChar(char2 As Integer)
If Key="s" Then
If AnimTim<=Zeit-80 And Char(char2).anim=1 Then
Char(char2).y+=5
Char(char2).anim=2
ElseIf AnimTim<=Zeit-80 And Char(char2).anim=2 Then
Char(char2).y+=5
Char(char2).anim=3
ElseIf AnimTim<=Zeit-80 And Char(char2).anim=3 Then
Char(char2).y+=5
Char(char2).anim=1
AnimTim=Zeit
End If
End If
Put (Char(char2).x,Char(char2).y),Char(char2).img(Char(char2).anim),Trans
End Sub |
probier ma mit ElseIf _________________
 |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 14.11.2011, 18:35 Titel: |
|
|
Oha, das sieht doch schon sehr viel besser aus. Vielen Dank Eternal_pain.
Jetzt noch eine letzte Frage: Wenn man "s" gedrückt hat, soll man insgesamt 16 Pixel auf einmal gehen, aber während diesen 16 Pixeln, müsste die gesamte Animation, also Bild 1,2,3,1, ablaufen. Wie stell ich das an? |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 14.11.2011, 18:44 Titel: |
|
|
ungefähr so...
Code: | const as Integer BinIchDoch = 1
Sub DrawChar(char2 As Integer)
If Key="s" and IchBinNochNichtInBewegung=0 Then
IchBinNochNichtInBewegung = BinIchDoch
End If
If IchBinNochNichtInBewegung = BinIchDoch Then
If AnimTim<=Zeit-80 And Char(char2).anim=1 Then
Char(char2).y+=5
Char(char2).anim=2
ElseIf AnimTim<=Zeit-80 And Char(char2).anim=2 Then
Char(char2).y+=5
Char(char2).anim=3
ElseIf AnimTim<=Zeit-80 And Char(char2).anim=3 Then
Char(char2).y+=5
Char(char2).anim=1
AnimTim=Zeit
End If
IchMussMichBewegen += 1 ''Irgendwo dazuzählen wo's hinsoll
If IchMussMichBewegen = 16 Then IchBinNochNichtInBewegung = 0
End If
Put (Char(char2).x,Char(char2).y),Char(char2).img(Char(char2).anim),Trans
End Sub |
_________________
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 14.11.2011, 18:57 Titel: |
|
|
oder vom Prinzip her
Code: | IchMussMichBewegen = (IchMussMichBewegen+1) MOD 16 |
Wenn wieder 0 erreicht wird, ist der Bewegungsablauf einmal durch. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 14.11.2011, 19:09 Titel: |
|
|
Nein, jetzt wird wieder keine Animation gezeigt, das Bild springt einfach nur 15(keine 16) Pixel weiter.  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 14.11.2011, 19:23 Titel: |
|
|
dann ändere mal das Char(char2).y+=5 auf Char(char2).y+=1
Code: |
Sub DrawChar(char2 As Integer)
If ( (Key="s") and (IchBinNichtInBewegung = 0) ) Then
IchBinNichtInBewegung = 1
End If
If IchBinNichtInBewegung = 1 Then
If AnimTim<=Zeit-80 Then
Char(char2).y += 1
Char(char2).anim = IIF( (Char(char2).anim + 1) = 4, 1, (Char(char2).anim + 1) )
End If
Wielangesollichlaufen += 1
If Wielangesollichlaufen = 16 Then
IchBinNichtInBewegung = 0
Wielangesollichlaufen = 0
End If
End If
Put (Char(char2).x,Char(char2).y),Char(char2).img(Char(char2).anim),Trans
End Sub
|
_________________
 |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 14.11.2011, 19:57 Titel: |
|
|
Aber dann habe ich doch mein altes Problem wieder, dass die Animation beim Überqueren von 16 Pixeln nicht abläuft, sondern nur, wenn man 3 mal 16 Pixel abläuft. |
|
Nach oben |
|
 |
|