Intmaps inside of intmaps
Monkey Forums/Monkey Programming/Intmaps inside of intmaps| 
 | ||
| Hello, im trying to create an intmap stored inside of an intmap in order to store map information.  I read the forums and i liked this idea but could not get it to work.  Currently i am using arrays inside of an array.  I can get Intmaps to work but not Intmaps within Intmaps...  Any help or advice would be appreciated. | 
| 
 | ||
| http://monkeycoder.co.nz/Community/posts.php?topic=1165 | 
| 
 | ||
| Ah Ha.  I did not search in the forums for just "Maps".  My mistake thanks very much! | 
| 
 | ||
| So far i can only get it to store the same intmap over and over :S  What do i change to make it makes a bran new intmap? 
Import mojo
Class Game Extends App
	Field DirtImg:Image
	Field ActiveMap:Mapclass
	Method OnCreate ()
		'DirtImg = LoadImage ("Dirt_Block.png")
		ActiveMap = New Mapclass  'Makes a map object
		ActiveMap.Setsize(45,45)  'Make a 150 X 150 map
		ActiveMap.Fillborders(1)  'Fill in the borders of the map with 1's
		ActiveMap.PrintContent()
		
		SetUpdateRate 60
	End
	
End
Class Mapclass
	Field MapsizeX:Int
	Field MapsizeY:Int
	Field Mapcontent : IntMap<IntMap<IntObject>> = New IntMap<IntMap<IntObject>>
	Field SubMapcontent : IntMap<IntObject> = New IntMap<IntObject>
	
	Method OnCreate()
		Mapcontent.Set(0,SubMapcontent)
		SubMapcontent.Set(0,0)
	End
	
	Method Setsize(imputx,imputy)
		MapsizeX = imputx
		MapsizeY = imputy
	End 
	
	Method Fillborders(fill)  'Fill the boarder tiles of the map
		For Local x:Int = 0 To MapsizeX 			
			If x = 0 Or x = MapsizeX  'For the left side and the right side fill the entire SubMapcontent in
				For Local y:Int = 0 To MapsizeY
					SubMapcontent.Add(y,fill)
				Next
				Mapcontent.Add(x,SubMapcontent)
				Print("Adding x = 0 or x = MapsizeX")
			Else
				SubMapcontent.Clear  'Clear SubMapcontent to make sure there is no leftover data
				SubMapcontent.Add(0,fill)
				SubMapcontent.Add(MapsizeX,fill)
				Mapcontent.Add(x,SubMapcontent)
				Print("Adding at 0 and MapsizeX")
			End
		Next
	End
	
	Method PrintContent()
		For Local a:Int = 0 To MapsizeX
			Local this:IntMap<IntObject> = Mapcontent.Get(a)
			For Local b:Int = 0 To MapsizeY
				If this.Contains(b) = 1
					'Check if each co-ordinate has an item
					Print("It does " + a + ", " + b)
				Endif
			Next
		Next
	End
End
Function Main()
	New Game
End
 | 
| 
 | ||
| Dont Intmaps use Set to set their contents? (instead of Add) I could make a demo for you as I have used this technique before if you want. first create a mapsquare class Class mapsquare field x:Int field y:Int field tree_type:String end class I added tree_type just as an example then you create your overall IntMap: Global overall_intmap:IntMap<IntMap<mapsquare>>=new IntMap<IntMap<mapsquare>> then when you want to add..for example.. an oak tree to 3,16 you check if something is already at its x co-ordinate.(3) local i:IntMap<mapsquare>=overall_intmap.Get(3) if not then you create it: if i=null local the_intmap:IntMap<mapsquare>=new IntMap<mapsquare> endif then add it to the overall intmap overall_intmap.Set(3,the_intmap) you create a new mapsquare with an oak tree and insert at its y coordinate: local m:mapsquare=new mapsquare m.x=3 m.y=16 m.tree_type="oak" the_intmap.Set(16,m) when you want to know what type of tree is at...for example...15,32 you do this: local the_intmap:IntMap<mapsquare>=overall_intmap.Get(15) if the_intmap is null there is no tree there so: if the_intmap<>null local m:mapsquare=the_intmap.Get(32) if m<>null Print m.tree_type else Print "no tree here" endif else Print "no tree here" endif | 
| 
 | ||
| Sure.  I would love to learn this method of storing data.  Thanks. | 
| 
 | ||
| see above | 
| 
 | ||
| Thanks for taking the time to explain it so well!  I appreciate it, this looks like a great way of doing things, much better than my array of arrays :) |