Я сделал игру «Прорыв». Небольшой веселый сайд-проект.
Теперь я обычно не играю в игры, поэтому я не думаю о том, чтобы обрабатывать столкновения.
У меня есть весло, мяч и несколько кирпичей.
Пока что, когда происходит столкновение (я рисую прямоугольники вокруг каждого из упомянутых объектов), я просто изменяю значение Y шара на -Y.
Это прекрасно работает, ЗА ИСКЛЮЧЕНИЕМ, если мяч попадает в кирпич сбоку (на восток или запад). Побочный эффект не очень приятный и портит игровой процесс.
Я думаю, что могу смело предположить, что вместо вышеупомянутой техники мне нужно изменить значение X на -X, когда это произойдет.
Пока у меня есть: if (ballRect.IntersectsWith(brickRect))
ballRect
и brickRect
- прямоугольники вокруг каждого объекта.
Теперь, что если я создам прямоугольник вокруг восточной границы кирпича, западной границы и т. Д.? Я думаю, ширина будет около пикселя.
Если столкновение происходит с западным или восточным прямоугольником, то значение шаров X должно быть -X.
И наоборот.
А как же углы? Должен ли я просто случайно выбрать, какой прямоугольник контролировать угол х?
Или, может быть, я должен сделать прямоугольник вокруг каждого угла? прямоугольник 1 * 1 в сторону.
Если есть столкновение => -x И -у значений шара?
Пожалуйста, поделитесь своими мыслями.
Вот процесс на данный момент:
foreach (var brick in Bricks)
{
if (brick.IsAlive)
{
var brickRect = new Rectangle(brick.X, brick.Y, BrickWidth, BrickHeight);
if (ballRect.IntersectsWith(brickRect)) //Ball has hit brick. lets find out which side of the brick
{
var brickRectNorth = new Rectangle(brick.X, brick.Y + BrickHeight, BrickWidth, 1);
var brickRectSouth = new Rectangle(brick.X, brick.Y, BrickWidth, 1);
var brickRectEast = new Rectangle(brick.X, brick.Y, 1, BrickHeight);
var brickRectWest = new Rectangle(brick.X + BrickWidth, brick.Y, 1, BrickHeight);
if (ballRect.IntersectsWith(brickRectNorth) || ballRect.IntersectsWith(brickRectSouth))
{
//STUFF that makes ball.y = -ball.y
}
if (ballRect.IntersectsWith(brickRectWest) || ballRect.IntersectsWith(brickRectEast))
{
//STUFF that makes ball.x = -ball.x
}
}
}
}