12-16-2012, 06:45 PM
Use gamecheduleTask():
[lua]
gamecheduleTask(function()
newBullet = Bullet:clone()
newBullet.Position = gunPosition
newBullet.Rotation = gunAngle - 180
newBullet.FixedVelocity.Velocity = Vec2D(-100,0) --error here
newBullet.Parent = game.World
end)
[/lua]
(long, probably confusing explanation below)
The problem is that scripts run separately from everything else. The game engine can only do one thing at a time (it can't add stuff while simulating physics, for example) so when you run a script that does something like cloning, adding, or removing stuff, it's actually telling the game to do it as soon as it's not busy. But the script won't wait for the game to be done, so 3 lines later the bullet's children won't have been added yet when the script asks for the one called FixedVelocity. Using gamecheduleTask() just tells the game engine to run the block of code in between drawing stuff or whatever else it's doing, and since only one thing is happening at the same time it can do any cloning, adding, or removing exactly when it's supposed to.
It would be better to just make all scripts use gamecheduleTask() without you having to type it yourself, but that would require removing sleep() and infinite loops and a lot of people were against that last time I tried.
[lua]
gamecheduleTask(function()
newBullet = Bullet:clone()
newBullet.Position = gunPosition
newBullet.Rotation = gunAngle - 180
newBullet.FixedVelocity.Velocity = Vec2D(-100,0) --error here
newBullet.Parent = game.World
end)
[/lua]
(long, probably confusing explanation below)
The problem is that scripts run separately from everything else. The game engine can only do one thing at a time (it can't add stuff while simulating physics, for example) so when you run a script that does something like cloning, adding, or removing stuff, it's actually telling the game to do it as soon as it's not busy. But the script won't wait for the game to be done, so 3 lines later the bullet's children won't have been added yet when the script asks for the one called FixedVelocity. Using gamecheduleTask() just tells the game engine to run the block of code in between drawing stuff or whatever else it's doing, and since only one thing is happening at the same time it can do any cloning, adding, or removing exactly when it's supposed to.
It would be better to just make all scripts use gamecheduleTask() without you having to type it yourself, but that would require removing sleep() and infinite loops and a lot of people were against that last time I tried.