January 26, 2021, 06:40:42 AM

Author Topic: [bmx] Sprite class by ozak [ 1+ years ago ]  (Read 405 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Sprite class by ozak [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : Sprite class
Author : ozak
Posted : 1+ years ago

Description : Frame rate independant animatione/movement sprite class.

Code :
Code: BlitzMax
  1. ' Frame independent sprite class with animation support by Odin Jensen (www.furi.dk)
  2. ' Free to use as you please :)
  3.  
  4. ' Sprite class
  5. Type Sprite
  6.  
  7.         ' Position
  8.         Field x:Float = 0
  9.         Field y:Float = 0
  10.        
  11.         ' Velocity in pixels
  12.         Field velx:Float = 0
  13.         Field vely:Float = 0
  14.        
  15.         ' Sprite image
  16.         Field Image:TImage
  17.        
  18.         ' Current animation frame
  19.         Field CurAnimFrame:Int = 0
  20.        
  21.         ' Width and height of sprite
  22.         Field Width:Int = 0
  23.         Field Height:Int = 0
  24.        
  25.         ' Animation frame list
  26.         Field FrameIndices:Int[] = Null
  27.        
  28.         ' Animation timer vars
  29.         Field AnimDelay:Int = 0
  30.         Field AnimTime:Int = 1000
  31.         Field CurAnimIndex:Int = 0
  32.        
  33.         ' Load sprite
  34.         Method Load(URL:Object, TileWidth:Int, TileHeight:Int, FirstTile:Int, NumTiles:Int)
  35.        
  36.                 ' Load image
  37.                 Image = LoadAnimImage(URL, TileWidth, TileHeight, FirstTile, NumTiles)
  38.                
  39.                 ' Save dimensions
  40.                 Width = TileWidth
  41.                 Height = TileHeight
  42.                
  43.                 ' Set cur anim frame
  44.                 CurAnimFrame = 0
  45.                
  46.         EndMethod
  47.        
  48.         ' Clone sprite
  49.         Method Clone:Sprite()
  50.        
  51.                 ' Create new copy
  52.                 Local NewSprite:Sprite = New Sprite
  53.                
  54.                 ' Copy pointers to indices/image
  55.                 NewSprite.SetFrameIndices(FrameIndices)
  56.                 NewSprite.SetImage(Image, Width, Height)
  57.                 NewSprite.SetAnimDelay(AnimDelay)
  58.                 NewSprite.SetX(x)
  59.                 NewSprite.SetY(y)
  60.                 NewSprite.SetVelocityX(velx)
  61.                 NewSprite.SetVelocityY(vely)
  62.                
  63.                 Return NewSprite               
  64.        
  65.         EndMethod
  66.        
  67.         ' Update sprite
  68.         Method Update(DeltaTime:Int)
  69.        
  70.                 ' Update movement
  71.                 x = x + (velx * DeltaTime)
  72.         y = y + (vely * DeltaTime)
  73.  
  74.                 ' Update animation
  75.                 If (FrameIndices)
  76.                
  77.                         ' Increase anim timer
  78.                         AnimTime = AnimTime + DeltaTime
  79.                        
  80.                         ' Is it time?
  81.                         If (AnimTime > AnimDelay)
  82.                        
  83.                                 ' Reset anim time
  84.                                 AnimTime = 0
  85.                                
  86.                                 ' Ok to advance?
  87.                                 If (CurAnimIndex < (FrameIndices.length-1))    
  88.                                
  89.                                         CurAnimIndex = CurAnimIndex + 1
  90.                                                                        
  91.                                 Else
  92.                                
  93.                                         CurAnimIndex = 0
  94.                                
  95.                                 EndIf
  96.                                
  97.                                 CurAnimFrame = FrameIndices[CurAnimIndex]
  98.                         EndIf
  99.                
  100.                 EndIf
  101.        
  102.         EndMethod
  103.        
  104.         ' Set image
  105.         Method SetImage(Image:TImage, Width:Int, Height:Int)
  106.        
  107.                 self.Image = Image
  108.                 self.Width = Width
  109.                 self.Height = Height
  110.        
  111.         EndMethod
  112.        
  113.         ' Draw sprite
  114.         Method Draw()
  115.        
  116.                 DrawImage(Image, x, y, CurAnimFrame)
  117.        
  118.         EndMethod
  119.        
  120.         ' Set current frame
  121.         Method SetCurFrame(Frame:Int)
  122.        
  123.                 CurAnimFrame = Frame
  124.        
  125.         EndMethod
  126.        
  127.         ' Set animation delay
  128.         Method SetAnimDelay(NewDelay:Int)
  129.        
  130.                 AnimDelay = NewDelay
  131.        
  132.         EndMethod
  133.        
  134.         ' Set frame index list
  135.         Method SetFrameIndices(Indices:Int[])
  136.        
  137.                 FrameIndices = Indices
  138.        
  139.         EndMethod
  140.        
  141.         ' Get image for manipulation
  142.         Method GetImage:TImage()
  143.        
  144.                 Return Image
  145.        
  146.         EndMethod
  147.        
  148.         ' Set X
  149.         Method SetX(x:Float)
  150.        
  151.                 self.x = x     
  152.        
  153.         EndMethod
  154.        
  155.         ' Set Y
  156.         Method SetY(y:Float)
  157.        
  158.                 self.y = y
  159.        
  160.         EndMethod
  161.        
  162.         ' Get X
  163.         Method GetX:Float()
  164.        
  165.                 Return x
  166.        
  167.         EndMethod
  168.        
  169.         ' Get Y
  170.         Method GetY:Float()
  171.        
  172.                 Return y
  173.        
  174.         EndMethod
  175.        
  176.         ' Set x velocity
  177.         Method SetVelocityX(vx:Float)
  178.        
  179.                 velx = vx
  180.        
  181.         EndMethod
  182.        
  183.         ' Set y velocity
  184.         Method SetVelocityY(vy:Float)
  185.        
  186.                 vely = vy
  187.        
  188.         EndMethod
  189.  
  190.         ' Get width of sprite
  191.         Method GetWidth:Int()
  192.        
  193.                 Return Width
  194.        
  195.         EndMethod
  196.        
  197.         ' Get height of sprite
  198.         Method GetHeight:Int()
  199.        
  200.                 Return Height
  201.        
  202.         EndMethod              
  203.  
  204. EndType


Comments :


TartanTangerine (was Indiepath)(Posted 1+ years ago)

 Hmmm Delta time is rarely an Int, I think a double would be more accurate.


ozak(Posted 1+ years ago)

 Works fine for me, but yes. I usually use a long too, so it's a bummer when porting from older java code :)


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal