Animation einer Spielfigur
Übersicht

MikOBetreff: Animation einer Spielfigur |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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] |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
MikOBetreff: RE |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group