g.DrawImage(breadImage, bx, by);
for (int i = 0; i < tomatoes.Length; i++)
{
if (tomatoes[i].visible)
{
g.DrawImage(tomatoImage,
tomatoes[i].rectangle.X,
tomatoes[i].rectangle.Y);
}
}
//We write the player's points:
g.DrawString(messageString, messageFont, messageBrush,
messageRectangle);
}
//We draw the image on the Form1:
e.Graphics.DrawImage(backBuffer, 0, 0);
} //End of the method Form1_Paint.
Приведённый выше код в теле метода Form1_Load (для загрузки файлов изображений игровых объектов) заменяем на тот, который дан на следующем листинге.
Листинг 5.10. Метод для загрузки файлов изображений.
private void Form1_Load(object sender, EventArgs e)
{
//We load into objects of the System.Drawing.Image class
//the image files of the set format, added to the project,
//by means of ResourceStream:
cheeseImage =
new Bitmap(myAssembly.GetManifestResourceStream(
myName_of_project + "." + "cheese.JPG"));
breadImage =
new Bitmap(myAssembly.GetManifestResourceStream(
myName_of_project + "." + "bread.JPG"));
//We initialize the rectangles, described around objects:
cheeseRectangle = new Rectangle(cx, cy,
cheeseImage.Width, cheeseImage.Height);
breadRectangle = new Rectangle(bx, by,
breadImage.Width, breadImage.Height);
//We load the image file of a new object:
tomatoImage =
new Bitmap(myAssembly.GetManifestResourceStream(
myName_of_project + "." + "tomato.gif"));
//We initialize an array of new objects and rectangles,
//described around these objects:
initialiseTomatoes();
//We place new objects in an upper part of the screen:
placeTomatoes();
//We create and initialize a font for record of points:
messageFont = new Font(FontFamily.GenericSansSerif, 10,
FontStyle.Regular);
//We reserve a rectangle on the screen
//for record of points:
messageRectangle = new Rectangle(0, 0,
this.ClientSize.Width, scoreHeight);
//We set the color of a brush for record of points:
messageBrush = new SolidBrush(Color.Black);
//We turn on the timer:
timer1.Enabled = true;
} //End of the method Form1_Load.
И наконец, вместо приведённого выше метода updatePositions записываем следующий метод, дополненный новым кодом для изменения координат, обнаружения столкновений объектов, уничтожения помидоров и подсчёта очков.
Листинг 5.11. Метод для изменения координат и обнаружения столкновения объектов.
private void updatePositions()
{
if (goingRight)
{
cx += xSpeed;
}
else
{
cx -= xSpeed;
}
if ((cx + cheeseImage.Width) >= this.Width)
{
goingRight = false;
//At the time of collision, the Beep signal is given:
Microsoft.VisualBasic.Interaction.Beep();
}
if (cx <= 0)
{
goingRight = true;
//At the time of collision, the Beep signal is given:
Microsoft.VisualBasic.Interaction.Beep();
}
if (goingDown)
{
cy += ySpeed;
}
else
{
cy -= ySpeed;
}
//That cheese did not come for the button3.Location.Y:
if ((cy + cheeseImage.Height) >= button3.Location.Y)
{
goingDown = false;
//At the time of collision, the Beep signal is given:
Microsoft.VisualBasic.Interaction.Beep();
}
if (cy <= 0)
{
goingDown = true;
//At the time of collision, the Beep signal is given:
Microsoft.VisualBasic.Interaction.Beep();
}
//We set to rectangles of coordinate of objects:
cheeseRectangle.X = cx;
cheeseRectangle.Y = cy;
breadRectangle.X = bx;
breadRectangle.Y = by;
// check for collisions.
if (goingDown)
{
// only bounce if the cheese is going down
if (cheeseRectangle.IntersectsWith(breadRectangle))
{
//At the time of collision,
//the Beep signal is given:
Microsoft.VisualBasic.Interaction.Beep();
// we have a collision
bool rightIn = breadRectangle.Contains(
cheeseRectangle.Right,
cheeseRectangle.Bottom);
bool leftIn = breadRectangle.Contains(
cheeseRectangle.Left,
cheeseRectangle.Bottom);
// now deal with the bounce
if (rightIn & leftIn)
{
// bounce up
goingDown