Обнаружить столкновение между прямоугольником и эллипсом
Привет, я новичок в этой работе! Я успешно создал Прямоугольник и Круг. Я перемещаю круг в моей форме и прямоугольник с помощью клавиш со стрелками (влево и вправо)! Проблема в том, что мне просто нужно знать, как можно обнаружить столкновение между этими двумя, чтобы я мог напечатать:
Console.WriteLine("COLLISION OCCURS!");
Я только хочу, чтобы обнаружение круга и прямоугольника. Когда мой круг выходит за пределы оси Y, я показываю сообщение (CIRCLE WENT OUT OF BOUNDS)! То, что я пытался это:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Paddle_Test
{
public partial class Form1 : Form
{
Rectangle rec;
Rectangle circle;
int wLoc=0;
int hLoc=0;
int eWL;
int eHL;
int dx = 4;
int dy = 4;
public Form1()
{
InitializeComponent();
wLoc=(this.Width) - 100;
hLoc=(this.Height) - 100;
eWL = 10;
eHL = 10;
rec = new Rectangle(wLoc,hLoc , 60, 10);
}
private void Form1_Load(object sender, EventArgs e)
{
this.Refresh();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.FillRectangle(new SolidBrush(Color.Blue), rec);
g.FillEllipse(new SolidBrush(Color.Red), eWL, eHL, 40, 40);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode==Keys.Left)
{
rec.X -= 30;
this.Refresh();
}
if (e.KeyCode==Keys.Right)
{
rec.X += 30;
this.Refresh();
}
}
private void timer_Tick(object sender, EventArgs e)
{
eWL = eWL + dx;
eHL = eHL + dy;
if (eWL >= (this.Width) - 100)
{
dx = dx * (-1);
}
else if (eHL >= (this.Height) - 100)
{
dy = dy * (-1);
//timer.Enabled = false;
//MessageBox.Show("Game Over!");
}
else if (eWL<=0)
{
dx = dx * (-1);
}
else if (eHL <= 0)
{
dy = dy * (-1);
}
else if (eWL == rec.X || eHL == rec.Y) //here I'm trying to detect the collision!
{
dx = dx * (-1);//invert the direction x-axis
dy = dy * (-1);//invert the direction y-axis
}
this.Refresh();
}
}
}
может кто-нибудь помочь мне, пожалуйста! заранее спасибо
1 ответ
Решение
Это ответ я получил сам!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Paddle_Test
{
public partial class Form1 : Form
{
Rectangle rec;
Rectangle circle;
int wLoc=0;
int hLoc=0;
int eWL;
int eHL;
int dx = 2;
int dy = 2;
public Form1()
{
InitializeComponent();
wLoc=(this.Width) - 100;
hLoc=(this.Height) - 100;
eWL = 10;
eHL = 10;
rec = new Rectangle(wLoc,hLoc , 100, 10);
circle = new Rectangle(eWL, eHL, 40, 40);
}
private void Form1_Load(object sender, EventArgs e)
{
this.Refresh();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.FillRectangle(new SolidBrush(Color.Blue), rec);
g.FillEllipse(new SolidBrush(Color.Red), circle);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode==Keys.Left)
{
rec.X -= 30;
this.Refresh();
}
if (e.KeyCode==Keys.Right)
{
rec.X += 30;
this.Refresh();
}
}
int count=0;
private void timer_Tick(object sender, EventArgs e)
{
circle.X += dx;
circle.Y += dy;
count += 1;
if (circle.X >= (this.Width) - 100)
{
dx = dx * (-1);
}
else if (circle.Y >= (this.Height))
{
//dy = dy * (-1);
timer.Enabled = false;
MessageBox.Show("Game Over!");
}
else if (circle.X <= 0)
{
dx = dx * (-1);
}
else if (circle.Y <= 0)
{
dy = dy * (-1);
}
else if (rec.IntersectsWith(circle))//detects collision!
{
//dx = dx * (-1);
dy = dy * (-1);
Console.WriteLine("hello");
}
this.Refresh();
}
}
}