Collision detection in C#.Net & Java example


Suppose we are making a game that deals with collision of objects moving around the screen, like a simple pong game or maybe a physics simulation. Implementing collision detection in C# is very simple to do. In this example we have a ball and a racket sprites that are moving on the screen. If the ball is to collide with the racket, then it bounces off, if it goes past the racket the game ends. The function that is the center of this concept is .Intersect() or .IntersectsWith(). In Java, its also the same name as well.

With C# we will be making a Windows Form app with a picturebox control to display the game. In Java the code for this demo is somewhat similar but a different approach.

Java version here

The C# approach uses Windows Forms (a picturebox control to display the simulation, a timer control used for ball animation). With this approach its very easy to understand code as we have a MoveBall() method that will act as the main function to move the ball using velocites of the ball (int dy,dx fields), DrawBall() draws the ball sprite in the picturebox, finally the timer tick event handler will call MoveBall() for every 1 ms of elapsed event. For our collision detection, we will use .IntersectsWith() to detect a collision and have some code that reacts to the collision. Finally we will use Rectangles for our racket and ball sprites.

C#

public partial class Form1 : Form
    {
        Rectangle racket;//our racket sprite
        Rectangle ball;//our ball sprite
        int dx, dy;
        int hitCount;
        public Form1()
        {
            InitializeComponent();
            racket = new Rectangle(120, 270, 60, 10);//sprite initialization
            ball = new Rectangle(140, 10, 20, 20);
            dx = 5;//initial speeds
            dy = 5;
            hitCount = 0;
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)//paint event handler to display the graphics using the picturebox
        {
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//for smoother graphics/shapes
            e.Graphics.FillRectangle(new SolidBrush(Color.RoyalBlue), racket);
            e.Graphics.DrawString("score: " + hitCount, DefaultFont, new SolidBrush(Color.Black), new Point(1, 1));

            DrawBall(e);//draws the ball
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)//mouse event handler to move the racket
        {
            racket.X = e.X;
            if (racket.Right > pictureBox1.Right) { racket.X = pictureBox1.Right - racket.Width; }
            Refresh();//refresh the control to display the new position of the racket
        }
        private void DrawBall(PaintEventArgs e)
        {
            e.Graphics.FillEllipse(new SolidBrush(Color.Red), ball);
        }
        private void MoveBall()//this method handles ball movement within the screen
        {
            if (ball.X + dx < 0)
            {
                dx += 10;
            }
            if (ball.X + dx >= pictureBox1.Width)
            {
                dx -= 10;
            }
            if (ball.Y + dy < 0)
            {
                dy += 5;
                if (dy == 0) { dy += 5; }
            }
            if (ball.Y + dy >= pictureBox1.Height)//game over handling if the ball goes past the racket & collides with the bottom of the screen
            {
                dx = 0;//set the speeds to zero
                dy = 0;

                var gameOver = MessageBox.Show("GAME OVER", "Message",MessageBoxButtons.OK);//show a message displaying game over
                if (gameOver == System.Windows.Forms.DialogResult.OK)
                {
                    Close();//close the program
                }
            }
            if (ball.IntersectsWith(racket))//COLLISION DETECTED!
            {
                dy -= 10;
                hitCount+=1;//increment after every hit
            }
            ball.X = ball.X + dx;//update the ball x position
            ball.Y = ball.Y + dy;//update the ball y position
        }

        private void timer1_Tick(object sender, EventArgs e)//the timer is very important, it acts as the main tool for animation
        {
            timer1.Interval = 1; //sets the frequency of elapsed events in milliseconds, important to set it 1 ms for smooth animation
            timer1.Enabled = true; //enable the timer
            MoveBall();//call move ball to update location
            Refresh();//refresh the environment
        }
    }

7

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s