This content has been marked as final.
Show 2 replies

1. Re: Spaceship rotation vector
morgalr Jun 7, 2011 4:01 PM (in response to 846873)843870 wrote:
I don't see your problem, from your description you have the correct answer for movement with vector rotation. If you are incrementing your X and Y variables correctly, then you will have rotation from 0 to 2*PI, this is what is needed. If you are using your arrow keys for nothing more than assigning 1 or 1, then you are making a very large mistake there.
Hi
I am trying to make an asteroids clone, but i`m having problems making the spaceship move freely in space.
The spaceship is made of a vector which has a length that increases or decreases as the player presses up or down on the keyboard, and an angle which increases or decreases as the player presses left or right.
The position of the spaceship is then calculated by converting from polar to cartesian coordinates:
The problem is that the spaceship can only move in 45 degree angles, since (x,y) will always be either: (1,0),(0,1),(1,1),(1,0),(0,1) or (1,1)x += length * Math.cos(Math.toRadians(angle)); y += length * Math.sin(Math.toRadians(angle));
How can I get the spaceship to move in all directions?
Thanks!
If you want to increment by some fractional value, say 1 degree per second and broken into 1/10 increments for implementation, then what you need to do is start a timer each time you have a keydown and set a flag showing which key was put down. Each time your timer goes off, then you need to upgrade your position until your keyup event. 
2. Re: Spaceship rotation vector
827803 Aug 10, 2011 4:20 PM (in response to 846873)I don't really want to give you all the hints, but it should be easier than you think when working with vectors. This will mean forgetting about cartesian coordinate based systems and reverting to good all position vectors. Point2D may also work if you want to use premade classes, however I recommend you make your own using float vectors. This is all that is required for the class shell!
First, you need to implement two new properties of the moving object, a move angle and a face angle. I think the names are self explanatory! You can alter the face angle through user input, assuming the right and left keys alter the direction in which the Spaceship is pointing for example. Yet if there is no intended delay on key press, all you need to do is alter the move angle directly (and forget about the face angle), then recalculate using the follow algorithm:class Vector2D { float x; float y; Vector2D() { x = 0.0F; y = 0.0F; } float distance(Vector2D other) { return (float)Math.sqrt((x  other.x) * (x  other.x) + (y  other.y) * (y  other.y)); } }
float ang = Spaceship.moveAngle  90; float tempVelx = calcAngleMoveX(ang); float tempVely = calcAngleMoveY(ang); Spaceship.position.x += tempVelx; Spaceship.position.y += tempVely;
You can test it using a simple random call, to ensure your ship moves appropriately!public float calcAngleMoveX(float angle) { return (float)(Math.cos(angle * Math.PI / 180)); } public float calcAngleMoveY(float angle) { return (float) (Math.sin(angle * Math.PI / 180)); }
Sorry if there is weird code formatting, my tab button is on some kind of manic lock! Feel free to reply with questionsmolecule.faceAngle = rand.nextInt(360); //forget if not working with a faceAngle, and directly altering moveAngle molecule.moveAngle = rand.nextInt(360);
Regards,
BoxCat