Arrays of entities
Blitz3D Forums/Blitz3D Beginners Area/Arrays of entities
| ||
I've tried creating an array of entities within a function but it doesn't seem to work. eg. Dim actors(10) For n=0 to 9 test_func(actors(n)) Next camera=createcamera() pointentity camera,actors(0) Function test_func(entity) entity=CreateSphere(8) PositionEntity entity,Rnd(-3,3),Rnd(-3,3),Rnd(-3,3) End The spheres are created and spread around but I'm told the entity actors(0) doesn't exist. Anyway I can create entities within an array in functions? |
| ||
Try this:Dim actors(10) For n=0 to 9 actors(n) = test_func() Next camera=createcamera() pointentity camera,actors(0) Function test_func(entity) entity=CreateSphere(8) PositionEntity entity,Rnd(-3,3),Rnd(-3,3),Rnd(-3,3) Return entity End You can't pass a pointer to a function so that the pointer gets set/written to (unless you're using a bank, in which case you'd have to poke the information into the bank). You're trying to pass a sort of pointer to the function test_func and then, in a sense, set the value of that pointer to the entity handle- basically, you can't do that specific thing in Blitz. |
| ||
That's because your entity variable is local to the function and lost once the function ends. You need a return value from the function (or don't use the function at all). Dim actors(10) For n=0 to 9 actors(n) = test_func() Next camera=createcamera() pointentity camera,actors(0) Function test_func() entity=CreateSphere(8) PositionEntity entity,Rnd(-3,3),Rnd(-3,3),Rnd(-3,3) Return entity End Edit: looks like Noel beat me to it. |
| ||
Looks like our modified source code is the same, as well.. PLAGIARIZERZZZZ!!!!!!!!!1ONE!! Sorry, it was just too tempting. |
| ||
Thanks!! On a related note, is it possible to have an array of custom types so I can refer to each reference. eg. Type cuboid Field x Field y Field z End type Dim actors(20).cuboid ; array of cuboid types, whatever the syntax would be For n=0 to 19 actors(n)\x=rnd(-10,10) actors(n)\y=rnd(-10,10) actors(n)\z=rnd(-10,10) Next p=actors(3)\x q=actors(3)\y r=actors(3)\z If this worked, the x,y,z values of the fourth actor in the array are copied to p,q,r. I'm guessing not and I'll need a workaround with each creation of a type needing a unique ID. Then I can trawl through the list from beginning to end until I find the one with the matching ID, but an array of types would be nicer! |
| ||
Yes, but you need to define the array like this:Dim actors.cuboid(20) Just like how if you want an array of floats, you put the # after the name then the number of elements. You also have to create the objects before you can modify them. For n=0 to 19 actors(n) = new cuboid actors(n)\x=rnd(-10,10) actors(n)\y=rnd(-10,10) actors(n)\z=rnd(-10,10) Next |
| ||
Looks like our modified source code is the same, as well.. Except that mine doesn't have a bug in it like yours. PLAGIARIZERZZZZ!!!!!!!!! How dare you! |
| ||
Wooho! |
| ||
Ack! Seems that these two things don't go together. Apparently I can;t have an array of type and use a function to populate it.Type actor Field x Field y Field z End Type Dim actors.actor(10) For n=0 to 9 actors.actor(n)=test_func() next Function test_func() entity.actor=New actor entity\x = rnd(-10,10) entity\y = rnd(-10,10) entity\z = rnd(-10,10) Return entity End Function or alternatively Type actor Field x Field y Field z End Type Dim actors.actor(10) For n=0 to 9 actors.actor(n)=New actor next For n=0 to 9 actors.actor(n)=test_func() next Function test_func() entity.actor=New actor entity\x = rnd(-10,10) entity\y = rnd(-10,10) entity\z = rnd(-10,10) Return entity End Function and various variations. Is this a doomed mission or can you educated types bestow your wisdom upon me? |
| ||
You're forgetting to tell the function to return an actor. By default, functions return an integer, so if you don't specify otherwise ($,#,%, or .YourTypeName) it'll return an integer.Type actor Field x Field y Field z End Type Dim actors.actor(10) For n=0 to 9 actors.actor(n)=test_func() next Function test_func.actor() entity.actor=New actor entity\x = rnd(-10,10) entity\y = rnd(-10,10) entity\z = rnd(-10,10) Return entity End Function |
| ||
Thanks. Blitz is more capable than it first seems when someone smart tells you about it! |
| ||
Just in case someone stumbles on some of the subtle errors above.... ;) |