• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# SFML Missile Speed

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

### #1mcvitiesyum  Members

Posted 23 February 2013 - 06:45 PM

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, 23 February 2013 - 06:47 PM.

### #2fastcall22  Moderators

Posted 23 February 2013 - 07:09 PM

(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, 23 February 2013 - 07:12 PM.

zlib: eJzVVLsSAiEQ6/1qCwoK i7PxA/2S2zMOZljYB1TO ZG7OhUtiduH9egZQCJH9 KcJyo4Wq9t0/RXkKmjx+ cgU4FIMWHhKCU+o/Nx2R LEPgQWLtnfcErbiEl0u4 0UrMghhZewgYcptoEF42 YMj+Z1kg+bVvqxhyo17h nUf+h4b2W4bR4XO01TJ7 qFNzA7jjbxyL71Avh6Tv odnFk4hnxxAf4w6496Kd OgH7/RxC

### #3mcvitiesyum  Members

Posted 23 February 2013 - 08:04 PM

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, 23 February 2013 - 08:08 PM.

### #4Nercury  Members

Posted 24 February 2013 - 06:48 AM

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, 24 February 2013 - 07:01 AM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.