Need clarification on movement in a 2D plane

Started by
4 comments, last by Sante05 16 years, 1 month ago
Currently I'm trying to work on movement AI for enemy Spaceships. Simple stuff, just left, right, up, down movement. I've implemented player movement by doing the simple move() function like this: (Java)

public void move(Direction dir) {
		switch(dir){
			case NORTH:
				if((coordinate.getY() - y_speed) >= 0){
					// Set the sprite to the appropriate frame
					sprite = SpriteStore.getStore().getSprite(SHIP_PLAYER_UP);
					// Move the ship
					coordinate.moveY(-y_speed);
				}
				break;
			case SOUTH:
				if((coordinate.getY() + y_speed + sprite.getHeight()) <= BACKGROUND_HEIGHT){
					// Set the sprite to the appropriate frame
					sprite = SpriteStore.getStore().getSprite(SHIP_PLAYER);
					// Move the ship
					coordinate.moveY(y_speed);
				}
				break;
			case EAST:
				if((coordinate.getX() + x_speed + sprite.getWidth()) <= BACKGROUND_WIDTH)
					coordinate.moveX(x_speed);
				break;
			case WEST:
				if((coordinate.getX() - x_speed) >= 0)
					coordinate.moveX(-x_speed);
				break;
		}
	}

Sure, it might be a bad way to do something like this, and I'm quickly coming to this realization (I knew sooner or later I'd need something more versatile). coordinate is just a Point(x, y). My problem is that I'm having trouble using this method of movement to allow the AI to move the ship. I've thought of dealing with vertical and horizontal motion separately using simple methods like this one, but I'd rather take the time to implement a whole new movement system that I know will allow for versatility down the road. I'm aware of basic kinematics, and I'm currently browsing through an AI book that uses "correct" physics to simulate movement. By this I mean using variables such as mass, acceleration, velocity, force applied, etc. I'm also interested in implementing in 2D Vectors to handle magnitude and direction. I imagine this wouldn't be too difficult since I'm already using Coordinates (Points). Currently, my Ships only have an x_speed and a y_speed which is added (either as a positive or negative value) to their position to control their movement. So my questions are: - If I were to use physics (F=ma, v, t, etc.), what variables would I need to store in my Ships? How would the movements methods use these variables? - Would this allow for easier control by the AI? - If I didn't care about applying different forces, or about acceleration (if I just wanted the Ships to move at a constant velocity), would it be possible to just declare these variables constant somewhere and not worry about them? To clarify my last question: currently I just move the Ships by a constant value , which for my purposes is fine. But, if add in natural kinematics, would I still be able to easily move the Ships without caring about all the details, or am I going to have a little messier time since there will be several new variables added into the equation? As of right now, I don't need to use the detailed movement that physics would allow. But, I could very well imagine in the future that I would want to add Ship upgrades or power-ups that do utilize the details of kinematics to vary the movement of Ships. Hm...hope things are clear enough. Also, keep in mind that I've ran into this problem while creating AI, so anything that AI might want to use when dealing with movement is worth mentioning. Thanks for any help!
Advertisement
Ugh...hate to bump my own topic.
I do a lot of that sort of thing in my games.

Here are the basics that I almost always seem to need:
- Current Position (Current X & Y)
- Current Linear Movement State ... Heading Angle, Current Linear Speed
- Max Linear Speed
- Acceleration Rate

(Note: I only store Mass if I plan to use it in some sort of collision/reaction math, or have other outside forces, like gravity, acting on everything.)

Depending on how you are doing your graphics, you may also need to track your current "Facing" angle separately from your heading.

Each frame you would want to compare your target position to your current position ... If they are different then you will want to update your heading angle and linear speed to move towards your target.

I usually do this by determining the Target Heading and getting X and Y components of that angle multiplied by the Acceleration Rate (AX and AY). Also, get your X and Y velocity components by using your current Heading Angle and Current Linear Speed (VX and VY).

Then, VX += AX and VY += AY. Use the updated VX and VY to determine your new current Heading Angle and Linear Speed. Cap your Linear Speed at the Max. And use these Heading and Speed values to change your Position.

If you want to get tricky, you can also apply the math to slow down as you approach your target position. However, if your enemy ships are simply trying to ram into the player ship, then that shouldn't matter too much, eh? ;-)

I hope that was helpful ... let me know if you need more details on anything.

-Matt
www.mwgames.com - my game projects websiteNimble2D Blog - Simple 2D Game Dev with VB.Net
Quote:Original post by MattWorden

I hope that was helpful ... let me know if you need more details on anything.


Yes it was, thank you for your response. What do you mean by Current Linear Movement State? What is the point of origin for your Heading Angle? What if you don't care about rotating your Ships, just moving them left/right/up/down?

I'm curious as to how 2D Vectors work in a situation like this.
I'm using an angle + magnitude vector to describe the current linear movement state ... heading and speed. Heading is the direction in which you are moving and the speed is how fast you are moving in that direction. So, the origin would be your current position.

If you are only going to move in the 4 cardinal directions, then your "heading" would only hold 1 of 4 possibilities: 0, 90, 180, 270 ... if you're working in degrees. But, by using a heading angle, you would be able to handle the math needed to move in any direction in the 2D plane.

Rotating your ships would depend on a separate "Facing" angle ... which may be related to your heading in some way (spaceships in video games tend to face in the same direction as their heading ... but not always). So, you could do something in the game to determine your Facing, and then use Facing to determine how you graphically show your ship.

A good, long term example of Heading an Facing being separate is the game Asteroids ... the player can rotate to change the ship's Facing and then thrust to change the ship's Heading.

But, yes ... being able to switch between angle+magnitude vectors and their X/Y components is very handy in 2D movement and physics for games.

-Matt
www.mwgames.com - my game projects websiteNimble2D Blog - Simple 2D Game Dev with VB.Net
Maybe you could find Steering Behaviours interesting. They allow for pretty much that kind of movement, and they can be combined in any way so that your AI pilot can turn them on/off whether he wants to intercept a target, flee from it, fly in formation along other ships, or all of it at the same time.

You'll have to play with the tweakable constants to get a convincing movement for the kind of vehicles you're using though, but I think it's worth the effort.
-----DevZing Blog (in Spanish)

This topic is closed to new replies.

Advertisement