PongGame - шар пролетает сквозь ракетки
Проблема описана в заголовке. Я написал следующую функцию для обработки столкновения шарика с ракеткой (в классе Ball.cs):
public bool IsCollideWithPaddle()
{
if (X == pad1.X + 1)
{
return (Y >= pad1.Y - pad1.Length / 2) && (Y <= pad1.Y + pad1.Length / 2);
}
else if (X == pad2.X - 1)
{
return (Y >= pad2.Y - pad2.Length / 2) && (Y <= pad2.Y + pad2.Length / 2);
}
else return false;
}
Но не было бы вопроса, будь она рабочей. Шарик просто пролетает сквозь ракетку. Причём, если возвращать true, если по координате X шарик совпадает с ракеткой, то отражение от всей этой вертикальной плоскости будет работать. То есть проблема заключается именно в логике этой функции, но я не могу понять где я ошибся. Вот все файлы игры:
Ball.cs
namespace Ping_Pong
{
class Ball
{
public int X { get; set; }
public int Y { get; set; }
public int SpeedX { get; set; }
public int SpeedY { get; set; }
public int BotBorder { get; set; }
public int RightBorder { get; set; }
public Paddle pad1 { get; set; }
public Paddle pad2 { get; set; }
public Ball(int width, int height, Paddle p1, Paddle p2)
{
X = width / 2;
Y = height / 2;
SpeedX = -1;
SpeedY = -1;
BotBorder = height;
RightBorder = width;
pad1 = p1;
pad2 = p2;
}
public void Erase()
{
Console.BackgroundColor = ConsoleColor.Black;
Console.SetCursorPosition(X - SpeedX, Y - SpeedY);
Console.Write(" ");
Console.SetCursorPosition(X, Y);
}
public void Draw()
{
Console.BackgroundColor = ConsoleColor.White;
Console.SetCursorPosition(X, Y);
Console.Write(" ");
Console.BackgroundColor = ConsoleColor.Black;
Erase();
}
public void Move()
{
if (IsCollideWithBorder()) { SpeedY = -SpeedY; }
if (IsCollideWithPaddle()) { SpeedX = -SpeedX; }
X += SpeedX;
Y += SpeedY;
Draw();
Thread.Sleep(100);
}
public bool IsCollideWithBorder()
{ if (Y <= 0 || Y >= BotBorder) return true; else return false; }
public bool IsCollideWithPaddle()
{
if (X == pad1.X + 1)
{
return (Y >= pad1.Y - pad1.Length / 2) && (Y <= pad1.Y + pad1.Length / 2);
}
else if (X == pad2.X - 1)
{
return (Y >= pad2.Y - pad2.Length / 2) && (Y <= pad2.Y + pad2.Length / 2);
}
else return false;
}
}
}
Board.cs
class Board
{
public int Height { get; set; }
public int Width { get; set; }
public Board(int h = 20, int w = 60)
{ Height = h; Width = w; }
public void CreateWindow()
{
Console.CursorVisible = false;
Console.WindowHeight = Height + 1;
Console.WindowWidth = Width + 1;
Console.BufferHeight = Console.WindowHeight;
Console.BufferWidth = Console.WindowWidth;
}
}
}
Paddle.cs
namespace Ping_Pong
{
class Paddle
{
int boardHeight;
public int X { get; set; }
public int Y { get; set; }
public int Length { get; set; }
public Paddle(int x, int Height) // x - position, Height - b1.Height
{
this.boardHeight = Height;
X = x;
Y = Height / 2 + 6;
Length = 5;
}
[DllImport("user32.dll")]
static extern ushort GetAsyncKeyState(int vKey);
public bool IsKeyPushed(ConsoleKey vKey)
{ return 0 != (GetAsyncKeyState((int)vKey) & 0x8000); }
public void Draw()
{
Console.BackgroundColor = ConsoleColor.White;
for (int i = Y - (Length / 2); i <= (Y + Length / 2); i++)
{
Console.SetCursorPosition(X, Y + i);
Console.Write(" ");
}
Console.SetCursorPosition(X, Y + Length);
Console.BackgroundColor = ConsoleColor.Black;
}
public void Erase()
{
Console.BackgroundColor = ConsoleColor.Black;
for (int i = Y - (Length / 2); i <= (Y + Length / 2); i++)
{
Console.SetCursorPosition(X, Y + i);
Console.Write(" ");
}
Console.SetCursorPosition(X, Y + Length);
}
public void Move(ConsoleKey Up, ConsoleKey Down)
{
Console.ReadKey(true);
if (IsKeyPushed(Up))
{
if (Y >= 2)
{
Erase();
Y--;
Draw();
}
}
if (IsKeyPushed(Down))
{
if (Y <= boardHeight * 2 + 3)
{
Erase();
Y++;
Draw();
}
}
if (IsKeyPushed(ConsoleKey.Escape))
{ Environment.Exit(0); }
}
}
}
Game.cs
namespace Ping_Pong
{
class Game
{
private const int BoardHeight = 30;
private const int BoardLength = 100;
public Board b;
public Paddle p1;
public Paddle p2;
public Ball ball;
public int countLeft;
public int countRight;
public Game()
{
b = new Board(BoardHeight, BoardLength);
p1 = new Paddle(2, 5);
p2 = new Paddle(BoardLength - 2, 5);
ball = new Ball(BoardLength, BoardHeight, p1, p2);
countLeft = 0;
countRight = 0;
}
// метод для обновления карты (потом пригодится)
public void Init()
{
b = new Board(BoardHeight, BoardLength);
p1 = new Paddle(2, 5);
p2 = new Paddle(BoardLength - 2, 5);
ball = new Ball(BoardLength, BoardHeight, p1, p2);
}
public void Run()
{
b.CreateWindow();
p1.Draw();
p2.Draw();
ball.Draw();
while (true)
{
ball.Move();
p1.Move(ConsoleKey.W, ConsoleKey.S);
p2.Move(ConsoleKey.UpArrow, ConsoleKey.DownArrow);
Thread.Sleep(10);
}
}
}
}
Program.cs
namespace Ping_Pong
{
class Program
{
static void Main(string[] args)
{
Game game = new Game();
game.Run();
}
}
}
Ошибка по всей видимости кроется в методе Draw(), либо Move() класса Ball, но я не могу понять в чём именно там ошибка.