SFML Missile Speed

Started by
2 comments, last by Nercury 11 years, 1 month ago

Hello gamedev.

I'm currently programming a simple 2d space shooter in sfml 2.0 .

Does anyone have any idea how will I make the missiles move at the same speed at any direction? (The problem is partially solved for vertical directions only).

Here is my code:


void World::updateMissiles(float refreshRate){
	std::list<Missile*>::iterator it = missiles.begin();
	while(it != missiles.end()){
		Missile* missile = *it;
		sf::Sprite& sprite = missile->getSprite();
		if(collide(missile)){
			it=missiles.erase(it);
			delete missile;
		}
		else{
			if(missile->getType() == Missile::Player){
                                // Missile angle of player is only vertical
				sprite.move(0,-missile->getVelY()*refreshRate); 
			}
			else{
                                // This part needs to change from vertical to angles of 45,90,135 degrees
			        //sprite.move(0,missile->getVelY()*refreshRate); 
			}
			it++;
		}
	}
}
Advertisement

(The problem is partially solved for vertical directions only).

This is because you're only updating one of the two components; the Y component:

sprite.move(0,-missile->getVelY()*refreshRate);

You'll need to also include the X component:
sprite.move(missle->getVelX()*refreshRate, missle->getVelY()*refreshRate);

Of course, wouldn't it be easier to set the velocity when the rocket is created instead of having UpdateMissiles decide how they should behave?

To decide the velocity for a missile, it's a simple X=R*cos(angle), Y= R*sin(angle).

EDIT:



if(missile->getType() == Missile::Player){
    // Missile angle of player is only vertical
    sprite.move(0,-missile->getVelY()*refreshRate);
} else {
    // This part needs to change from vertical to angles of 45,90,135 degrees
    // sprite.move(0,missile->getVelY()*refreshRate);
}


This code is a bit of a code smell. If you want to have a variety of rocket behaviors, you may want to consider inheritance here.

You'll need to also include the X component:

That is what I did initially but it behaved differently from what I was expecting.

To decide the velocity for a missile, it's a simple X=R*cos(angle), Y= R*sin(angle).

I think that is what I was looking for.I should have thought of that lol.

This code is a bit of a code smell. If you want to have a variety of rocket behaviors, you may want to consider inheritance here.

I applied inheritance for some other basic stuff but not for missile behaviours.

This is my first game with c++ but I think I know what you mean.

I should basically move the:


if(missile->getType() == Missile::Player){
// Missile angle of player is only vertical
sprite.move(0,-missile->getVelY()*refreshRate);
} else {
// This part needs to change from vertical to angles of 45,90,135 degrees
// sprite.move(0,missile->getVelY()*refreshRate);
}

inside the missile class. Am I correct?

You may have a velocity vector and position vector, as well as delta time since last update in ms.
Then:


position += velocity * delta;

Let's say you have a target and initial missile position. To make missile always go to target, calculate it's velocity like this:


velocity = (target_pos - missile_pos).normalized() * speed; // normalize always gives you vector with length 1

You would avoid messy sin and cos calculations, and this applies both to 2D and 3D.

Google for simple vector class. I found this one, which seems to be ok.

Edit: SMFL already has a vector class you should use: sf::Vector2f

This topic is closed to new replies.

Advertisement