Jump to content

  • Log In with Google      Sign In   
  • Create Account


Projectile Movement C++


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
10 replies to this topic

#1 mypel16000   Members   -  Reputation: 46

Like
-1Likes
Like

Posted 09 January 2013 - 04:36 PM

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.



Sponsor:

#2 Madhed   Crossbones+   -  Reputation: 2649

Like
0Likes
Like

Posted 09 January 2013 - 06:13 PM

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.



#3 incertia   Crossbones+   -  Reputation: 777

Like
0Likes
Like

Posted 09 January 2013 - 07:37 PM

Probably because integers are bad for division.
what

#4 Aardvajk   Crossbones+   -  Reputation: 5804

Like
3Likes
Like

Posted 10 January 2013 - 09:25 AM

Here's a very basic 2D vector class:


#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



Now it is simple:


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;

}



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, 10 January 2013 - 09:26 AM.


#5 Serapth   Crossbones+   -  Reputation: 5252

Like
1Likes
Like

Posted 10 January 2013 - 11:47 AM

Check out this tutorial on the math behind sprite based shooting.  It's Javascript based, but the code is easily groked to a C++ programmer.  The entire math tutorial series may prove helpful.



#6 mypel16000   Members   -  Reputation: 46

Like
-6Likes
Like

Posted 11 January 2013 - 02:03 PM

Soz

Edited by mypel16000, 20 January 2013 - 08:33 AM.


#7 Madhed   Crossbones+   -  Reputation: 2649

Like
0Likes
Like

Posted 11 January 2013 - 03:58 PM

@Madhed: You are not really helping...

 

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



#8 BeerNutts   Crossbones+   -  Reputation: 2716

Like
1Likes
Like

Posted 11 January 2013 - 04:14 PM

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


My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

#9 Serapth   Crossbones+   -  Reputation: 5252

Like
0Likes
Like

Posted 11 January 2013 - 09:47 PM

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



#10 Aardvajk   Crossbones+   -  Reputation: 5804

Like
0Likes
Like

Posted 12 January 2013 - 08:14 AM

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.



#11 mypel16000   Members   -  Reputation: 46

Like
0Likes
Like

Posted 20 January 2013 - 05:19 AM

I am sorry for this, I was just having a bad day and was very frustrated. Thank you for all your help, I have checked all tutorials and comments and its helped me to move on.

 

To anyone looking for a solution, the best solution was:

 

 

Dlen = sqrt(Dx*Dx + Dy*Dy)  //Finding a ratio

Dx/=Dlen;                             //Creating a velocity figure

Dy/=Dlen                             //( two )

Bx=Bx+Dx*Bs;                      // Using the BulletX += Dx(the velocity figure)

By=By+Dy*Bs;

 

@Madhead, sorry for criticising your tutorial. What was wrong with it was that the closer you got to the plane, the slower the projectile went. This was my problem originally, but I didn't realise it was an intended function of the tutorial.

 

@Aardvajk. Believe me, two minutes on google did not solve this, but it is true that the advise was correct.

 

@BeerNutts. Again, was having a bad day. Sorry everyone






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