Sign in to follow this  
mcvitiesyum

SFML Missile Speed

Recommended Posts

mcvitiesyum    117

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++;
		}
	}
}
Edited by mcvitiesyum

Share this post


Link to post
Share on other sites
fastcall22    10846

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

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

[tt]sprite.move(0,-missile->getVelY()*refreshRate);[/tt]

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

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

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

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. Edited by fastcall22

Share this post


Link to post
Share on other sites
mcvitiesyum    117

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?

Edited by mcvitiesyum

Share this post


Link to post
Share on other sites
Nercury    812

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

Edited by Nercury

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this