//We draw the image on the Form1:
e.Graphics.DrawImage(backBuffer, 0, 0);
//We turn on the timer:
timer1.Enabled = true;
} //End of the method Form1_Paint.
Если мы сейчас запустим программу на выполнение, то увидим, что мерцание уменьшилось, но не исчезло совсем. Это объясняется тем, что при выполнении метода Form1_Paint операционная система Windows сначала заполняет экран цветом фона (background color), в нашем примере белым фоном (white), и только после этого поверх фона прорисовывает встроенные в программу изображения. Поэтому необходимо сделать так, чтобы операционная система Windows не изменяла фон. Для этого воспользуемся неоднократно применяемым и в наших предыдущих книгах, и в данной книге шаблоном метода OnPaintBackground, в тело которого мы ничего не будем записывать, как показано на следующем листинге.
Листинг 4.11. Метод OnPaintBackground.
protected override void OnPaintBackground(
System.Windows.Forms.PaintEventArgs e)
{
//We prohibit to redraw a background.
}
Этот метод OnPaintBackground следует записать непосредственно за методом Form1_Paint, естественно, в теле класса Form1.
Теперь в режиме выполнения (Build, Build Selection; Debug, Start Without Debugging) подвижный сыр и неподвижный хлеб уже не мерцают, и мы решили данную задачу.
Однако при перемещении сыр может перекрыть батон хлеба (рис. 4.8), хотя по правилам игры пользователь должен управлять перемещением хлеба, не давая сыру упасть вниз, а маленький кусочек сыра при столкновении должен отскочить от большого батона хлеба в противоположном направлении. Поэтому методично и последовательно перейдём к решению этих задач.
4.7. Методика управления направлением перемещения объекта при помощи элементов управления и мыши
Теперь программа должна перемещать батон хлеба таким образом, чтобы игрок мог отбивать хлебом сыр, как ракетка отбивает мяч в теннисе. Для перемещения объекта вверх (Up), вниз (Down), влево (Left) и вправо (Right) пользователь может использовать разнообразные элементы управления и компоненты с панели инструментов Toolbox, мышь, клавиатуру, джойстик и другие устройства. Для примера, размещаем на форме четыре кнопки Button с соответствующими заголовками в свойстве Text для перемещения хлеба Вверх, Вниз, Влево и Вправо (рис. 4.9). Перед размещёнием кнопок, для формы Form1 в панели Properties увеличиваем её размеры Size, например, до 384; 473.
Рис. 4.9. Подвижный сыр и управляемый нами хлеб. Рис. 4.10. Сыр закрывает хлеб.
По второму варианту, свяжем верхний левый угол прямоугольника, описанного вокруг хлеба, с указателем мыши, чтобы в режиме выполнения хлеб следовал за управляемым нами указателем мыши.
В режиме проектирования дважды щёлкаем по каждой новой кнопке, а в панели Properties на вкладке Events дважды щёлкаем по имени события MouseMove. Появившиеся шаблоны методов для обработки этих событий после записи нашего кода принимают следующий вид.
Листинг 4.12. Методы для обработки событий.
private void button3_Click(object sender, EventArgs e)
{
//We move an object up:
by -= ySpeed;
}
private void button4_Click(object sender, EventArgs e)
{
//We move an object down:
by += ySpeed;
}
private void button5_Click(object sender, EventArgs e)
{
//We move an object to the left:
bx -= xSpeed;
}
private void button6_Click(object sender, EventArgs e)
{
//We move an object to the right:
bx += xSpeed;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
//We determine the coordinates of mouse pointer on form:
int mouseX = e.X;
int mouseY = e.Y;
//We set the coordinates of bread, equal to coordinates
//of mouse:
bx = mouseX;
by = mouseY;