Charakterbewegung mit animation
Übersicht

![]() |
bobokoxBetreff: Charakterbewegung mit animation |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi!
Bin neu im BB, hab vorher jahrelang im QB geproggt, allerdings nie sehr professionell. bin gerade dabei mich in die welt der tiles vorzutasten, und bin begeistert von den möglichkeiten. Allerdings hab ich gerade ein kleines problem mit dem durchblick: im qb war mein lieblingsbefehl GOTO (schande über mein haupt) - jetzt will ich einfach alles mit if abfragen lösen, und goto vollkommen vermeiden. Nur, wie mach ich am besten eine Animation, wenn ich meinen Charakter bewege? hier mal mein code: Code: [AUSKLAPPEN] Graphics 1024,768,16,1 tileset = LoadAnimImage("tiles1.bmp",64,64,0,15) charend = LoadAnimImage ("charend.bmp", 64,64,0,12) px = 1 py = 2 moved=1 Dim map(15,11) Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,1,1,1,0,1,0,1,1,1,0,1,1,0,0 Data 0,5,5,5,5,5,10,1,1,1,1,1,1,1,3,4 Data 0,0,1,1,1,0,6,1,2,1,1,1,1,1,1,1 Data 0,1,1,0,1,1,6,1,0,1,1,1,1,1,1,1 Data 0,1,1,1,1,1,6,1,1,1,1,1,0,1,1,1 Data 0,0,1,1,2,1,6,0,1,1,1,1,1,0,1,1 Data 0,1,1,1,1,1,13,5,5,5,5,5,5,5,5,5 Data 0,0,1,1,1,1,6,0,1,1,1,0,1,1,1,1 Data 0,1,1,0,0,1,6,1,1,1,1,1,1,4,3,1 Data 0,1,1,1,0,1,6,1,1,0,1,1,1,1,1,1 Data 0,0,1,1,1,1,6,1,1,1,1,1,1,1,1,1 For y = 0 To 11 For x = 0 To 15 Read map(x,y) Next Next Repeat SetBuffer BackBuffer() Cls If KeyDown(1) End For y = 0 To 11 For x = 0 To 15 DrawImage tileset,x*64,y*64,map(x,y) Next Next If KeyDown(17) Then ;w If map(px,py-1) > 0 Then py = py - 1 movew = 1 movea = 0 moves = 0 moved = 0 End If End If If KeyDown(31) Then ;s If map(px,py+1) > 0 Then py = py + 1 moves = 1 movew = 0 movea = 0 moved = 0 End If End If If KeyDown(32) Then ;d If map(px+1,py) > 0 Then px = px + 1 moved = 1 movew = 0 movea = 0 moves = 0 End If End If If KeyDown(30) Then ;a If map(px-1,py) > 0 Then px = px - 1 movea = 1 movew = 0 moves = 0 moved = 0 End If End If If movew = 1 x = px * 64: y = py * 64-20:DrawImage charend,x,y, 3: Delay 100 If moves = 1 x = px * 64: y = py * 64-20:DrawImage charend,x,y, 0: Delay 100 If moved = 1 x = px * 64: y = py * 64-20:DrawImage charend,x,y, 6: Delay 100 If movea = 1 x = px * 64: y = py * 64-20:DrawImage charend,x,y, 9: Delay 100 Flip Forever also mein player dreht und bewegt sich bei den tasten w, a, s, d in die gewünschte richtung, mein chartileset beinhaltet aber auch noch eine animation fürs gehn - meine frage: wie kaann ich das am besten in mein script einbauen... ich kenne nur die möglichkeit mit frame + variable, und die variable steigt 1 und geht dann wieder auf null, aber ich werde dass gefühl nicht los, dass es in diesem fall eine einfachere lösung gibt?! Thx for help yours bobokox |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
- Lerne gleich den Code richtig einzurücken. Dabei kann zum Beispiel auch eine anständige IDE helfen, wie auch in andern Dingen. Dazu suche mal nach IDEal hier im Forum.
- Der Befehl Setbuffer Backbuffer() gehört nicht in die Schleife. Es reicht, wenn dieser einmal ausgeführt wird. - Versuche nicht mit so vielen unnütz-Variablen zu jonglieren. Versuche das ganze mit weniger und gleichzeitig effizienter zu lösen. Hier meine Version von deinem Code: Code: [AUSKLAPPEN] Graphics 1024,768,0,2
SetBuffer BackBuffer() Const STEPS=64 Local Timer=CreateTimer(10) Local Tileset=LoadAnimImage("tiles1.bmp",64,64,0,15) Local Charend=LoadAnimImage ("charend.bmp", 64,64,0,12) ;Local Tileset=LoadAnimImage("E:\Blitz3D\Data\tilemap.png",64,64,0,15) ;Local Charend=LoadAnimImage("E:\Blitz3D\Data\mond.png",64,64,0,12) Local XP,YP Local XS,YS Local Frame Dim map(15,11) Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,1,1,1,0,1,0,1,1,1,0,1,1,0,0 Data 0,5,5,5,5,5,10,1,1,1,1,1,1,1,3,4 Data 0,0,1,1,1,0,6,1,2,1,1,1,1,1,1,1 Data 0,1,1,0,1,1,6,1,0,1,1,1,1,1,1,1 Data 0,1,1,1,1,1,6,1,1,1,1,1,0,1,1,1 Data 0,0,1,1,2,1,6,0,1,1,1,1,1,0,1,1 Data 0,1,1,1,1,1,13,5,5,5,5,5,5,5,5,5 Data 0,0,1,1,1,1,6,0,1,1,1,0,1,1,1,1 Data 0,1,1,0,0,1,6,1,1,1,1,1,1,4,3,1 Data 0,1,1,1,0,1,6,1,1,0,1,1,1,1,1,1 Data 0,0,1,1,1,1,6,1,1,1,1,1,1,1,1,1 For YS=0 To 11 For XS=0 To 15 Read map(XS,YS) Next Next While Not KeyHit(1) Cls For YS=0 To 11 For XS=0 To 15 DrawImage Tileset,XS*64,YS*64,map(XS,YS) Next Next If KeyDown(17) Then Frame=3:YP=YP-STEPS If KeyDown(31) Then Frame=0:YP=YP+STEPS If KeyDown(32) Then Frame=6:XP=XP+STEPS If KeyDown(30) Then Frame=9:XP=XP-STEPS DrawImage Charend,XP,YP,Frame WaitTimer Timer Flip 0 Wend End Edit1: Eine Animation machst du am einfachsten, indem du zum Beispiel eine Variable Animation nennst und sie bei Tastendruck immer um +1 erhöhst, egal in welche Richtung man läuft. Damit Animation nicht zu groß wird, benutze dazu dann Mod ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, dein code ist um einiges kürzer, und um einiges übersichtlicher ![]() |
||
- Zuletzt bearbeitet von bobokox am So, März 15, 2009 21:47, insgesamt einmal bearbeitet
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Btw: Du solltest nie ganze Beiträge zitieren, erst recht nicht, wenns der Beitrag deines Vorredners ist und's ohnehin klar ist, auf wen du dich beziehst. Wir mögen nicht nur im Code Struktur und Sauberkeit, sondern eben auch hier im Forum ![]() Danke für die Aufmerksamkeit ![]() mfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
hab das mit dem zitat editiert ![]() also, das mit der ani hab ich jetzt gut hinbekommen. nun häng ich woanderst: auf meiner tilemap ist der frame nr 0 ein baum - da man durch bäume ja bekanntlich nicht einfach so durchmaschieren kann, soll das ding auch im spiel ein hinderniss darstellen. also ich mach: Code: [AUSKLAPPEN] If KeyDown(17) And map(xp,yp-64)>0 Then Frame=3:YP=YP-STEPS: ani=(ani+1) Mod 3:
array index out of bounds, sagt er dann... WARUM? also ich hab xp und yp einen wert von je 128 gegeben. und 64 ist die tilegröße, ich blick nicht durch.... hier der rest vom code (nochmal thx to hectic ![]() Code: [AUSKLAPPEN] Graphics 1024,768,0,1
SetBuffer BackBuffer() Const STEPS=8 Local Timer=CreateTimer(10) Local Tileset=LoadAnimImage("tiles1.bmp",64,64,0,15) Local Charend=LoadAnimImage ("charend.bmp", 64,64,0,12) Local XP,YP Local XS,YS Local Frame Dim map(15,11) Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,1,1,1,0,1,0,1,1,1,0,1,1,0,0 Data 0,5,5,5,5,5,10,1,1,1,1,1,1,1,3,4 Data 0,0,1,1,1,0,6,1,2,1,1,1,1,1,1,1 Data 0,1,1,0,1,1,6,1,0,1,1,1,1,1,1,1 Data 0,1,1,1,1,1,6,1,1,1,1,1,0,1,1,1 Data 0,0,1,1,2,1,6,0,1,1,1,1,1,0,1,1 Data 0,1,1,1,1,1,13,5,5,5,5,5,5,5,5,5 Data 0,0,1,1,1,1,6,0,1,1,1,0,1,1,1,1 Data 0,1,1,0,0,1,6,1,1,1,1,1,1,4,3,1 Data 0,1,1,1,0,1,6,1,1,0,1,1,1,1,1,1 Data 0,0,1,1,1,1,6,1,1,1,1,1,1,1,1,1 For YS=0 To 11 For XS=0 To 15 Read map(XS,YS) Next Next xp=128 yp=128 While Not KeyHit(1) Cls For YS=0 To 11 For XS=0 To 15 DrawImage Tileset,XS*64,YS*64,map(XS,YS) Next Next [b] If KeyDown(17) And map(xp,yp-64)>0 Then Frame=3:YP=YP-STEPS: ani=(ani+1) Mod 3: If KeyDown(31) And map(xp,yp+64)>0 Then Frame=0:YP=YP+STEPS: ani=(ani+1) Mod 3: If KeyDown(32) And map(xp+64,yp)>0 Then Frame=6:XP=XP+STEPS: ani=(ani+1) Mod 3: If KeyDown(30) And map(xp-64,yp)>0 Then Frame=9:XP=XP-STEPS: ani=(ani+1) Mod 3:[/b] DrawImage Charend,XP,YP,Frame + ani WaitTimer Timer Flip 0 Wend End danke euch cheers bobokox |
||
![]() |
Chrizz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Fehler liegt bei deiner For Next Schleife. Du hast ein Dim-Feld mit 15 und 11 Einträgen erstellt, willst aber durch deine Schleife auf 16 bzw. 12 Einträge zugreifen. Dadurch bringt Blitz dann eine Fehlermeldung raus.
Richtig müsste es so heißen: Code: [AUSKLAPPEN] For YS=0 To 10 For XS=0 To 14 Read map(XS,YS) Next Next |
||
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, danke für den post.
habs abgeändert, nur leider reagiert bb bei der kollisionsabfrage gleich... also der wurm muss irgendwo hier liegen, nur kann ich leider nix fehlerhaftes an diesen codezeilen erkennen: Code: [AUSKLAPPEN] If KeyDown(17) And map(xp,yp-64)>0 Then Frame=3:YP=YP-STEPS: ani=(ani+1) Mod 3:
If KeyDown(31) And map(xp,yp+64)>0 Then Frame=0:YP=YP+STEPS: ani=(ani+1) Mod 3: If KeyDown(32) And map(xp+64,yp)>0 Then Frame=6:XP=XP+STEPS: ani=(ani+1) Mod 3: If KeyDown(30) And map(xp-64,yp)>0 Then Frame=9:XP=XP-STEPS: ani=(ani+1) Mod 3: |
||
Shoker |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Probierst mal so ![]() Code: [AUSKLAPPEN] If KeyDown(17) And map(xp/64,(yp/64)-1)>0 Then Frame=3:YP=YP-STEPS: ani=(ani+1) Mod 3 If KeyDown(31) And map(xp/64,(yp/64)+1)>0 Then Frame=0:YP=YP+STEPS: ani=(ani+1) Mod 3 If KeyDown(32) And map((xp/64)+1,yp/64)>0 Then Frame=6:XP=XP+STEPS: ani=(ani+1) Mod 3 If KeyDown(30) And map((xp/64)-1,yp/64)>0 Then Frame=9:XP=XP-STEPS: ani=(ani+1) Mod 3 Wenn du Map(xp,yp-64) prüfen lässt, wäre bei einem Wert von YP = 128 der eintrag bei Map(xp,64) und soviele Felder hat dein Dimfeld nicht. Da ein Tile bei dir 64px hat, teilst du es voher und rechnest danach einfach ein Tile in die gewünschte Richtung ![]() |
||
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn ich steps jetzt auf 64 setze funzts perfekt - Thx
auf steps=8 geht allerding nix mehr so wie es soll, gibts da irgnd nen trick? weil 64 wirkt ziemlich stockend, 8 relativ flüssig... -.- |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich denke mal das liegt an diesen Zeilen:
If KeyDown(17) And map(xp/64,(yp/64)-1)>0 Then Frame=3:YP=YP-STEPS: ani=(ani+1) Mod 3 If KeyDown(31) And map(xp/64,(yp/64)+1)>0 Then Frame=0:YP=YP+STEPS: ani=(ani+1) Mod 3 If KeyDown(32) And map((xp/64)+1,yp/64)>0 Then Frame=6:XP=XP+STEPS: ani=(ani+1) Mod 3 If KeyDown(30) And map((xp/64)-1,yp/64)>0 Then Frame=9:XP=XP-STEPS: ani=(ani+1) Mod 3 ![]() |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schon klar - aber xp und yp werden ja durch 64 geteilt, weil ein tile 64 x 64 px ist.
wenn ich jetzt step 64 setze, also wenn der char iimmr genau um ein tile wandert, dann funzts wunderbar, allerdings wenn der char nur um 8 wandert, dann geht nix mehr - weil sich die zahl die aus xp/yp +- steps (8) entsteht nicht mehr genau durch 64 teilen lässt. ich frage mich jetzt, wo ich ansetzen kann, um dieses problem zu beheben. das einzige was mir einfällt wäre, die kollisionsabfrage nur durchzuführen, wenn sich xp bzw yp durch 64 teilen lässt, aber dazu muss ich den ganzen code wieder verkomplizieren, und ich glaub irgndwie nicht dass das nötig ist?! hat jemand bessere vorschläge? thx lg bob |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schreib statt "/64" "/8" ![]() |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
das hab ich schon probiert:
-arrey index out of bounds- logisch, weil zb 160/8 = 20 |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann mach das Array halt größer. | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Array is seine Map und 64 seine Tilegröße, das muss so bleiben Nicdel.
Mich würde auf die Schnelle nur interessieren: Zitat: auf steps=8 geht allerding nix mehr so wie es soll
Was heißt das genau? |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
also "genau" heißt das.
mein char rennt entweder durch tile 0 einfach durch, oder er bleibt ein tile zu früh stehen, oder er bleibt einfach mitm kopp in passierbaren tiles hängen xD |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dachte nur, dass das geht. Ich hab noch nie richtig mit Tilemaps gearbeitet... | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
Shoker |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also dann würde ich es so schreiben:
Code: [AUSKLAPPEN] If KeyDown(17) And map(xp/64,((yp-Steps)/64)-(1/Steps))>0 Then Frame=3:YP=YP-STEPS: ani=(ani+1) Mod 3 If KeyDown(31) And map(xp/64,(yp/64)+1)>0 Then Frame=0:YP=YP+STEPS: ani=(ani+1) Mod 3 If KeyDown(32) And map((xp/64)+1,yp/64)>0 Then Frame=6:XP=XP+STEPS: ani=(ani+1) Mod 3 If KeyDown(30) And map((xp-Steps)/64-(1/Steps),yp/64)>0 Then Frame=9:XP=XP-STEPS: ani=(ani+1) Mod 3 Allerdings musst du nun wenn du in eine Richtung gehst 2 stellen testen. Wenn du also zb nach oben möchtest, musst du die Ecke obenlinks und obenrechts testen. Probier das mal hinzukriegen, ansonsten helfe ich dir gerne weiter. |
||
![]() |
bobokox |
![]() Antworten mit Zitat ![]() |
---|---|---|
thx, das ganze funktioniert jetzt schon um einiges besser.
ich bin aber wieder mal verwirrt, und blick nicht ganz durch, warum es nun besser funktioniert xD das prob ist noch, dass ich, wenn ich meinen char nicht direkt auf einem tile stehn hab, einfach durch die obere hälfte des hindernisses durchrennen kann. ich glaub dass meinst du auch mit der abfrage der 2 punkte, oder? _______________ l*².....................*³l l.............................l l.............................l l.............................l l.............................l l.............................l ------------------------ also wenn das mein char ist (64 x 64) - dann muss ich aufpassen dass weder *² noch *³ mit tile 0 kollidiert? |
||
... sie verurteilen uns nach ihrem scheiß Gesetz: Wer das Geld hat, hat die Macht und wer die Macht hat, hat das Recht! |
Shoker |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau, Das wäre jetzt wenn du nach oben gehen würdest, nach rechts wären es halt die beiden rechten ecken... Und wenn du das auch geprüft hast, kannst du auch nicht mehr durch die hälften durch laufen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group