Multiple loading in Type.
BlitzMax Forums/BlitzMax Beginners Area/Multiple loading in Type.
| ||
If I do this: global ThisImage = loadimage blah type peewee field image:timage field x field y function create() for local xiter = 0 to 30 local p:peewee = new peewee p.image = ThisImage next blah blah Will the line in Bold >> p.image = ThisImage<< load the same image 31 times? Or is the image loaded once and then copied? I basically don't want to load the image 30 times but want to assign the loaded image to 30 objects. How can I tell if its doing this or not? Thanks. Forgive me if this is obvious. |
| ||
The image is loaded once into thisimage and then the same pointer to the image is used 30 times. Each peewee will point to the same instance of the image so if you change the image it will change for all PeeWees |
| ||
Thanks. :) Another question.. Looking at my code below, how can I make only 1 tile change frame when the mouse is over it?SuperStrict Graphics 800,600 Global ThisImage:TImage = LoadAnimImage("12.png",32,32,0,2) Global MAPWIDTH:Int = 22 Global MAPHEIGHT:Int = 18 Type T12Image Field x:Int Field y:Int Field frame:Int Field image:TImage Global List:TList Global tempID:Int Function create() If Not T12Image.List t12image.List = CreateList() End If For Local xiter:Int = 0 Until MAPWIDTH For Local yiter:Int = 0 Until MAPHEIGHT If TileMap[ xiter , yiter ] = 1 Local t:T12Image = New T12Image t.image = ThisImage t.x = xiter *32 t.y = yiter *32 t.frame = 0 T12image.List.AddLast(t) End If Next Next End Function Method draw() For Local xiter:Int = 0 Until MAPWIDTH For Local yiter:Int = 0 Until MAPHEIGHT If TileMap[ xiter , yiter] = 1 DrawImage Image , xiter*32 , yiter*32 , frame EndIf Next Next End Method End Type Global TileMap:Int[ MAPWIDTH , MAPHEIGHT ] Global mapdata:Int For Local yiter:Int = 0 Until MAPHEIGHT For Local xiter:Int = 0 Until MAPWIDTH ReadData mapdata TileMap[ xiter, yiter] = mapdata Next Next 'For Local x:Int = 0 Until MAPWIDTH ' For Local y:Int = 0 Until MAPHEIGHT ' TileMap[ x , y ] = mapdata ' Next 'Next t12image.create While Not KeyHit(KEY_ESCAPE) Cls For Local t:T12Image = EachIn T12Image.List t.draw Next For Local t:T12Image = EachIn T12Image.List If TileMap [ (MouseX()/32) , (MouseY()/32) ] = 1 t.frame = 1 End If Next Flip Wend DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Basically, if my player is over a tile I want its frame to change but not change the frames of the rest of them, only the tile he's currently on. :) |
| ||
I think you've got a design problem. This code For Local t:T12Image = EachIn T12Image.List If TileMap [ (MouseX()/32) , (MouseY()/32) ] = 1 t.frame = 1 End If Next loops through changing all the frames just because the mouse is in a frame '1' area. Personally, I would redesign to have my tilemap[] be an array of 't12image' . Then, when you do the array check you can simply change the tilemap entry e.g For Local t:T12Image = EachIn T12Image.List If TileMap [ (MouseX() / 32) , (MouseY() / 32) ] = 1 TileMap [ (MouseX()/32) , (MouseY()/32) ].frame = 1 '(or whatever) End If Next Didn't you ask these sorts of question before? |
| ||
Didn't you ask these sorts of question before? I did yes but none of them were for help with TileMaps using Types. I tried what you said but it doesnt compile SuperStrict Graphics 800,600 Global ThisImage:TImage = LoadAnimImage("12.png",32,32,0,2) Type T12Image Field x:Int Field y:Int Field frame:Int Field ID:Int Field image:TImage Global List:TList Global tempID:Int = 0 Global MAPWIDTH:Int = 22 Global MAPHEIGHT:Int = 18 Global TileMap:Int[ t12image.MAPWIDTH , t12image.MAPHEIGHT] Function create() If Not T12Image.List t12image.List = CreateList() End If For Local xiter:Int = 0 Until t12image.MAPWIDTH For Local yiter:Int = 0 Until t12image.MAPHEIGHT If t12image.TileMap[ xiter , yiter ] = 1 Local t:T12Image = New T12Image t.image = ThisImage t.x = xiter *32 t.y = yiter *32 t.frame = 0 t.id = T12Image.tempID T12image.List.AddLast(t) t12image.tempID:+1 End If Next Next End Function Method draw() For Local xiter:Int = 0 Until t12image.MAPWIDTH For Local yiter:Int = 0 Until t12image.MAPHEIGHT If t12image.TileMap[ xiter , yiter] = 1 DrawImage Image , x , y , frame EndIf Next Next End Method Method FrameChange() If t12image.Tilemap[ MouseX()/32 , MouseY()/32] = 1 t12image.TileMap.frame = 1 End If End Method End Type 'Global TileMap:Int[ t12image.MAPWIDTH , t12image.MAPHEIGHT ] Global mapdata:Int For Local yiter:Int = 0 Until t12image.MAPHEIGHT For Local xiter:Int = 0 Until t12image.MAPWIDTH ReadData mapdata T12Image.TileMap[ xiter, yiter] = mapdata Next Next t12image.create While Not KeyHit(KEY_ESCAPE) Cls For Local t:T12Image = EachIn T12Image.List t.draw t.FrameChange Next Flip Wend DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| ||
I'm Using ID's now. It seems to make a difference but not exactly what i want.SuperStrict Graphics 800,600 Global ThisImage:TImage = LoadAnimImage("12.png",32,32,0,2) Type T12Image Field x:Int Field y:Int Field frame:Int Field ID:Int Field image:TImage Global List:TList Global tempID:Int = 0 Global MAPWIDTH:Int = 22 Global MAPHEIGHT:Int = 18 Global TileMap:Int[ t12image.MAPWIDTH , t12image.MAPHEIGHT] Function create() If Not T12Image.List t12image.List = CreateList() End If For Local xiter:Int = 0 Until t12image.MAPWIDTH For Local yiter:Int = 0 Until t12image.MAPHEIGHT If t12image.TileMap[ xiter , yiter ] = 1 Local t:T12Image = New T12Image t.image = ThisImage t.x = xiter *32 t.y = yiter *32 t.frame = 0 t.id = T12Image.tempID T12image.List.AddLast(t) t12image.tempID:+1 End If Next Next End Function Method draw() For Local xiter:Int = 0 Until t12image.MAPWIDTH For Local yiter:Int = 0 Until t12image.MAPHEIGHT If t12image.TileMap[ xiter , yiter] = 1 DrawImage Image , x , y , frame EndIf Next Next End Method Method FrameChange() If ID = 2 If t12image.Tilemap[ MouseX()/32 , MouseY()/32] = 1 't12image.TileMap[MouseX()/32 , MouseY()/32].frame = 1 frame = 1 End If EndIf End Method Function DrawT() End Function End Type 'Global TileMap:Int[ t12image.MAPWIDTH , t12image.MAPHEIGHT ] Global mapdata:Int For Local yiter:Int = 0 Until t12image.MAPHEIGHT For Local xiter:Int = 0 Until t12image.MAPWIDTH ReadData mapdata T12Image.TileMap[ xiter, yiter] = mapdata Next Next t12image.create While Not KeyHit(KEY_ESCAPE) Cls For Local t:T12Image = EachIn T12Image.List t.draw t.FrameChange Next Flip Wend DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DefData 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Basically I give each tile an ID. If the mouse positions is on a selected tile and its ID matches then its frame changes. It kinda works. Any more help would be appreciated. :) |
| ||
Method FrameChange() If MouseX()/32 *32 And MouseY()/32 *32 = id frame = 1 End If End Method This code also kinda works. I think I'm getting close. I just need some more knowledgable minds to help out. Please. :) |
| ||
Amon, What is this doing? If MouseX()/32 *32 And MouseY()/32 *32 = id It divides by 32 then multiples by 32. If mousex() is 200 it'll be 200/32 = 6. 6*32 = 200. That's what you were doing wrong here . Anyway, I would strongly recommend redesigning. This works but needs more cleaning : <edit> Code edited a couple of times to get rid of stupid mistakes and clean it up a bit. Could still be more encapsulated but there you go. |
| ||
That works perfect, thanks. :) Amon, What is this doing? If MouseX()/32 *32 And MouseY()/32 *32 = id it was my lame ass attempt at trying to find the ID of the tile at the current mouse position. |