Sprite Sheet Packer

Monkey Forums/Monkey Code/Sprite Sheet Packer

Rob Pearmain(Posted 2011) [#1]
I thought this might come in handy.

It is the code I use to open the 'png' and related 'txt' mapping file exported by the excellent [url=http://spritesheetpacker.codeplex.com/]Sprite Sheet Packer[/url]

Example Usage:

Using the tool, add all your images and then export (e.g. 'packed') producing 2 files (e.g. 'packed.png' and 'packed.txt')

Global s:SpriteSheet = New SpriteSheet("packed")

Global si:SpriteSheetItem = item = s.GetSpriteSheetItemByName("player1")

.
.
.

(On Render)

s.DrawSpriteSheetImage(item,0,0)

'or alternatively

s.DrawSpriteSheetImage("player1",0,0)



Room for lots more to be added, but I thought it might help someone out there

Import mojo


'comment:Class to handle sprites sheets created with 'Sprite Sheet Packer' (spritesheetpacker.codeplex.com)
Class SpriteSheet


	'#Region Class Fields
	 Private Field _packfileimageurl:String
	 Private Field _packfiletxturl:String
	 Private Field _packfile:String
	
	 Private Field _packfiletxt:String
	
	 Field  _packfileimage:Image	 
	 Field  _mappings:StringMap<SpriteSheetItem> = new StringMap<SpriteSheetItem>

	'#End Region
	
	'#Region Constructor 
	
	'comment:Parameters - packfile 'The name of the pack image without the extension, the same name is used for the map data, e.g. player.png, player.txt'
	Method New(packfile:String)
	
	
		_packfile = packfile
		_packfileimageurl = _packfile + ".png"
		_packfiletxturl = _packfile + ".txt"	
		
		_packfileimage = LoadImage(_packfileimageurl)
		
		_packfiletxt = LoadString(_packfiletxturl)
		
				
		
		For Local line:String=Eachin _packfiletxt.Split( "~n" )

			Local items:String[] = line.Split(" ")
			
			if items.Length() = 6  then

				Local sName:String = items[0]
				_mappings.Set(sName, New SpriteSheetItem(sName,int(items[2]),int(items[3]),int(items[4]),int(items[5])))
			End if
			
			
		Next

		
	
		
		
	End Method
	
	'#End Region
	
	'#Region Methods
	
	'comment:Draws the image from the Sprite Sheet Image, using the name to look up the Sprite Sheet Item
	Method DrawSpriteSheetImage:Void(name:String,x:Int,y:Int)
	
			Local item:SpriteSheetItem =  _mappings.ValueForKey(name)
			
			DrawImageRect(_packfileimage,x,y,item.X,item.Y,item.Width,item.Height)
			
			
	End
	'comment:Draws the image from the Sprite Sheet Image, using the Sprite Sheet Item passed in
	Method DrawSpriteSheetImage:Void(item:SpriteSheetItem, x:Int, y:int)
		
	
		
		DrawImageRect(_packfileimage,x,y,item.X,item.Y,item.Width,item.Height)
		
	End
	
	'comment:Returns SpriteSheetItem based on name
	Method GetSpriteSheetItemByName:SpriteSheetItem(name:String)
	
		Print name
		Local o:SpriteSheetItem =  _mappings.ValueForKey(name)
		
		Local oNew:SpriteSheetItem = New SpriteSheetItem(o.Name,o.X,o.Y,o.Width,o.Height)
		Return oNew
		
	End
	
	'#End Region
	
End Class

'comment:Class to contain a line from the 'Sprite Sheet Packer' exported text file
Class SpriteSheetItem
	Public
	
	'#Region Fields
	Field Name:String = ""
	Field X:Int = 0
	Field Y:Int = 0
	Field Width:Int = 0
	Field Height:Int = 0
	'#End Region


	'#Region Constructor

	
	'comment: 
	Method New(name:String, x:Int, y:Int, width:Int, height:Int)
		
		self.Name = name
		self.X = x
		self.Y = y
		self.Width = width
		self.Height = height
		

	
	End
	
	'#End Region

End Class



BigAnd(Posted 2011) [#2]
Cheers Rob. Dead useful bit of code that.