Seite 3 von 3

Verfasst: 21.01.2007 02:37
von Zero_Cool
Muss leider auch nochmals auf die Animation zurückkomen!

Habe den Code nun verändert, das er Bilder zur Animation eines Sprite laden soll.

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenWindow(0,0,0,640,480,"Background-Tiles-Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 

#AnimFrames = 100   ; 16 versch. Anim-Frames 
#AnimStart  =  1    ; erstes Sprite der Animation 

;{ der ganze kram hier in diesem kommentarblock 
;  dient nur zum erzeugen der sprites 
;  wenn die sprites geladen werden, 
;  entfällt dieser block komplett. 
 CreateSprite(0,160,160)  ; hintergrund-tile 
 StartDrawing(SpriteOutput(0)) 
   Box(0,0,160,160,$200810) 
   For n=0 To 79 
     Plot(2*n,Random(159),Random($FFFFFF)) 
   Next 
 StopDrawing() 

TransparentSpriteColor(-1,$FF00FF) 

For Anim=0 To #AnimFrames-1 
 CreateSprite(#AnimStart+Anim,200,200) 
StartDrawing(SpriteOutput(#AnimStart+Anim)) 
Box(0,0,80,80,$FF00FF) 

LoadSprite(#AnimFrames+Anim, "gfx/img/player.bmp")
LoadSprite(#AnimFrames+Anim, "gfx/img/player1.bmp")
LoadSprite(#AnimFrames+Anim, "gfx/img/player2.bmp")
LoadSprite(#AnimFrames+Anim, "gfx/img/player3.bmp")
StopDrawing() 
;} 

BackX.f = 0 
BackY.f = 0 
MoveX.f = 0 
MoveY.f = 0 

Repeat 
  ExamineKeyboard() 
  event = WindowEvent() 
  ClearScreen(0) 

  If KeyboardPushed(#PB_Key_Right) 
    MoveX -0.2 : If MoveX < -4 : MoveX = -4 : EndIf 
  EndIf 
  If KeyboardPushed(#PB_Key_Left) 
    MoveX +0.2 : If MoveX >  4 : MoveX =  4 : EndIf 
  EndIf 
  If MoveX < 0 : MoveX  +0.1 : EndIf 
  If MoveX > 0 : MoveX  -0.1 : EndIf 

  If KeyboardPushed(#PB_Key_Down) 
    MoveY -0.2 : If MoveY < -3 : MoveY = -3 : EndIf 
  EndIf 
  If KeyboardPushed(#PB_Key_Up) 
    MoveY +0.2 : If MoveY >  5 : MoveY =  5 : EndIf 
  EndIf 
  If MoveY < 1 : MoveY  +0.1 : EndIf 
  If MoveY > 1 : MoveY  -0.1 : EndIf 

  BackX + MoveX 
  If BackX <   0 : BackX + 160 : EndIf 
  If BackX > 159 : BackX - 160 : EndIf 
  BackY + MoveY 
  If BackY <   0 : BackY + 160 : EndIf 
  If BackY > 159 : BackY - 160 : EndIf 

  For t=0 To 3        ; 480/160 = 3 , einer mehr = 4 
    For n=0 To 4      ; 640/160 = 4 , einer mehr = 5 
      DisplaySprite(0, 160*n -160 + BackX, 160*t -160 + BackY) 
    Next 
  Next 

  Anim+1: If Anim>#AnimFrames-1 : Anim = 0 : EndIf 

  DisplayTransparentSprite(#AnimStart+Anim,280,360) 

  FlipBuffers() 
Until event = #PB_Event_CloseWindow
Nur leider scheine ich noch einen Fehler gemacht zu haben, es blinkt jeweils nur das letzte Bild dieser 4 Bilder auf, die anderen werden gar nicht dargestellt. SCheint so, als hätte ich was noch nicht ganz kapiert :-)

Verfasst: 21.01.2007 02:59
von Kaeru Gaman
wenn du nur 4 sprites hast, musst du natürlich auch die konstante, die die anzahl der frames angibt, auf 4 setzen.

außerdem sind deine filenamen nicht schleifentauglich, aber bei vier stück ist das egal, da brauchste auch keine schleife.

Code: Alles auswählen

#AnimFrames = 4   ; 4 versch. Anim-Frames 
#AnimStart  =  1    ; erstes Sprite der Animation 

;{ der ganze kram hier in diesem kommentarblock 
;  dient nur zum erzeugen der sprites 
;  wenn die sprites geladen werden, 
;  entfällt dieser block komplett. 
 CreateSprite(0,160,160)  ; hintergrund-tile 
 StartDrawing(SpriteOutput(0)) 
   Box(0,0,160,160,$200810) 
   For n=0 To 79 
     Plot(2*n,Random(159),Random($FFFFFF)) 
   Next 
 StopDrawing() 

TransparentSpriteColor(-1,$FF00FF) 

LoadSprite(#AnimStart   , "gfx/img/player.bmp") 
LoadSprite(#AnimStart +1, "gfx/img/player1.bmp") 
LoadSprite(#AnimStart +2, "gfx/img/player2.bmp") 
LoadSprite(#AnimStart +3, "gfx/img/player3.bmp") 

;} 
bei umwandeln von WaponezII mit dem converter wirst du probleme haben,
der code ist nämlich Ver 3.1 oder sowas, also wirklich asbach.
der musste ja sogar angepasst werden, um auf 3.30 vernünftig zu laufen.

dass du die linkedlist als global erzeugen musst, muss logischerweise dort ersetzt werden,
wo auch zuvor die linkedlist erzeugt wurde, also dort, wo schon newlist stand.

waponez ist ein nettes beispiel für die verwendung von LLs für die schüsse,
aber die gosub-geschichten sind überaltet.

trotzdem kann es nicht schaden, wenn du es umschreibst - per hand - um es auf 4.0 zum laufen zu bekommen.
das wäre ne gute übung, denn dir werden auch beim richtigen proggen immer wieder fehlermeldungen unterkommen,
und dann musst du suchen, wo du den fehler gemacht hast.


aber grundsätzlich musst du erst einmal verstehen lernen, was code eigentlich tut.
und da sollte es dir nicht passieren, dass du die schleife viel zu groß machst,
indem du die konstante sinnlos hoch setzt (wo noch dahinter steht, dass die gesamtzahl frames damit gemeint ist)
und dass du das create einfach drinläßt,
und dann auch noch vier load-befehle in eine schleife schreibst, die hundert mal durchlaufen wird.

da solltest du erst mal verstehen, was dort falsch ist und warum es falsch ist.
solange du keine vorstellung von schleifen und variablen und sonstigen vorgängen entwickelst,
wirst du nix programmieren können, sorry.

Verfasst: 21.01.2007 03:15
von Zero_Cool
Hey,

Stimmt, du hast recht! Ist mir natürlich selbst auch klar! Nur lerne ich das ganze lieber mit einem aufwendigen Projekt indem ich probiere, als trocken mit einem "Hallo Welt" zu beginnen, ich weiss ich nicht gerade normal, aber so bin ich nun mal!

Werde mich aber sicher mal etwas mehr den Grundlagen zuwenden!

Eine letzte Frage, und danach bleibe ich auch still :-) Ist es möglich zu bestimmen, wie schnell respektive wie lange hintereinander die Bilder dargestellt werden? Zum Beispiel, Bild 1 = 1 Sekunde, Bild 2 = 2 Sekunden, Bild 3 = 10 Sekunden und Bild 4 = 1 Minute?

Danke und ein schöner Abend!

Verfasst: 21.01.2007 03:30
von Kaeru Gaman
> Eine letzte Frage, und danach bleibe ich auch still

so hab ich das ja garnicht gemeint.
und is ja auch ok, wenn du ins kalte wasser springen willst.


in dem vorliegenden code sorgt das hochzähler von Anim dafür,
dass das nächste bild angezeigt wird.

in jedem frame des screens wird die haupt-repeat-schleife einmal durchlaufen,
also ändert sich im moment jeden screenframe der animframe.

du könntest vor das hochzählen des animframes einen counter einbaun.

Code: Alles auswählen

  counter +1
  If counter > 99
    counter = 0
    Anim+1
    If Anim>#AnimFrames-1
      Anim = 0
    EndIf
  EndIf
hier wird jetzt nur jeder 100ste screenframe der animframe hochgesetzt.
wenn du die animframes unterschiedlich lange anzeigen willst, könntest du dir ein array machen,
wo für jeden animframe die verweildauer gespeichert wird.