Jump to content

View more

Image of the Day

#ld38 #screenshotsaturday Mimosa Fizz action gif #2 https://t.co/TUzdppvfUL
IOTD | Top Screenshots

The latest, straight to your Inbox.

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


Sign up now

SFML Missile Speed

4: Adsense

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   

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.


#2 fastcall22   Moderators   

10700
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.

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

#3 mcvitiesyum   Members   

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   Members   

812
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.