Animation einer Spielfigur

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

MikO

Betreff: Animation einer Spielfigur

BeitragMi, Aug 15, 2007 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen.

ich programmiere seit 7 jahren php (zum teil auch gewerblich) und habe mir gedacht, ich könnte mal etwas in einer web-fremden programmiersprache versuchen und bin deshalb auf bb gestoßen. die meisten befehle sind mir noch aus zeiten des Q-basic bekannt Wink, was zwar lange her ist, mir den einstieg aber wesentlich erleichtert.

nun zu meinem Problem...

ich möchte eine spielfigur beim drücken des nach rechts pfeils nach rechts laufen lassen, und habe dafür eine animation geplant...

nur iwie scheint das nicht ganz zu klappen...

wäre sehr freundlich, wenn mir jemand sagen könnte, was an meinem code nicht stimmt...

hier mal der code...

Code: [AUSKLAPPEN]
Cls

Graphics 800, 600
ClsColor 255, 255, 255



SetBuffer BackBuffer()
Repeat
Cls



n = 0

While n < 12

Delay 10
Cls

bild = LoadAnimImage("pics/guy.bmp", 48, 57, 0, 12)
MaskImage bild, 0, 255, 0
DrawImage bild, 1,200,n

n = n + 1


Wend



Flip
Until KeyHit(1)

End


Vielen Dank bereits im Vorraus

Gruß

MikO[/code]

Xeres

Moderator

BeitragMi, Aug 15, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Du verwendest 2 Schleifen. Dabei gehst du in der inneren alle Animationsframes durch, siehst diese aber nicht, weil das Bild nur in der äußeren Schleife mit flip aktualisiert wird. Realisier das ganze in einer Schleife, am besten ohne delay, sondern mit einem timer (endweder createtimer() oder über Millisecs()).
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)
 

MikO

Betreff: RE

BeitragMi, Aug 15, 2007 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnelle Hilfe...

ich habe jetzt erst diese flip funktion aus robssite verstanden^^
funtkioniert soweit...

jetz kommt die tasten abfrage...

ist ein
Code: [AUSKLAPPEN]
while keydown(203) = 1


zu empfehlen?[/code]
Bei Fragen zu PHP, HTML oder Javascript einfach eine IM an mich, oder eine eMail an miko@fantax.de.vu

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Aug 15, 2007 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir mal dein Code genommen und versucht nach deinen Angaben zu lösen. Ich weiß natürlich nicht genau, was du vor hattest, was natürlich dann etwas unstimmig sein könnte. Aber alle Änderungen habe ich ein bisschen kommentiert

Hier der Code: [AUSKLAPPEN]
;Zusammenhängende Sachen würde ich auch zusammen schreiben
;Ausserdem empfield es sich, alle Parameter auszuschreiben
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

ClsColor 255, 255, 255

;Variable BILD muss nur einmal mit dem Handle vom Image geladen werden
bild = LoadAnimImage("pics/guy.bmp", 48, 57, 0, 12)

;Auch MaskImage bleibt erhalten und muss nicht in einer Schleife wiederholt werden
MaskImage bild, 0, 255, 0

;Hier wird (wie von Xeres beschrieben) eine Framebegrenzung eingestellt
timer=CreateTimer(60)




While Not KeyHit(1)

   If KeyDown(203) n=n-1:If n<0 n=11
   If KeyDown(205) n=(n+1) Mod 12

   DrawImage bild, 1, 200, n

   ;Hier wird auf Maximal der eingestellten Framebegrenzung gewartet
   WaitTimer(timer)

   ;Filp mit 0 als Parameter wartet nicht mehr auf VSync und entlastet den Prozessor ENORM
   Flip 0
   Cls
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

MikO

BeitragMi, Aug 15, 2007 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
so...
hamwa alles eingenaut und ein bisschen erweitert... jetz habich ein männchen, das sich nach rechts und links über den bildschirm bewegen lässt.
Code: [AUSKLAPPEN]
;Zusammenhängende Sachen würde ich auch zusammen schreiben
;Ausserdem empfield es sich, alle Parameter auszuschreiben
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

ClsColor 255, 255, 255

;Variable BILD muss nur einmal mit dem Handle vom Image geladen werden
bild = LoadAnimImage("pics/guy.bmp", 48, 57, 0, 12)
bild2 = LoadAnimImage("pics/guy2.bmp", 48, 57, 0, 12)
bild3 = LoadImage("pics\guy_stay.bmp")


;Auch MaskImage bleibt erhalten und muss nicht in einer Schleife wiederholt werden
MaskImage bild, 0, 255, 0
MaskImage bild2, 0, 255, 0
MaskImage bild3, 0, 255, 0

;Hier wird (wie von Xeres beschrieben) eine Framebegrenzung eingestellt
timer=CreateTimer(60)




While Not KeyHit(1)

   If KeyDown(203) n=n-1 Mod 12 x=x-3: DrawImage bild2, x, 200,n : If n<0 n=12
   If KeyDown(205) n=(n+1) Mod 12  x=x+3 DrawImage bild, x, 200,n


Color 0,0,0
FlushKeys
If KeyDown(203)=0 And KeyDown(205) = 0 Then
DrawImage bild3, x, 200
EndIf


Rect 0,254, 800, 300 ,1
   ;Hier wird auf Maximal der eingestellten Framebegrenzung gewartet
   WaitTimer(timer)

   ;Filp mit 0 als Parameter wartet nicht mehr auf VSync und entlastet den Prozessor ENORM
   Flip 0
   Cls
Wend
End

allerdings meldet er nach ca. 2 sek. "nach links laufen" "image frame out of range"

hat das evtl etwas mit diesem mod 12 zu tun?
wenn nein...
welche funktion hat das?
konnte ich leider nicht ganz nachvollziehen

aber wie gesagt..
dankeschön. es hat mir viel arbeit gespart und bb ist mir wieder ein stückchen klarer geworden^^
Bei Fragen zu PHP, HTML oder Javascript einfach eine IM an mich, oder eine eMail an miko@fantax.de.vu

Xeres

Moderator

BeitragMi, Aug 15, 2007 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Logisch, Starte mal mit Debugger und schau dir die Variable n zu dem Zeitpunkt an. Wenn n = 0 war, wird es durch n = n-1 Mod 12 = -1. Und dieser Frame existiert natürlich nicht.
Mod gibt den Rest einer Division zurück, in diesem Fall kann man damit das Maximum an Frames festlegen, weil 13 durch 12 = 1 und Rest 1 ergibt.
Code: [AUSKLAPPEN]
If KeyDown(203) n=n-1 : x=x-3 : DrawImage bild2, x, 200,n : If n<0 then n=12
If KeyDown(205) n=n+1 : x=x+3 : DrawImage bild, x, 200,n : if n>12 then n=0

Bei if besser nie then weglassen (auch wenn es möglich ist) um Übersicht zu bewahren.
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)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Aug 16, 2007 1:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also rein logisch gesehen, würde ich es jetzt wie folgt machen:

Code: [AUSKLAPPEN]
If KeyDown(203) n=n+1 : x=x-3 : DrawImage bild2, x, 200,n
If KeyDown(205) n=n+1 : x=x+3 : DrawImage bild, x, 200,n

Entweder, du machst eine If-Abfrage um die Frames einzugrenzen, oder mit Mod. Beides zusammen in einer Framebegrenzung ist Unfug. In meinem ersten Beispiel, habe ich beide einzeln bearbeitet, um dir beide Möglichkeiten zu demonstrieren. Dabei habe ich ql:Mod bei n=n+1 und eine If-Abfrage bei n=n-1 gemacht. Somit also voneinander getrennt.

Da du nun ein zweites Bild Bild2 genommen hast, kannst du auch beide vorwärts laufen lassen, und die Framebegrenzung auch gleich mit Mod machen. Sollte nun die Bildreihenfolge nicht mehr stimmen, so würde ich die Bilder im Image selbst ändern. Dies hätte auch den Vorteil, dass sich nur die Laufrichtung ändert, aber die Animation selbst gleichbleibend fleisst.

Tip: Du kannst du beide Laufanimationen in ein Bild packen und sie dann entsprechend auslesen.^^




edit1: Hey, du da unten. Es ist jetzt 8 Monate her. Nur so zur Info Exclamation
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
  • Zuletzt bearbeitet von hectic am Sa, Apr 12, 2008 13:03, insgesamt 2-mal bearbeitet

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group