Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


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.

  • You cannot reply to this topic
3 replies to this topic

#1 mcvitiesyum   Members   -  Reputation: 117

Like
0Likes
Like

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.


Sponsor:

#2 fastcall22   Crossbones+   -  Reputation: 4456

Like
1Likes
Like

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.

c3RhdGljIGNoYXIgeW91cl9tb21bMVVMTCA8PCA2NF07CnNwcmludGYoeW91cl9tb20sICJpcyBmYXQiKTs=

#3 mcvitiesyum   Members   -  Reputation: 117

Like
0Likes
Like

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.


#4 Nercury   Crossbones+   -  Reputation: 774

Like
0Likes
Like

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.



PARTNERS