Seite 1 von 1

Sprite Animation

Verfasst: 19.12.2007 22:00
von obar
Hallo zusammen,

habe eigentlich 3 Fragen.

1. Kennt jemand eine Internet-Seite wo ich Raumschiffsprites (Vertikal-Shooter) erhalte, die ich in eigenen Projekten verwenden kann?

2 Im Code unten habe ich mal eine Sprite Animation geproggt. Ich möchte eigentlich wissen ob dies so gut ist, oder jemand Verbesserungsvorschläge hat.

3. Allgemein hätte ich noch gerne gewusst, wie es aussieht mit definition von Variablen. Ich habe mir schon angewöhnt Global zu verwenden. Ich sehe hier aber immer wieder, dass dies nicht gerne gesehen wird. Nun hätte ich in meinem Animations-Beispiel gerne gesehen, wie ihr die Variablen deklarieren würdet.

Code: Alles auswählen

;*****************************
;** Define
;*****************************
Global playerX      = 100
Global playerY      = 100
Global AnimFrame.l  = 111
Global counter.l    = 0
;*****************************
;** Enumuration
;*****************************


;*****************************
;** Daten Laden
;*****************************
UsePNGImageDecoder()


;*****************************
;** Struktur & Arrays
;*****************************


;*****************************
;** Proceduren
;*****************************
Procedure check(value.l, text.s) 
   If Value = 0 
      MessageRequester("error", text, 0) 
      End 
   EndIf 
EndProcedure

Procedure Init()
  check(InitSound(),    "InitSound() failed")
  check(InitKeyboard(), "InitKeyboard() failed")
  check(InitMouse(),    "InitMouse() failed")
  check(InitSprite(),   "InitSprite() failed")
  win1Nr.l = OpenScreen(#ResX, #ResY, #BPP, "")
  check( win1Nr, "OpenScreen() failed")
EndProcedure

Procedure Steuerung()
  If KeyboardPushed(#PB_Key_Left) 
    If AnimFrame > 114 And AnimFrame < 118
      If playerX > 1
        playerX - 2
        counter + 1
        If counter > 2  
          AnimFrame + 1  
          counter = 0
        EndIf
      EndIf
    
    Else
      AnimFrame = 115
    EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
    
    If AnimFrame > 118 And AnimFrame < 122
      If playerX < 800 - SpriteWidth(AnimFrame)
        playerX + 2
        counter + 1
        If counter > 2
          AnimFrame + 1  
          counter = 0
        EndIf
      EndIf
    Else
      AnimFrame = 119
    EndIf
  
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    
    If AnimFrame > 122 And AnimFrame < 126
      If playerY > 0
        playerY - 2
        counter + 1
        If counter > 2
          AnimFrame + 1
          counter = 0
        EndIf
      EndIf
    Else
      AnimFrame = 123
    EndIf
  
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)
    
    If AnimFrame > 110 And AnimFrame < 114
      If playerY < 600 - SpriteHeight(AnimFrame) 
        playerY + 2
        counter + 1
        If counter > 2
          AnimFrame + 1  
          counter = 0
        EndIf
      EndIf
    Else
      AnimFrame = 111
    EndIf
  
  EndIf
  
  If KeyboardPushed(#PB_Key_LeftControl)
  ; #PB_Key_LeftControl
  EndIf
    
  If KeyboardPushed(#PB_Key_Escape)
    End ;ProgrammAbbruch
  EndIf  
EndProcedure

;*****************************
;** Sprites Laden
;*****************************
Init()

For i = 111 To 126
  LoadSprite(i, ".\Grafik\" + Str(i) + ".png")
  TransparentSpriteColor(i, RGB(0,255,255))  
Next

;*****************************
;** Loop
;*****************************

Repeat 
  ClearScreen(0)
  ExamineKeyboard()
  Steuerung()
  DisplayTransparentSprite(AnimFrame,playerX, playerY)
    
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End

Verfasst: 20.12.2007 08:35
von PureLust
zu 1.) Bei sowas ist die Google-Bildersuche ab und zu ganz brauchbar (z.B. Suche nach "Spaceship",...).
Wenn Du mir aber sagst wie groß Dein Raumschiff in etwa sein soll, könnte ich Dir schnell in LightWave ein paar rendern (die könnten dann in etwa SO oder auch SO aussehen - nur dann natürlich in der von Dir gewünschten Perspective).

zu 2.) Ohne das Du die Sprites mitlieferst wird man wohl kaum Deine Animation beurteilen können.

Greetz, PL.

Verfasst: 20.12.2007 10:18
von obar
@PureLust
Gott, sehen die geil aus. :o Aber das ist nicht ganz das was ich brauche.
Ich brauche es für einen 2d Vertikal Shooter Grösse etwa 20 X 20 bis 24 x 24.

Zu Punkt 2 und 3: Ich versuchs mal zu Beschreiben. Es sind 16 Sprites. Für jede Richtung 4.
Diese habe ich aus einer Tilemap ausgeschnitten und sie durchnummeriert von 111-126. Die vier Sprites für eine Richtung sind jeweils so aufgebaut --> stehen --> linkes Bein rechter arm vor --> stehen --> rechtes Bein linker Arm vor --> stehen. Wenn dies nicht reichen sollte, kannst du mir ev. einen Tip wo ich die Sprites hochladen könnte?

Verfasst: 20.12.2007 10:31
von PureLust
obar hat geschrieben:@PureLust
Gott, sehen die geil aus. :o Aber das ist nicht ganz das was ich brauche.
Ich brauche es für einen 2d Vertikal Shooter Grösse etwa 20 X 20 bis 24 x 24.
Das Du das für einen 2D-Shooter brauchst ist mir schon klar.
Ich könnte Dir halt aus diesen (oder ähnlichen) 3D-Modellen entsprechende 2D-Grafiken rendern lassen, so dass Du dann Bilder (also Grafiken) für Deine Schiffe hättet.
obar hat geschrieben:Zu Punkt 2 und 3: Ich versuchs mal zu Beschreiben. Es sind 16 Sprites. Für jede Richtung 4.
Diese habe ich aus einer Tilemap ausgeschnitten und sie durchnummeriert von 111-126. Die vier Sprites für eine Richtung sind jeweils so aufgebaut --> stehen --> linkes Bein rechter arm vor --> stehen --> rechtes Bein linker Arm vor --> stehen. Wenn dies nicht reichen sollte, kannst du mir ev. einen Tip wo ich die Sprites hochladen könnte?
Wie und was Du da machst ist mir ebenfalls klar. Ich hatte mir sogar schon mal die Mühe gemacht und Deinen Code mit ein paar Dummy-Sprites zum laufen gebracht.
Nur - ob die Animation gut aussieht kann man natürlich nur beurteilen, wenn man Deine Originalgrafiken vorliegen hat.
Tips dazu, wie und wo man Grafiken hochladen kann solltest Du eigentlich hier im Forum finden können.

Gruß, PL.

Verfasst: 20.12.2007 11:09
von obar
@PureLust

Das wäre natürlich super, wenn du mir 2 - 4 Raumschiffe rendern könntest. :allright:


Ich hab nun mal die Grafiken hochgeladen. Dies sind für mich aber auch nur Platzhalter.
Es sollte mehr so sein, dass ich die jederzeit durch andere ersetzen kann.

Mir gehts mehr darum, ob der Code so brauchbar ist.

Der Punkt 3 meiner Frage oben, würde mich auch noch Interessieren.


http://uploaded.to/?id=ed52au

Verfasst: 20.12.2007 20:31
von obar
Kann mir hier keiner Helfen ? :cry:

Ausserdem ist noch eine Frage dazugekommen.

Meine Abfrage geht in 4 Richtungen. Wie könnte ich nun die Diagonalen in meinen bestehenden Code integrieren?
Es gibt ja keine Animation für die Diagonalen. Wenn ich nun UP + LEFT zusammen drücke, müsste er nach links Gleiten
und nach oben animiert Laufen. Also ich denke es muss so sein, aber sicher bin ich mir nicht.

Ich wäre froh, wenn mir hier jemand Helfen könnte.


UPDATE:

Da ich festgestellt habe das jeweils die 4 Animation nicht sauber ablief, habe
ich die Procedure Steuerung mal angepasst.

Aber ich hoffe immer noch auf Verbesserungsvorschläge. :(

Code: Alles auswählen

Procedure Steuerung()
  If KeyboardPushed(#PB_Key_Left) 
     If AnimFrame > 114 And AnimFrame <= 118
        If playerX > 1
          playerX - 2
          counter + 1
          If counter > 2 
            AnimFrame + 1
            If AnimFrame = 119
              AnimFrame = 115
            EndIf  
            counter = 0
          EndIf
        EndIf    
      Else
      AnimFrame = 115
      EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
     If AnimFrame > 118 And AnimFrame <= 122
        If playerX < 800 - SpriteWidth(AnimFrame)
          playerX + 2
          counter + 1
          If counter > 2
            AnimFrame + 1
            If AnimFrame = 123
              AnimFrame = 119
            EndIf  
            counter = 0
          EndIf
        EndIf
      Else
      AnimFrame = 119
      EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
     If AnimFrame > 122 And AnimFrame <= 126
        If playerY > 0
          playerY - 2
          counter + 1
          If counter > 2
            AnimFrame + 1
            If AnimFrame = 127
              AnimFrame = 123
            EndIf
            counter = 0
          EndIf
        EndIf
      Else
      AnimFrame = 123
      EndIf
   EndIf
  
  If KeyboardPushed(#PB_Key_Down)
     If AnimFrame > 110 And AnimFrame <= 114
        If playerY < 600 - SpriteHeight(AnimFrame) 
          playerY + 2
          counter + 1
          If counter > 2
            AnimFrame + 1  
            If AnimFrame = 115
              AnimFrame = 111
            EndIf
            counter = 0
          EndIf
        EndIf
      Else
      AnimFrame = 111
      EndIf
   EndIf
  
  If KeyboardPushed(#PB_Key_LeftControl)
  ; #PB_Key_LeftControl
  EndIf
    
  If KeyboardPushed(#PB_Key_Escape)
    End ;ProgrammAbbruch
  EndIf  
EndProcedure

Verfasst: 22.12.2007 03:10
von PureLust
@obar:

1. Plötzlich ein Männecken was rumläuft? Ich dachte Du wolltest 'nen Vertikal-Shooter machen? :?

2.
obar hat geschrieben:Es gibt ja keine Animation für die Diagonalen.
Tja ... das Leid der meisten Programmierer.
Programmieren können viele ... die dazu gehörigen guten Grafiken erstellen jedoch nur sehr wenige. :roll:

Verfasst: 22.12.2007 09:16
von obar
Grundsätzlich gehts mir darum, Programmieren zu lernen. Deshalb auch die verschiedenen Fragen, zu unterschiedlichen Themen.
Ich mache das jetzt erst seit knapp 3 Wochen. Die Basis für mein Vertikal Shooter war das Shooter-Tutorial. Das Tut. hat mir
sehr geholfen einen Einstieg ins Programmieren zu finden. Das ich ein Banause bin, wenns um Grafik geht, hab ich allerdings schon
vorher gewusst.