Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: Ball movement and bouncing in the Pong example  (Read 12588 times)

0 Members and 1 Guest are viewing this topic.

Kiblinix

• Newbie
• Posts: 15
Ball movement and bouncing in the Pong example
« on: August 07, 2011, 11:35:59 pm »
I am trying to recreate pong to help me along with my learning on C++ and SFML, but I've ran into a few problems when trying to make the ball move and bounce.

I managed to get the ball to move on its own, and to bounce off the walls and the paddles easily, but the problem was that it didn't seem "realistic". The ball was always bouncing at the same angle, as what I did was this:

Code: [Select]
`float velX = 0.15f;float velY = 0.35f;// Move the ball in the game loopBall.Move(velX * App.GetFrameTime(), velY * App.GetFrameTime());// When the ball hits the top or bottom of the screenvelY = -velY;// When the ball hits a paddlevelX = -velX;`

Doing it like this meant that the user has no control over where the ball goes, as it would just bounce around at the same angle and be pretty boring.

I reasoned that to do this I'd need to use trigonometry, so I attempted that.

Correct me if I'm wrong, but this is what I did to try and work it out:

where x is the angle I want the ball to move, and hyp is the ball's speed?

So to move the ball I would do:
Code: [Select]
`Ball.Move(App.GetFrameTime() * ballSpeed * cos(ballAngle), App.GetFrameTime() * ballSpeed * sin(ballAngle));`

Is this correct? And excuse the cos and sin bits there, I don't know how to do those in C++ yet.

vro

• Newbie
• Posts: 44
Ball movement and bouncing in the Pong example
« Reply #1 on: August 08, 2011, 04:51:31 am »
you need to convert to radians, so

cos(ballAngle * (3.14159265 / 180))

otherwise i (think) you're good

• Hero Member
• Posts: 500
Ball movement and bouncing in the Pong example
« Reply #2 on: August 08, 2011, 05:39:38 am »
You're good with the sine and cosine, just be sure to #include <cmath>
I use the latest build of SFML2

Kiblinix

• Newbie
• Posts: 15
Ball movement and bouncing in the Pong example
« Reply #3 on: August 08, 2011, 01:26:54 pm »
Thanks a ton for that guys, was a big help I now have it how I want, but there's a new problem now that I've started to do it this way.

The ball's movement across the screen is no longer smooth and it jitters and jerks instead, which is not easy on the eyes

Edit: I could try to record it moving I suppose, if that helps you understand what I mean somewhat.

Here's my full code, in hopes of an easy solution:

Code: [Select]
`#include <SFML/Graphics.hpp>#include <cmath>int main(){ // Create the App of the application   sf::RenderWindow App(sf::VideoMode(640, 480, 32), "SFML Pong"); App.SetFramerateLimit(60); sf::Shape Ball = sf::Shape::Circle(0, 0, 15, sf::Color::Black); Ball.SetPosition(320, 240); // Define PI float PI = 3.14159265f; // Ball properties float ballSpeed = 0.2f; float ballAngleRad = 90 * (PI / 180);   while (App.IsOpened())   {      // Handle events      sf::Event Event;      while (App.PollEvent(Event))      {         // App closed or escape key pressed : exit         if (Event.Type == sf::Event::Closed)                        App.Close();                 } if (Ball.GetPosition().y + 15 > App.GetHeight()) { ballAngleRad = -ballAngleRad; } if (Ball.GetPosition().y - 15 < 0) { ballAngleRad = -ballAngleRad; } Ball.Move(App.GetFrameTime() * ballSpeed * std::cos(ballAngleRad), App.GetFrameTime() * ballSpeed * std::sin(ballAngleRad));       // Clear the App App.Clear(sf::Color::White); // Draw the ball App.Draw(Ball);              // Display things on screen      App.Display();   }   return 0;}`

• Hero Member
• Posts: 500
Ball movement and bouncing in the Pong example
« Reply #4 on: August 08, 2011, 10:47:25 pm »
That should be working perfectly. From your description, it sounds like your program is lagging, which doesn't make sense because of how simple it is. Are your drivers up to date?
I use the latest build of SFML2

Kiblinix

• Newbie
• Posts: 15
Ball movement and bouncing in the Pong example
« Reply #5 on: August 09, 2011, 12:30:05 am »
They should be, but honestly I don't do most of that stuff on the pc I'm on at the moment. I'll take a look.

Edit : Derp. I ran it in release mode, seems to have fixed it.

Kiblinix

• Newbie
• Posts: 15
Ball movement and bouncing in the Pong example
« Reply #6 on: August 09, 2011, 03:59:16 pm »
I have another quick question, so I just thought I'd post it here.

When bouncing the ball off of the paddle, this does not work:

Code: [Select]
`ballAngleRad = -ballAngleRad;`

The problem with this is that the ball's angle does not seem to change, and just passes right through.

I looked at the pong example which is so kindly provided, and tried this:

Code: [Select]
`ballAngleRad = PI - ballAngleRad;`

It fixes the problem, why is this?

jkalmeij

• Newbie
• Posts: 8
Ball movement and bouncing in the Pong example
« Reply #7 on: August 09, 2011, 06:00:52 pm »
A full circle is 2 * PI radians.

With this knowledge, draw a circle, take an arbitrary angle and play around with it.