Sign in to follow this  
similar

Stuck the ball in the board (pingpong game)

Recommended Posts

this game isn't completed yet, i've created the part where the ball hits the board, but there's problem in playing and that's the ball stucking in the board. For a better comprehension and understaning i've attached a video down below , plz watch it and lemme know of your take on this bug.

 

https://www.youtube.com/watch?v=WSZxw42qR-E

  public partial class PingPong : Form
{
    public PingPong()
    {
        InitializeComponent();
        timer1.Enabled = true;
        timer1.Interval = 30;
    }


    int mx = 5;
    int my = 5;
    private void timer1_Tick(object sender, EventArgs e)
    {

        if (ball.Bounds.IntersectsWith(boardCenter.Bounds))
        {
            mx = mx * -1;
            my = my * 1;
        }
        else if (ball.Location.Y >= this.ClientSize.Height - ball.Height)
        {
            mx = mx * 1;
            my = my * -1;
        }
        else if (ball.Location.Y <= 0)
        {
            mx = mx * 1;
            my = my * -1;
        }

        else if (ball.Location.X >= this.ClientSize.Width - ball.Width)
        {
            mx = mx * -1;
            my = my * 1;
        }


        ball.Location = new Point(ball.Location.X + mx, ball.Location.Y + my);

    }

    private void PingPong_KeyDown(object sender, KeyEventArgs e)
    {

        if (e.KeyCode == Keys.Up)
        {
            board.Location = new Point(board.Location.X, board.Location.Y - 4);

        }
        else if (e.KeyCode == Keys.Down)
        {
            board.Location = new Point(board.Location.X, board.Location.Y + 4);
        }

    }

}

Share this post


Link to post
Share on other sites

Make the paddle ignore the ball if its traveling away from it.

 

Currently the ball goes a bit inside it, its directions is reversed, its still inside it, so it gets reversed again (which prevents it from ever leaving the paddle)

 

 

To do this, ensure the direction the pad points, and the direction of ball velocity, point away from each other, before reversing ball direction (dot product is how you do this with vectors - but you can just use a simple conditional if you want to)

Share this post


Link to post
Share on other sites

That's the problem with naive collisions. When you assume that the ball can only impact in one direction, you only flip for that direction.

The proper collision method would be to test if the ball at any point intersects the planes of a box. Each plane will have a normal ( a vector that is perpendicular to the plane or line).

 

Should the ball intersect or (collide) with the plane (line) you reflect the ball about the normal.

 

The formula for this is...

N = Normal of the plane (line) of a box
V = Vector of the ball. Vector being the directional speed of the ball. Example X velocity = 5, Y velocity = 5. This equates to a ball moving at a 45 degree angle to the right with a speed of 5.

 

-2* DotProduct(N*V) - V

 

EDIT:

A note. As long as the normals are facing in the correct direction, This equation will work for any arbitrary surface. Even if the surface is curved, then taking an integration of the surface's form to produce a tangent will give you the means to create a normal.

 

If you want the ball's direction to be influence by the motion of the paddle, then you can manipulate the paddles normal.

Edited by Tangletail

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this