Валерий Алексеевич Жарков

Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 7: Программирование на Visual C# искусственного интеллекта. Издание 2


Скачать книгу

= tomatoDrawHeight;

      tomatoes[i].visible = true;

      }

      }

      Приведённый выше код в теле метода Form1_Paint заменяем на тот, который дан на следующем листинге.

      Листинг 5.5. Метод для рисования изображения.

      private void Form1_Paint(object sender, PaintEventArgs e)

      {

      //If it is necessary, we create the new buffer:

      if (backBuffer == null)

      {

      backBuffer = new Bitmap(this.ClientSize.Width,

      this.ClientSize.Height);

      }

      //We create a object of the Graphics class from the buffer:

      using (Graphics g = Graphics.FromImage(backBuffer))

      {

      //We clear the form:

      g.Clear(Color.White);

      //We draw the image in the backBuffer:

      g.DrawImage(cheeseImage, cx, cy);

      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 draw the image on the Form1:

      e.Graphics.DrawImage(backBuffer, 0, 0);

      } //End of the method Form1_Paint.

      Добавление новых объектов в игру соответственно усложняет код. В панели Properties (для Form1) на вкладке Events дважды щёлкаем по имени события Load. Появившийся шаблон метода Form1_Load после записи нашего кода принимает следующий вид.

      Листинг 5.6. Метод для рисования изображения.

      private void Form1_Load(object sender, EventArgs e)

      {

      //We load into objects of class System.Drawing.Image

      //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 tomato:

      tomatoImage =

      new Bitmap(myAssembly.GetManifestResourceStream(

      myName_of_project + "." + "tomato.gif"));

      //We initialize an array of tomatoes and rectangles:

      initialiseTomatoes();

      //We place the tomatoes in an upper part of the screen:

      placeTomatoes();

      //We turn on the timer:

      timer1.Enabled = true;

      }

      И наконец, вместо приведённого выше метода updatePositions записываем следующий метод, дополненный новым кодом для изменения координат, обнаружения столкновений объектов и уничтожения помидоров.

      Листинг 5.7. Метод для изменения координат и обнаружения столкновения объектов.

      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 the 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;

      //We check the collision of objects

      //taking into account the tomatoes:

      if (goingDown)

      {

      // only bounce if the cheese is going down

      if (cheeseRectangle.IntersectsWith(breadRectangle))

      {

      //At the time of collision,

      //the