Более простой способ проверки на столкновение? - PullRequest
4 голосов
/ 13 ноября 2010

Я работаю над заданием для универа, где мне нужно создать Breakout игру в Visual Studio 2010 с использованием C # Win Forms.В данный момент я концентрируюсь на том, что должен быть уничтожен только один кирпич, поэтому перед тем, как его расширять, я опускаю механику.

Чтобы прояснить свою текущую программу: я использую графический блок в качестве графического объектаи таймер для создания эффекта анимации.Шар может пропускать в каждом кадре от 1 до 10 пикселей - это часть создания случайного начального вектора для шара.

Это работает нормально, пока не проверяется, попал ли шар вкирпич я нарисовал.У меня есть оператор if, который проверяет, находится ли шар по какой-либо из координат в графическом окне, соответствующих контуру кирпича.Я знаю, что логика в порядке, потому что она работает иногда.Однако из-за различий в «прыжке» положения мяча мне нужно добавить буферную область размером +/- 5 пикселей к моему оператору if.

Вот здесь и возникает проблема, потому что мой if утверждение (два, действительно) является действительно сложным, как оно есть:

// Checks if ball hits left side or top of brick
if (((x >= brickX) && (x <= (brickX + 50)) && (y == brickY)) ||
    ((y >= brickY) && (y <= (brickY + 20)) && (x == brickX)))
{
    brickHit = true;
}
// Check if ball hits right side or bottom of brick
else if ((((x >= brickX) && (x <= brickX + 50)) && (y == (brickY + 20))) ||
    (((y >= brickY) && (y <= brickY + 20)) && (x == brickX + 50)))
{
    brickHit = true;
}

Для пояснения: x и y - координаты шара, а brickX и brickY - координатыверхний левый угол прямоугольного кирпича (ширина 50 пикселей, высота 10 пикселей).

Можно ли как-то упростить вышеприведенные операторы if? Если я смогу сделать их прощеЯ знаю, что будет гораздо проще добавить в «буфер» (который должен быть только 5 пикселей по обе стороны от контура кирпича », чтобы учесть изменение положения шара).

Если требуется дальнейшее уточнение, пожалуйста, спросите - я пишу этот вопрос в 5:12 утра, так что я знаю, что я могу быть немного неясным.

Ответы [ 3 ]

5 голосов
/ 13 ноября 2010

Одним способом вы могли бы упростить это (и я могу неправильно понять вашу спецификацию), но вы можете сделать прямоугольник из границ кирпича и проверить Содержимое для вашей точки x, y.

Rectangle rec = new Rectangle(brickX, brickY, 50, 20);
rec.Offset(-5, -5);
rec.Inflate(10, 10);
if (rec.Contains(new Point(x,y))
{
    brickHit = true;
}
3 голосов
/ 13 ноября 2010
brickHit = new Rectangle(brickX,brickY,50,20).Contains(x,y);

Добавление буфера:

int buffer = 5;
brickHit = new Rectangle(brickX,brickY,50,20).Inflate(buffer,buffer).Contains(x,y);

Класс Rectagle иногда может пригодиться.

0 голосов
/ 10 ноября 2017

Это сработало для меня:

var rect1 = new System.Drawing.Rectangle(pictureBox1.Location,
pictureBox1.Size);
var rect2 = new System.Drawing.Rectangle(pictureBox2.Location, 
pictureBox2.Size);

if (rect1.IntersectsWith(rect2))
{
  //code when collided
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...