GDI+ Examples: Collision Detection I |
|
Introduction
Objects are said to collide when they touch each other. This is something very important in graphical applications and games, etc. It used to be particularly difficult but nowadays, it mostly depends on how you want to implement. In this exercise, we will draw to circles that keep moving on a form. If the meet (collide), they stop.
This example uses shapes of the Microsoft Visual Basic Power Packs.
Practical Learning: Introducing the Tree View Control
using System; using System.Drawing; using System.Windows.Forms; public class CollisionDetection : Form { static int xGreen; static int xBrown; static int yGreen; static int yBrown; static bool IsMovingDownGreen; static bool IsMovingDownBrown; static bool IsMovingRightGreen; static bool IsMovingRightBrown; Timer tmrMover; Microsoft.VisualBasic.PowerPacks.OvalShape osGreen; Microsoft.VisualBasic.PowerPacks.OvalShape osBrown; Microsoft.VisualBasic.PowerPacks.ShapeContainer shpContainer; public CollisionDetection() { InitializeComponent(); } private void InitializeComponent() { xGreen = 0; xBrown = 250; yGreen = 0; yBrown = 500; IsMovingDownGreen = false; IsMovingDownBrown = false; IsMovingRightGreen = false; IsMovingRightBrown = false; tmrMover = new Timer(); tmrMover.Interval = 2; tmrMover.Enabled = true; tmrMover.Tick += new EventHandler(tmrMoverTicked); osBrown = new Microsoft.VisualBasic.PowerPacks.OvalShape(); osBrown.BackColor = Color.FromArgb(255, 128, 0); osBrown.BackStyle = Microsoft.VisualBasic.PowerPacks.BackStyle.Opaque; osBrown.BorderColor = Color.FromArgb(128, 64, 0); osBrown.BorderWidth = 2; osBrown.Size = new System.Drawing.Size(80, 80); osGreen = new Microsoft.VisualBasic.PowerPacks.OvalShape(); osGreen.BackColor = Color.FromArgb(192, 255, 192); osGreen.BackStyle = Microsoft.VisualBasic.PowerPacks.BackStyle.Opaque; osGreen.BorderColor = Color.Cyan; osGreen.BorderWidth = 2; osGreen.Location = new Point(100, 100); osGreen.Size = new Size(80, 80); shpContainer = new Microsoft.VisualBasic.PowerPacks.ShapeContainer(); shpContainer.Location = new System.Drawing.Point(0, 0); shpContainer.Margin = new System.Windows.Forms.Padding(0); shpContainer.Shapes.Add(osBrown); shpContainer.Shapes.Add(osGreen); shpContainer.Size = new System.Drawing.Size(778, 576); BackColor = System.Drawing.Color.Black; ClientSize = new System.Drawing.Size(778, 576); Controls.Add(shpContainer); StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); } private void tmrMoverTicked(object sender, EventArgs e) { // If the status of the origin indicates that it is moving right, // then increase the horizontal axis if (IsMovingRightGreen == true) xGreen++; else // If it's moving left, then decrease the horizontal movement xGreen--; // If the status of the origin indicates that it is moving down, // then increase the vertical axis if (IsMovingDownGreen == true) yGreen++; else // Otherwise, decrease it yGreen--; // Collision: if the axis hits the right side of the screen, // then set the horizontal moving status to "Right", which will be used // by the above code if ((xGreen + osGreen.Width) >= ClientSize.Width) IsMovingRightGreen = false; if ((xGreen + osGreen.Width) <= 40) IsMovingRightGreen = true; ; if ((yGreen + osGreen.Height) > ClientSize.Height) IsMovingDownGreen = false; if ((yGreen + osGreen.Height) <= 40) IsMovingDownGreen = true; BackColor = Color.Black; osGreen.Location = new Point(xGreen, yGreen); // ----------------------------------------------------------- if (IsMovingRightBrown == true) xBrown++; else // If it's moving left, then decrease the horizontal movement xBrown--; // If the status of the origin indicates that it is moving down, // then increase the vertical axis if (IsMovingDownBrown == true) yBrown++; else // Otherwise, decrease it yBrown--; // Collision: if the axis hits the right side of the screen, // then set the horizontal moving status to "Right", which will be used // by the above code if ((xBrown + osBrown.Width) >= ClientSize.Width) IsMovingRightBrown = false; if ((xBrown + osBrown.Width) <= 40) IsMovingRightBrown = true; ; if ((yBrown + osBrown.Height) > ClientSize.Height) IsMovingDownBrown = false; if ((yBrown + osBrown.Height) <= 40) IsMovingDownBrown = true; osBrown.Location = new Point(xBrown, yBrown); if (osBrown.Bounds.IntersectsWith(osGreen.Bounds)) { tmrMover.Enabled = false; /* * Random rndNumber = new Random(); xGreen = rndNumber.Next(Width); xBrown = rndNumber.Next(Width); yGreen = rndNumber.Next(Height); yBrown = rndNumber.Next(Height); */ } } } public class Exercise { public static int Main() { Application.Run(new CollisionDetection()); return 0; } }
|
||
Home | Copyright © 2010-2020, FunctionX | |
|