You can't use MoveEntity() like that. A fast-moving spaceship that turns around doesn't suddenly start travelling in the new direction it's facing. You need to model inertia for Asteroids-style physics.
Keep track of the velocity vector of your spaceship (vx, vy, and vz). When the ship accelerates, add a small amount to the velocity. To prevent the ship from going over a certain speed (Asteroids-style) normalize your velocity vector to your max speed if its magnitude is above the max speed. (This looks way simpler in code.)
I believe this example perfectly replicates the "physics" of the original Asteroids; specifically, how accellerating at a slight angle when already traveling at your max speed would affect your velocity. Controls: space accellerates, arrow keys turn on each axis of rotation.
That's the first time I've used the TForm* functions. Damn are they useful once you get the hang of them.
Keep track of the velocity vector of your spaceship (vx, vy, and vz). When the ship accelerates, add a small amount to the velocity. To prevent the ship from going over a certain speed (Asteroids-style) normalize your velocity vector to your max speed if its magnitude is above the max speed. (This looks way simpler in code.)
I believe this example perfectly replicates the "physics" of the original Asteroids; specifically, how accellerating at a slight angle when already traveling at your max speed would affect your velocity. Controls: space accellerates, arrow keys turn on each axis of rotation.
Const TURN_SPEED# = 2 Const ACCEL# = .005 Const MAX_SPEED# = 1 Const GLOBAL_SPACE = 0 Const PLAYFIELD_SIZE# = 30 Graphics3D 800, 600 camera = CreateCamera() PositionEntity(camera, 0, 0, -20) light = CreateLight() Type player Field entity Field x#, y#, z# Field vx#, vy#, vz# End Type Global p.player = New player p\entity = CreateCone() While Not(KeyHit(1)) ; input If KeyDown(200) Then TurnEntity(p\entity, TURN_SPEED, 0, 0) If KeyDown(208) Then TurnEntity(p\entity, -TURN_SPEED, 0, 0) If KeyDown(203) Then TurnEntity(p\entity, 0, 0, TURN_SPEED) If KeyDown(205) Then TurnEntity(p\entity, 0, 0, -TURN_SPEED) If KeyDown(57) Then ; accellerate in the direction the player is facing (use Y axis because cones point in that direction) TFormVector 0, ACCEL, 0, p\entity, GLOBAL_SPACE p\vx = p\vx + TFormedX() p\vy = p\vy + TFormedY() p\vz = p\vz + TFormedZ() ; measure current speed current_speed# = Sqr(p\vx*p\vx + p\vy*p\vy + p\vz*p\vz) If current_speed > MAX_SPEED Then ; limit current speed to MAX_SPEED ratio_of_speed_to_keep# = MAX_SPEED / current_speed p\vx = p\vx * ratio_of_speed_to_keep p\vy = p\vy * ratio_of_speed_to_keep p\vz = p\vz * ratio_of_speed_to_keep EndIf EndIf ; move the player p\x = p\x + p\vx p\y = p\y + p\vy p\z = p\z + p\vz ; if the player goes off an edge of the playfield, move him to the other side While p\x < -PLAYFIELD_SIZE/2 : p\x = p\x + PLAYFIELD_SIZE : Wend While p\x > PLAYFIELD_SIZE/2 : p\x = p\x - PLAYFIELD_SIZE : Wend While p\y < -PLAYFIELD_SIZE/2 : p\y = p\y + PLAYFIELD_SIZE : Wend While p\y > PLAYFIELD_SIZE/2 : p\y = p\y - PLAYFIELD_SIZE : Wend While p\z < -PLAYFIELD_SIZE/2 : p\z = p\z + PLAYFIELD_SIZE : Wend While p\z > PLAYFIELD_SIZE/2 : p\z = p\z - PLAYFIELD_SIZE : Wend ; output PositionEntity(p\entity, p\x, p\y, p\z) RenderWorld Text 0, 0, "speed = " + current_speed Flip Wend End
That's the first time I've used the TForm* functions. Damn are they useful once you get the hang of them.