Jump to content
  • Advertisement
Sign in to follow this  
mypel16000

Projectile Movement C++

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I am using C++ and trying to make my player shoot projectiles. I have done OK so far, but the problem is that what I have done to move them is just use:

 

bulletX += xOffset( betwen player and mouse ) /100

bulletY += yOffset / 100

 

This gave me the right direction although there was an issue, the closer the mouse was to the player, the slower the bullet went ( as you can probably tell from the code above ). I have tried:


Dlen = sqrt(Dx*Dx + Dy*Dy)

Dx/=Dlen;

Dy/=Dlen

Bx=Bx+Dx*Bs;

By=By+Dy*Bs;

 

 

*Dlen = normalised value, Dx = xOffset, Dy = yOffset, Bx= bulletX, By= bulletY, Bs = bullet Speed.

 

but I was unsuccesful.... the bullet went in completely random directions very different to where I was aiming.

 

I also tried to find a ratio :

yOffset / xOffset and then always move X by 1 or -1 and y by 1 or -1 multiplied by the ratio.

Again unscuccesful.

 

Is there any way to achieve a constant speed when shooting projectiles from a player in the direction of the mouse cursor that will work? Please put an explained example.

Share this post


Link to post
Share on other sites
Advertisement

Using the normalised difference vector is correct.

 

What data type are you using to store Dx, Dy? If you are using int, that won't work because the decimal component will be truncated.

Use float instead.

Share this post


Link to post
Share on other sites
Here's a very basic 2D vector class:

[source]
#ifndef VEC2_H
#define VEC2_H

#include

class Vec2
{
public:
Vec2(){ }
Vec2(float x, float y) : x(x), y(y) { }

Vec2 &operator+=(const Vec2 &v){ x += v.x; y += v.y; return *this; }
Vec2 &operator-=(const Vec2 &v){ x -= v.x; y -= v.y; return *this; }

Vec2 &operator*=(float v){ x *= v; y *= v; return *this; }

Vec2 operator+(const Vec2 &v) const { Vec2 r = *this; r += v; return r; }
Vec2 operator-(const Vec2 &v) const { Vec2 r = *this; r -= v; return r; }

Vec2 operator-() const { return *this * -1.0f; }

Vec2 operator*(float v) const { Vec2 r = *this; r *= v; return r; }

float dot(const Vec2 &v) const { return (x * v.x) + (y * v.y); }

float length() const { return sqrt(dot(*this)); }

Vec2 normalised() const { float n = length(); return Vec2(x / n, y / n); }

float x, y;
};

inline Vec2 operator*(float f, const Vec2 &v){ Vec2 r = v; r *= f; return r; }

#endif // VEC2_H
[/source]

Now it is simple:

[source]
void f()
{
Vec2 pos(50, 40);
Vec2 target(200, 300);

Vec3 dir = target - pos;
dir = dir.normalised();

while((target - pos).length() < epsilon)
{
pos += dir * speed;
}

pos = target;
}
[/source]

A vector class with overloads is a great idea when doing this kind of stuff.

Post editor ate my spaces. Sorry. The editor is still glitchy as hell on this site. Edited by Aardvajk

Share this post


Link to post
Share on other sites

[quote name='mypel16000' timestamp='1357934604' post='5020436']
@Madhed: You are not really helping...
[/quote]

 

Why is that so? Tell me why it wasn't helpful and I might give it another try.

Share this post


Link to post
Share on other sites
@Madhed: You are not really helping...

@Serapth: That tutorial has exactly the same problem as me....

 

Any more GOOD help??

Good luck getting any more help with those kind of response.  

Share this post


Link to post
Share on other sites
@Madhed: You are not really helping...

@Serapth: That tutorial has exactly the same problem as me....

 

Any more GOOD help??

 

 

 

Yeah.... On.  Your.  Own.

 

 

Enjoy never, ever getting help from me.  

 

Ciao.

Share this post


Link to post
Share on other sites

Madhead's advice was extremely relevant and correct. The tutorial that Serapth linked to blatantly doesn't suffer from the same issues as you - have you actually tried clicking on the window top right on that page and observing the projectiles moving towards the mouse point rather than going in "completely random directions"?

 

Two minutes on Google would have answered your question. Instead you choose to take up our time by posting on a forum, then act very rudely to respondents.

 

Think on please.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!