Вот несколько советов, которые могут помочь.
Прежде всего, все ваши объекты, такие как Player
, Bal
(не уверен, что это такое) и Brick
имеют несколько похожий интерфейс - все они имеют sprite
(определяющий размер объекта) rect
(ограничительная рамка объекта), position
(текущая позиция), velocity
(текущая скорость). Это говорит о том, что вы можете создать общий базовый класс для инкапсуляции этой функциональности.
Также обратите внимание, что вы всегда пересчитываете rect
на основе текущих position
и sprite
. Это говорит о том, что rect
на самом деле должно быть свойством, которое скрывает пересчет (который всегда одинаков!)
Итак, вы можете начать с определения общего базового класса, подобного этому (я буду следовать стандартному стилю кодирования .NET и использовать свойства и CamelCase
имена):
class GameObject {
Point Position { get; set; }
Vector Velocity { get; set; }
Sprite Sprite { get; set; }
Rectangle Rect {
get {
// Ecnapsulated calculation of the bounding rectangle
return new Rectangle
( (int)Position.X + (int)Velocity.X - Sprite.Width/2,
(int)Position.Y + (int)Velocity.Y - Sprite.Height/2,
Sprite.Width, Sprite.Height);
}
}
Если вы теперь используете этот тип в качестве базового класса для всех своих игровых объектов, вы должны написать:
protected void Collision() {
#region Boundaries
if (bal.Position.X + bal.Velocity.X >= viewportRect.Width ||
bal.Position.X + bal.Velocity.X <= 0)
bal.Velocity.X *= -1;
if (bal.Position.Y + bal.Velocity.Y <= 0)
bal.Velocity.Y *= -1;
#endregion
if (bal.Rect.Intersects(player.Rect)) {
bal.Position.Y = player.Position.Y - player.Sprite.Height/2
- bal.Sprite.Height/2;
if (player.Position.X != player.PrevPos.X)
bal.Velocity.X -= (player.PrevPos.X - player.Position.X) / 2;
bal.Velocity.Y *= -1;
}
foreach (Brick b in brickArray.list) {
if (bal.Rect.Intersects(b.Rect)) {
b.RecieveHit();
bal.Velocity.Y *= -1;
}
}
brickArray.RemoveDead();
}
Также неплохо разделить функцию на две: одна проверяет bal
и player
, а другая проверяет кирпичи.