Предмет:
Тип роботи:
Курсова робота
К-сть сторінок:
38
Мова:
Українська
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
</Window>
Це вікно є головним вікном гри, яке містить всю основну логіку. Основні поля класу, необхідні для ігрової логіки:
public DispatcherTimer timer = new DispatcherTimer(); //таймер
private double _angle = 155; //угол отбиения шара
private double SpeedOfBall = 5; //скорость шарика
private int SpeedOfPad = 5; //скорость ракеток
private const int RightBorder = 790; // правая граница
private const int LeftBorder = 5; //левая граница
//начальная позиция для шарика по иксу (слева)
private const int BeginPosForBall_X1 = 20;
// начальная позиция для шарика по иксу (справа)
private const int BeginPosForBall_X2 = 760;
// начальная позиция для шарика по Y
private const int BeginPosForBall_Y = 105;
// переменная для отслеживания запущен ли мячик (в полёте), чтобы не было сдвига при управлении ракетками
private bool _IsEnabled = false;
//какой противник подаёт (поочереди)
private bool Podacha = false;
//переменная для отслеживания на какой ракетке находится шарик (чтобы при сдвиге только одной ракетки двигался шарик)
private bool leftActive = true;
//число, при котором игра заканчивается
private int gameEndScore = 12;
public string leftPlayerName = string.Empty;
public string rightPlayerName = string.Empty;
string img_ball_path = @"..\..\Textures\ball3.png";
//Если объявление поля содержит модификатор readonly,
//присвоение значений таким полям может происходить только как часть объявления или в конструкторе в том же классе.
readonly Ball _ball = new Ball //создание обьекта шарика
{
X = BeginPosForBall_X1, //начальные координаты по X
Y = BeginPosForBall_Y, //нач. коорд. по Y
MovingRight = true //движение вправо
};
readonly Pad _leftPad = new Pad //левая ракетка
{
YPosition = 70 //стартовая позиция по Y
};
readonly Pad _rightPad = new Pad //правая ракетка
{
YPosition = 70
};
Гра починається при натисканні кнопки «Пробіл». Обробник старту гри:
private void MainWindow_OnKeyDown(object sender, KeyboardEventArgs e)
{
if (PauseMenuPanel.Visibility == System.Windows.Visibility.Hidden) //Если заткрыто меню паузы тогда проверяем всё по логике работы
{
if (_IsEnabled == false) //запущен ли мячик (в полёте), чтобы не было сдвига при управлении ракетками
{
if (leftActive) // если сейчас управляем левой ракеткой и шарик слева
{
CheckBordersForRockets(true, true); //метод, который создаёт ограничение для ракеток на выход из игрового поля. Значение true указывает на сдвиг мячика
if (Keyboard.IsKeyDown(Key.LeftShift)) //если нажата клавиша W
{
_leftPad.YPosition -= SpeedOfPad; //меняем позицию левой ракетки (координаты) на скорость ракетки
_ball.Y -= SpeedOfPad; //и шарик на скорость ракетки
}
if (Keyboard.IsKeyDown(Key.LeftCtrl))
{
_leftPad.YPosition += SpeedOfPad;
_ball.Y += SpeedOfPad;}}
else // правая сторона активная
{
CheckBordersForRockets(true, false);
if (Keyboard.IsKeyDown(Key.Up))
{
_rightPad.YPosition -= SpeedOfPad;
_ball.Y -= SpeedOfPad;
}
if (Keyboard.IsKeyDown(Key.Down))
{
_rightPad.YPosition += SpeedOfPad;
_ball.Y += SpeedOfPad;
}
}
if (Keyboard.IsKeyDown(Key.Space)) //если пробел
{
_IsEnabled = true; //следующий раз глянет другую ветку ифа, без проверки на сдвиг шарика
timer.Start(); //запускаем таймер
}}
else{
CheckBordersForRockets(false, true); //метод, который создаёт ограничение для ракеток на выход из игрового поля.false - шарик в полёте
CheckBordersForRockets(false, false);
if (Keyboard.IsKeyDown(Key.LeftShift))
_leftPad.YPosition -= SpeedOfPad;
if (Keyboard.IsKeyDown(Key.LeftCtrl))
_leftPad.YPosition += SpeedOfPad;
if (Keyboard.IsKeyDown(Key.Up))
_rightPad.YPosition -= SpeedOfPad;
if (Keyboard.IsKeyDown(Key.Down))
_rightPad.YPosition += SpeedOfPad;
}
if (Keyboard.IsKeyDown(Key.Escape))
{
PauseMenuPanel.Visibility = System.Windows.Visibility.Visible;
timer.Stop();}}
else //если окно паузы открыто, проверяем только клавишу Esc
{if (Keyboard.IsKeyDown(Key.Escape))
{ToClosePauseMenu();}}}
Метод польоту м’ячика, який відбувається за таймером:
void _timer_Tick(object sender, EventArgs e) //при тике таймера
{
if (_ball.Y <= 0) //если положение мячика по Y <=0 то меняем угол (столкновение с нижней гранью)
_angle = _angle + (180 - 2 * _angle);
if (_ball.Y >= MainCanvas.ActualHeight - 20) //если положение по Y мяча >= значению высоты главной канвы - высота мячика