ClipSprite Animation

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

ClipSprite Animation

Beitrag von NeoRon »

Hallo an alle,

ich möchte eine Grafik.png je X64 ,Y64 die einen Gegner Flieger darstellt clippen.

Der Flieger hat 5 animations Bewegungen 2 mal der Default Flieger einmal oben bei X0,Y0 sowie unten X0,Y64 Pixel. also bis zur letzten Animation sinds nach links 320 Pixel sowie nach rechts 320Pixel

Nun wenn der Flieger -x geht soll die Grafik den Flieger nach rechts clippen und wenn +x nach links.

habe was über kompliziertes geproggt es funzt aber sehr Buggy.

Hier mal mein Kunstwerk xD schäme mich auch ist mir peinlich aber hier die wichtigen schnipsel:

Code: Alles auswählen

   
 ;// Display  Enemy
    
    If  enemy()\Sprite_Enemy = #Sprite_Enemy_1
      ClipSprite(#Sprite_Enemy_1, Clip_EnemyX, Clip_EnemyY, 64, 64)
      DisplayTransparentSprite(#Sprite_Enemy_1, enemy()\Enemy_X, enemy()\Enemy_Y)
      
      enemy()\ENEMY_ON_SCREEN + 1
    EndIf

Procedure Enemy_Move(X, Y, ENEMY_DELAY, Move_ID, speedX, speedY)

  Select Move_ID    

    Case 3 
      
      With enemy() 
        If \ENEMY_DELAY = 0
          \ENEMY_DELAY = #Enemy_Move_Delay_3
        EndIf
        
        If \ENEMY_DELAY > 0 And \ENEMY_DELAY =< #Enemy_Move_Delay_3
          \Enemy_X + \SpeedX
          \Enemy_Y + \speedY        
          \ENEMY_DELAY - 1
          
          Enemy_01_Animation = -1
          
          If \ENEMY_DELAY = 0
            Enemy_01_Animation = 0
            \ENEMY_DELAY = -#Enemy_Move_Delay_3
          EndIf
        EndIf  
        
        If \ENEMY_DELAY <0 And \ENEMY_DELAY => -#Enemy_Move_Delay_3
          \Enemy_X - \speedX
          \Enemy_Y + \speedY
          \ENEMY_DELAY + 1
          
          Enemy_01_Animation = 1
          ; Debug "+1anima: "+Str(Enemy_01_Animation) 
          If \ENEMY_DELAY = 1
            Enemy_01_Animation = 0
            \ENEMY_DELAY = #Enemy_Move_Delay_3
          EndIf
        EndIf
        
        If Enemy_01_Animation = 1
          Enemy_01_Animation_Delay +  1
          
          If Enemy_01_Animation_Delay = #Enemy_01_Anim_Delay
            Animation_Counter + 1
            
            Clip_EnemyX = Animation_Counter*64
            Enemy_01_Animation_Delay = 0
            
            
          ElseIf Animation_Counter  = 5
            Enemy_01_Animation = 2
            Enemy_01_Animation_Delay = 0
            
          EndIf
          
          While Enemy_01_Animation = 2
            Enemy_01_Animation_Delay +  1
            
            If Enemy_01_Animation_Delay = #Enemy_01_Anim_Delay
              
              Animation_Counter - 1
              Clip_EnemyX = Animation_Counter*64
              Enemy_01_Animation_Delay = 0
              
              
              
            ElseIf Animation_Counter  = 0
              Enemy_01_Animation = 1
            EndIf
          Wend
        EndIf
        If Enemy_01_Animation = -1
          Enemy_01_Animation_Delay +  1
          
          If Enemy_01_Animation_Delay = #Enemy_01_Anim_Delay
            Animation_Counter + 1
            Clip_EnemyY = 64 
            Clip_EnemyX = Animation_Counter*64
            Enemy_01_Animation_Delay = 0
            
            
          ElseIf Animation_Counter  = 5
            Enemy_01_Animation = -2
            Enemy_01_Animation_Delay = 0
            
          EndIf
          
          While Enemy_01_Animation = -2
            Enemy_01_Animation_Delay +  1
            Debug "+1delay3: "+Str(Enemy_01_Animation_Delay) 
            If Enemy_01_Animation_Delay = #Enemy_01_Anim_Delay
              
              Animation_Counter - 1
              Clip_EnemyY = 64 
              Clip_EnemyX = Animation_Counter*64
              Enemy_01_Animation_Delay = 0
              
              Debug "+1anima4: "+Str(Animation_Counter*64)  
              
            ElseIf Animation_Counter  = 0
              Enemy_01_Animation = 1
            EndIf
          Wend
        EndIf
        
      EndWith
  EndSelect
  
EndProcedure

The World is Cyber
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: ClipSprite Animation

Beitrag von True29 »

hey , hier mal mein grundgerüst für animationen .

vielleicht hilfts dir.


musst den code noch anpassen hier und da was einfügen , löschen da ich eine include benutze.


structuren / listen

Code: Alles auswählen

Global NewList Animations.Animation() ;Liste für normale animationen

Structure Animation
  AlignX.f
  AlignY.f
  id.i
  startTime.i
  stopTime.i
  frames.i
  frame.i
  startframe.i
  stopframe.i
  framesPerRow.i
  frameWidth.i
  frameHeight.i
  frameDuration.i
  sprite.i
  Sound.i
  Soundplayed.i
  PlaySound.i
  x.i
  y.i   
  resize.i
  newWidth.i
  newHeight.i
  loop.i
  loopStartFrame.i 
  loopStopFrame.i 
  NextTemplate.i
EndStructure

Code: Alles auswählen

Procedure AddAnimation(StartTime.i,StopTime.i,frames.i,framesPerRow.i,frameDuration.i,sprite.i,x.i,y.i,id.i,Sound = #PB_Ignore)  
  If AddElement(Animations())    
    With Animations()
      \id                 = id
      \sprite             = sprite
      \startTime          = StartTime
      \stopTime           = StopTime
      \frames             = frames
      \framesPerRow       = framesPerRow      
      \frameWidth         = image\width      
      \frameHeight        = image\height      
      \frameDuration      = frameDuration
      \x                  = x
      \y                  = y   
      \Sound              = Sound
    EndWith    
  EndIf  
EndProcedure
anzeige:

Code: Alles auswählen

Procedure RENDER_ANIMATIONES()
Protected time = ElapsedMilliseconds() 
  
      ;// ANimation
      ForEach Animations()           
        With Animations()  
          
        If (time - \startTime) >= 0
  
           \frame = ((time - \startTime)/\frameDuration)%\frames
     

            ClipSprite(\sprite,Mod(\frame,\framesPerRow)*\frameWidth,Int(\frame/\framesPerRow)*\frameHeight,\frameWidth,\frameHeight)                                
            
            If \resize 
              GraphicSize(\sprite,\newWidth,\newHeight)
            Else
              GraphicSize(\sprite,\frameWidth,\frameHeight)
            EndIf 
            
            GraphicAlign(\sprite,\AlignX,\AlignY)
            DisplaySprite(\sprite,\x-walzescreen\posdifx,\y-walzescreen\posdify,GloablAnimatedSymbolTransparenz)                                                                                                                                                                                          
            
           ;// Sound
            If \Sound <> #PB_Ignore 
              If Spieler\Sound = 1 And \Soundplayed = #False                           
                \Soundplayed = #True                  
                ;If SoundStatus(\Sound,Kanalb) = 3 Or SoundStatus(\Sound,Kanalb) = 0
                  Kanalb = PlaySound(\Sound,#PB_Sound_MultiChannel,spieler\volumen_fx)
                ;EndIf                
              EndIf   
            EndIf
            
                    
           If (time - \startTime >= \stopTime) And (\stopTime <> 0) And (\loop = #False)
             DeleteElement(Animations(),#True)
             Break
           EndIf
           
         EndIf
         
        EndWith          
      Next      
  EndProcedure
Grüße.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: ClipSprite Animation

Beitrag von NeoRon »

Hi,

sry war zwischenzeitlich im Krankenhaus.

Danke ich werds mir anschauen.
The World is Cyber
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: ClipSprite Animation

Beitrag von NeoChris »

Hi NeoRon
Was hattest du denn, warum warst du im Krankenhaus? War was schlimmes? Ich hoffe dir geht es wieder gut :)
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: ClipSprite Animation

Beitrag von NeoRon »

Hi NeoChris,

hatte ne Schnittverletzung an der rechten Hand. Und die Hand sowie eine Sehne mussten geflickt werden.

Habe ausgesprochen wenig bis garkeine Schmerzen also geht's soweit gut mit dm HandiCap das ich Rechtshänder bin ^^

Programmierst du schon lange in PB?

Grüße
The World is Cyber
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: ClipSprite Animation

Beitrag von NeoChris »

Freut mich dass es dir gut geht und dass nichts "schlimmes" passiert ist. ^^

Ich bin noch sehr neu in der PB Community und bin daher noch ein großer Anfänger :)
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: ClipSprite Animation

Beitrag von NeoRon »

Danke ^^, aber trotzdem Schlimm genug xD

Hast du Skype?

Ich bin seit nem halben jahr mit PB vertraut. Also hab auch noch einiges zu lernen.
Bin gerade mit nem Grafiker und nem Ton-Techniker an einem Project dran haben auch schon eine laufähige Versions unseres Spiels.

Vllt kannst ja iwie Quer einsteigen wenn bock hast.

Skype: Nobiwill
Grüße
The World is Cyber
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ClipSprite Animation

Beitrag von bobobo »

:)

äähm räusper es gibt auch pn hust hust


:)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: ClipSprite Animation

Beitrag von NeoRon »

Also habs mit es mit verschachtelten If Sätze und Counters etc. geschafft das er den Sprite nach ner vorgegebenen Delay Variable Clipt.

Der Sprite hat 10 Frames 5 in der ersten Reihe, die links Schwenkung des Raumschiffs
und 5 in der 2ten Reihe, die rechts Schwenkung des Raumschiffs.

Hiermit schwenkt er abwechselnd in beide Richtungen.

Die Parameter werden an eine Procedure die ne Liste beinhaltet übergeben.

Man kann also verschiedene Sprites und egal wie Große Frames und egal wieviele Frames in der Reihe oder Spalte haben.
Man muss diese nur der Liste übergeben.

Code: Alles auswählen


Structure Animation
  sprite.i                       
  framecolumns.i
  framerows.i          
  frameWidth.i
  frameHeight.i
  frameDelay.i
  frameSetDelay.i
  framecounterX.i
  framecounterY.i
  SetframecounterY.i
EndStructure

Global NewList Animations.Animation()

Global Clip.Animation

Procedure AddAnimation(sprite.i, framecolumns.i, frameRows.i,frameWidth.i,frameHeight.i, frameSetDelay.i)
  If AddElement(Animations())    
    With Animations()
      \sprite             = sprite
      \framecolumns       = framecolumns
      \frameRows          = frameRows      
      \frameWidth         = frameWidth
      \frameHeight        = frameHeight     
      \frameSetDelay      = frameSetdelay   
    EndWith    
  EndIf  
EndProcedure

AddAnimation(#Sprite_Enemy_1,1,5,#TileScale,#TileScale,100)

    ;// Display  Enemy
    
    If  enemy()\Sprite_Enemy = #Sprite_Enemy_1
      
      If Clip\frameSetDelay > Animations()\frameSetDelay    
        Clip\frameSetDelay = 0
        
        If Clip\framecounterX = Animations()\framerows 
          Clip\framecounterX = 0
          
          If Clip\SetframecounterY = Animations()\framerows
            Clip\framecounterY = 1
          ElseIf Clip\SetframecounterY = Animations()\framerows*2
            Clip\framecounterY = 0
            Clip\SetframecounterY = 0
          EndIf
          
        Else
          Clip\framecounterX + 1
          Clip\SetframecounterY + 1
          ClipSprite(Animations()\sprite, (Clip\framecounterX)*(Animation()\framewidth), Clip\framecounterY*(Animation()\frameHeight), #TileScale, #TileScale) 
        EndIf
        
      Else
        Clip\frameSetDelay + 1
      EndIf
      
      DisplayTransparentSprite(#Sprite_Enemy_1, enemy()\Enemy_X, enemy()\Enemy_Y)
      enemy()\ENEMY_ON_SCREEN + 1
      
    EndIf

The World is Cyber
Antworten