Functions and Type help
Blitz3D Forums/Blitz3D Beginners Area/Functions and Type help
| ||
I have a small problem with the localization of variables in types. I declare a type in a function using Function CreateBlock() For x = 0 to 1 Block.blocks = New Blocks Block\x = x Next End Function but then when I try to access the type variables in another function... Function MoveBlock() For block.blocks = New blocks Block\x = 1 Next End Function Nothing happens.... |
| ||
Two things: 1: Functions have separate "local scopes" from one another; the variable "block" in CreateBlock has no connection at all to the variable "Block" in MoveBlock. This is quite a big part of the reason for using functions - to prevent that confusion. 2: MoveBlock is creating more block objects. The "New" command creates new objects of a given type, so naturally it won't refer to the objects created beforehand. You can iterate over each object in a type's global list using "Each": Local block.blocks For block = Each blocks block\x = 1 Next |
| ||
At a first glance, this line:For block.blocks = New blocks should become: For block.blocks = Each blocks I don't know if that's just a typo in your post, but if this is how it appears in your game, then Blitz will think that you're trying to cycle only a newly create block type, not every single type you've created previously. On a second glance through your post, I notice that you're creating two blocks, positioned at 0,0,0 and 1,0,0. Then, you're moving both blocks to the same space (Block\x = 1) to 1,0,0 in your MoveBlock() function, which will make them appear as 1 block. Also, make sure that you're updating position with PositionEntity, MoveEntity, or TranslateEntity with the blocks and not just changing field variables. EDIT:Yasha beat me to it. lol. Last edited 2011 |
| ||
yah sorry i meant Each block, but how do i get it so that i can use one set of types in two different functions.... |
| ||
I'm not sure if I follow...You should be able to do that already. Types are Global (the actual Type is Global, but the identifier is Local to each function.). In other words, if you have this line: r.RandomType "RandomType" is going to be accessible throughout your whole program. "r", however, is only going to be available in that specific function. This shouldn't ever be a problem, because you will need to re-declare "r" each time you want to access a type object anyways. The only difference is that you can name "r" to whatever variable you want (in Blitz's rules) per function, e.g. r.RandomType, this.RandomType, ACompletelyDifferentVariableNameFromTheOriginalType.RandomType, ect. I'm going off on a tangent here, so just ignore the above statements if it's confusing. The point I'm trying to get across is that once you make a Type set, you can use any of those fields in any part of your program later on. Here's an example of using a Type object in more than one function. Pay attention to formatting: Graphics3D 640,480,0,2 ;set the graphics SetBuffer BackBuffer() ;set up a double buffer Global camera = CreateCamera() ;make a camera Type enemy ;Create a new type list for all enemies Field family$ ;Each enemy has a family it belongs to (what kind of enemy?) Field bodymesh ;Each enemy needs a body Field x# ;Each enemy needs an x location (EntityX() will do the same thing) Field y# ;Each enemy needs a y location (EntityY() will do the same thing) Field z# ;Each enemy needs a z location (EntityZ() will do the same thing) End Type ;Note that in the above type, I can store all three different data types (%,#, and $) ;All of these field are now accesible anywhere in my program if I call on this type list. For count = 1 To 50 ;Do this part 50 times CreateNewFireMonster() ;Make a new fire monster (Uses the type above) Next For count = 1 To 50 ;Do this part 50 times CreateNewWaterMonster() ;Make a new water monster (Uses the type aboe) Next While Not KeyDown(1) ;The MAIN loop MoveFireMonsters() ;Randomly move each fire monster MoveWaterMonsters() ;Randomly move each water monster UpdateWorld RenderWorld Flip Wend ;Functions List is below Function CreateNewFireMonster() ;This will create a new enemy type for fire monsters e.enemy = New enemy ;Make a new enemy type, and call it "e" for now e\family$ = "Fire Monster" ;e's family$ is now "Fire Monster" e\bodymesh = CreateSphere() ;e's body is now a sphere EntityColor e\bodymesh,255,0,0 ;A Red sphere e\x# = Rnd(-50.0,50.0) ;generate a random x# location e\y# = Rnd(-50.0,50.0) ;generate a random Y# location e\z# = Rnd(-50.0,50.0) ;generate a random z# location PositionEntity e\bodymesh,e\x#,e\y#,e\z# ;position e's body at the new location End Function Function CreateNewWaterMonster() ;This is virtually the same as CreateNewFireMonster() w.enemy = New enemy ;But note that it's using the same type list and I'm using "w" instead of "e" as an identifier w\family$ = "Water Monster" ;Make this one a "Water Monster" w\bodymesh = CreateCube() ;a cube, not a sphere EntityColor w\bodymesh,0,0,255 ;and a blue cube w\x# = Rnd(-50.0,50.0) w\y# = Rnd(-50.0,50.0) w\z# = Rnd(-50.0,50.0) PositionEntity w\bodymesh,w\x#,w\y#,w\z# End Function Function MoveFireMonsters() ;This function will move fire monsters For BLAH.enemy = Each enemy ;This is important. If you ever need to cycle all enemy, use this line If BLAH\family$ = "Fire Monster" ;For every enemy, if it belongs to the "Fire Monster" family$ BLAH\x# = BLAH\x# + Rnd(-1.0,1.0) ;generate a new x location BLAH\y# = BLAH\y# + Rnd(-1.0,1.0) ;generate a new y location BLAH\z# = BLAH\z# + Rnd(-1.0,1.0) ;generate a new z location PositionEntity BLAH\bodymesh,BLAH\x#,BLAH\y#,BLAH\z# ;position the body there... EndIf Next End Function Function MoveWaterMonsters() ;This function is the same as above For AnyVariableName.enemy = Each enemy ;Cycle through each enemy If AnyVariableName\family$ = "Water Monster" ;and if the enemy is a water monster AnyVariableName\x# = AnyVariableName\x# + Rnd(-1.0,1.0) ;you get the idea... AnyVariableName\y# = AnyVariableName\y# + Rnd(-1.0,1.0) AnyVariableName\z# = AnyVariableName\z# + Rnd(-1.0,1.0) PositionEntity AnyVariableName\bodymesh,AnyVariableName\x#,AnyVariableName\y#,AnyVariableName\z# EndIf Next End Function Normally, I don't test my examples as they're more to demonstrate concept rather than provide technique, but I did test this example and it works. My only advice is that you shouldn't run this example if you're epileptic (the enemy movement is extremely jittery). In the code above, I over-exaggerated the fact that you can name the Type identifier to any Blitz valid variable you want, but this is typically avoided in good programming practice. I find it easy to just use the first letter of the Type name ("e" in this case) for Type identifiers, as you only have to type 1 character as opposed to a long variable name. I believe this answers your question, but let me know otherwise. |
| ||
Thanks I actually found I was having problems with a mousehit command versus a mousedown command. What I was doing now works. |
| ||
It's always the little things that miss us. I can't tell you how many times I've done something similar. |