Необходимо установить флаг, который будет отслеживать нажатия и отпускания клавиш. Когда флаг будет активирован, это будет означать, что пользователь нажал на клавишу, и батон должен двигаться в указанном направлении. Когда пользователь отпустит клавишу, то флаг сбрасывается и объект прекращает движение.
Обработчики событий используют перечисления Keys
, показывающие конкретные кнопки навигации. Соответствующий код приведен в листинге 11.15.
Листинг 11.15
///
/// Используем keyArgs в качестве флага
///
private System.Windows.Forms.KeyEventArgs keyArgs = null;
private void Form1_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e) {
keyArgs = e;
}
private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) {
keyArgs = null;
}
Когда программа получает вызов события Form1_KeyDown
, флаг keyArgs
ссылается на класс KeyEventArgs
. При наступлении события Form1_KeyUp
флаг keyArgs
сбрасывается в null
, и код нажатых клавиш игнорируется. Теперь надо переписать метод updatePositions
, как показано в листинге 11.16.
Листинг 11.16
private void updatePositions() {
// Код для кусочка сыра остался прежним
...
// Для батона хлеба
if (keyArgs != null) {
switch (keyArgs.KeyCode) {
case Keys.Up:
by-=ySpeed;
break;
case Keys.Down:
by+=ySpeed;
break;
case Keys.Left:
bx-=xSpeed;
break;
case Keys.Right:
bx+=xSpeed;
break;
}
}
}
В данном коде используется оператор switch
, который определяет действия программы в зависимости от нажатой клавиши. Батон хлеба движется с той же скоростью, что и кусочек сыра. На этой стадии при запуске программы пользователь может перемещать батон хлеба по всему экрану, в то время как кусочек сыра по-прежнему самостоятельно двигается по экрану.
Для контроля столкновений в играх используются прямоугольные области. Конечно, здесь далеко до реализма, так как предметы не всегда имеют прямоугольную форму. Но в некоторых случаях пользователь может и не заметить этого. Ограничивающий прямоугольник вокруг изображения хлеба выглядит так, как показано на рис. 11.4.
Рис. 11.4. Ограничивающий прямоугольник для объекта
Две точки позволяют оперировать координатами верхнего левого и нижнего правого углов прямоугольника. В .NET Compact Framework существует структура RECTANGLE
, использующая эти координаты для реализации прямоугольника. Несколько методов используют эту структуру для обнаружения пересечения двух прямоугольников. С их помощью и можно обнаружить столкновение объектов. Ранее использовавшиеся переменные надо заменить структурой RECTANGLE
, в которой будет содержаться информация о местонахождении объекта. Соответствующий код приведен в листинге 11.17.
Листинг 11.17
///
/// Позиция и ограничивающий прямоугольник для сыра
///
private Rectangle cheeseRectangle;
///
/// Позиция и ограничивающий прямоугольник для батона хлеба
///
private Rectangle breadRectangle;
Сразу после загрузки изображений надо ввести код, приведенный в листинге 11.18.
Листинг 11.18
// Получим координаты и ограничивающие прямоугольники
cheeseRectangle = new Rectangle(0, 0, cheeseImage.Width.cheeseImage.Height);
breadRectangle = new Rectangle(0, 0, breadImage.Width, breadImage.Height);
Теперь для вывода картинок на экран надо использовать в методе Form1_Paint
код, приведенный в листинге 11.19.
Листинг 11.19
g.DrawImage(breadImage, breadRectangle.X, breadRectangle.Y);
g.DrawImage(cheeseImage, cheeseRectangle.X, cheeseRectangle.Y);
При помощи свойств X
и Y
этих прямоугольников можно перемещать объекты по экрану. В методе updatePosition
надо заменить часть кода, отвечающую за движение сыра и батона, с учетом созданных переменных, как показано в листинге 11.20.
Листинг 11.20
private void updatePositions() {
// Движение кусочка сыра
if (goingRight) {
cheeseRectangle.X += xSpeed;
} else {
cheeseRectangle.X -= xSpeed;
}
if ((cheeseRectangle.X + cheeseImage.Width) >= this.Width) {
goingRight = false;
}
if (cheeseRectangle.X <= 0) {
goingRight = true;
}
if (goingDown) {
cheeseRectangle.Y += ySpeed;
} else {
cheeseRectangle.Y -= ySpeed;
Читать дальше