Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bilder nacheinander zeichnen(Animation)
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.08.2011, 17:27    Titel: Bilder nacheinander zeichnen(Animation) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 30.08.2011, 19:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 30.08.2011, 19:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.08.2011, 19:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 30.08.2011, 20:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.08.2011, 21:23    Titel: Antworten mit Zitat

Das hilft mir aber nicht weiter. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 30.08.2011, 21:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.08.2011, 22:08    Titel: Antworten mit 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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 30.08.2011, 22:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 30.08.2011, 22:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 30.08.2011, 22:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 31.08.2011, 06:36    Titel: Antworten mit Zitat

hoffentlich final edit: grinsen

Animtest in 4 Richtungen über eine Tilemap
gesteuert wird mit "wasd"
http://www.freebasic-portal.de/porticula/amintest-1318.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 14.11.2011, 18:12    Titel: Antworten mit Zitat

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. traurig
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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 14.11.2011, 18:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 14.11.2011, 18:35    Titel: Antworten mit Zitat

Oha, das sieht doch schon sehr viel besser aus. Vielen Dank Eternal_pain. zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 14.11.2011, 18:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 14.11.2011, 18:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 14.11.2011, 19:09    Titel: Antworten mit Zitat

Nein, jetzt wird wieder keine Animation gezeigt, das Bild springt einfach nur 15(keine 16) Pixel weiter. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 14.11.2011, 19:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 14.11.2011, 19:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz