Charakterbewegung mit animation

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

bobokox

Betreff: Charakterbewegung mit animation

BeitragSo, März 15, 2009 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 15, 2009 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
- 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. Zusammen mit der Variable Frame und Animation ergibt es dann deine Animation im Spiel. Das sähe dann so aus: DrawImage Charend,XP,YP,Frame+Animation
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

bobokox

BeitragSo, März 15, 2009 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, dein code ist um einiges kürzer, und um einiges übersichtlicher Smile - THX!
  • Zuletzt bearbeitet von bobokox am So, März 15, 2009 21:47, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragSo, März 15, 2009 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Danke für die Aufmerksamkeit Rolling Eyes

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

bobokox

BeitragMo, März 16, 2009 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
hab das mit dem zitat editiert Smile


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 Smile)

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

BeitragMo, März 16, 2009 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 17, 2009 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 1:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Probierst mal so Smile


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 Wink

bobokox

BeitragMi, März 18, 2009 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Wink
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

BeitragMi, März 18, 2009 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreib statt "/64" "/8" Rolling Eyes
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

BeitragMi, März 18, 2009 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
das hab ich schon probiert:
-arrey index out of bounds-

logisch, weil zb 160/8 = 20

Nicdel

BeitragMi, März 18, 2009 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 18, 2009 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group