SFML Missile Speed

This topic is 1968 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

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 on other sites

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

Share on other sites

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 on other sites

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

1. 1
2. 2
Rutin
19
3. 3
JoeJ
16
4. 4
5. 5

• 35
• 23
• 13
• 13
• 17
• Forum Statistics

• Total Topics
631700
• Total Posts
3001808
×