Code archives/Graphics/Sprite class

This code has been declared by its author to be Public Domain code.

Download source code

Sprite class by ozak2005
Frame rate independant animatione/movement sprite class.
' Frame independent sprite class with animation support by Odin Jensen (www.furi.dk)
' Free to use as you please :)

' Sprite class
Type Sprite

	' Position
	Field x:Float = 0
	Field y:Float = 0
	
	' Velocity in pixels
	Field velx:Float = 0
	Field vely:Float = 0
	
	' Sprite image
	Field Image:TImage
	
	' Current animation frame
	Field CurAnimFrame:Int = 0
	
	' Width and height of sprite
	Field Width:Int = 0
	Field Height:Int = 0
	
	' Animation frame list
	Field FrameIndices:Int[] = Null
	
	' Animation timer vars
	Field AnimDelay:Int = 0
	Field AnimTime:Int = 1000
	Field CurAnimIndex:Int = 0
	
	' Load sprite
	Method Load(URL:Object, TileWidth:Int, TileHeight:Int, FirstTile:Int, NumTiles:Int)
	
		' Load image
		Image = LoadAnimImage(URL, TileWidth, TileHeight, FirstTile, NumTiles)
		
		' Save dimensions
		Width = TileWidth
		Height = TileHeight
		
		' Set cur anim frame
		CurAnimFrame = 0
		
	EndMethod
	
	' Clone sprite
	Method Clone:Sprite()
	
		' Create new copy
		Local NewSprite:Sprite = New Sprite
		
		' Copy pointers to indices/image
		NewSprite.SetFrameIndices(FrameIndices)
		NewSprite.SetImage(Image, Width, Height)
		NewSprite.SetAnimDelay(AnimDelay)
		NewSprite.SetX(x)
		NewSprite.SetY(y)
		NewSprite.SetVelocityX(velx)
		NewSprite.SetVelocityY(vely)
		
		Return NewSprite		
	
	EndMethod
	
	' Update sprite
	Method Update(DeltaTime:Int)
	
		' Update movement
		x = x + (velx * DeltaTime)
        y = y + (vely * DeltaTime)

		' Update animation
		If (FrameIndices)
		
			' Increase anim timer
			AnimTime = AnimTime + DeltaTime
			
			' Is it time?
			If (AnimTime > AnimDelay)
			
				' Reset anim time
				AnimTime = 0
				
				' Ok to advance?
				If (CurAnimIndex < (FrameIndices.length-1))	
				
					CurAnimIndex = CurAnimIndex + 1
									
				Else
				
					CurAnimIndex = 0
				
				EndIf
				
				CurAnimFrame = FrameIndices[CurAnimIndex]
			EndIf
		
		EndIf
	
	EndMethod
	
	' Set image
	Method SetImage(Image:TImage, Width:Int, Height:Int)
	
		self.Image = Image
		self.Width = Width
		self.Height = Height
	
	EndMethod
	
	' Draw sprite
	Method Draw()
	
		DrawImage(Image, x, y, CurAnimFrame)
	
	EndMethod
	
	' Set current frame
	Method SetCurFrame(Frame:Int)
	
		CurAnimFrame = Frame
	
	EndMethod
	
	' Set animation delay
	Method SetAnimDelay(NewDelay:Int)
	
		AnimDelay = NewDelay
	
	EndMethod
	
	' Set frame index list
	Method SetFrameIndices(Indices:Int[])
	
		FrameIndices = Indices
	
	EndMethod
	
	' Get image for manipulation
	Method GetImage:TImage()
	
		Return Image
	
	EndMethod
	
	' Set X
	Method SetX(x:Float)
	
		self.x = x	
	
	EndMethod
	
	' Set Y
	Method SetY(y:Float)
	
		self.y = y
	
	EndMethod
	
	' Get X
	Method GetX:Float()
	
		Return x
	
	EndMethod
	
	' Get Y
	Method GetY:Float()
	
		Return y
	
	EndMethod
	
	' Set x velocity
	Method SetVelocityX(vx:Float)
	
		velx = vx
	
	EndMethod
	
	' Set y velocity
	Method SetVelocityY(vy:Float)
	
		vely = vy
	
	EndMethod

	' Get width of sprite
	Method GetWidth:Int()
	
		Return Width
	
	EndMethod
	
	' Get height of sprite
	Method GetHeight:Int()
	
		Return Height
	
	EndMethod		

EndType

Comments

TartanTangerine (was Indiepath)2005
Hmmm Delta time is rarely an Int, I think a double would be more accurate.


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


Code Archives Forum