Лабораториска вежба 8 - finki-mk/VP GitHub Wiki

Pacman

Опис на задачата

Во оваа задача треба да се имплементира варијација на играта Pacman.

Конечен изглед на играта

Класа за Pacman

Најпрво ќе дефинираме класа Pacman која ќе го претставува херојот кој ќе ја јаде храната (сликата со портокал) во мапата.

Во оваа класа ќе се чуваат информации за:

  • позицијата на херојот (X, Y),
  • насоката (лево, нагоре, десно, долу),
  • радиусот на кругот со кој се исцртува кој е со фиксна големина 20,
  • брзина на движење (предефинирана на големината на радиусот)
  • информација дали е отворена устата или не.

Исто така се чува и објект од класата Brush за четката со која се црта херојот и која треба да биде во жолта боја SolidBrush(Color.Yelow).

Конструктор

public class Pacman
{
    // vasiot kod ovde
    
}

Во конструкторот на оваа класа треба да се иницијализираат брзината со вредност на радиусот, X и Y координатите на средина од мапата (7, 5) и насоката да се постави на десно.

public Pacman()
{
    // vasiot kod ovde
}

Метод за менување на насоката на херојот

Насоката на херојот се менува во една од следниве: лево, десно, горе или долу.

public void ChangeDirection(DIRECTION direction)
{
    // vasiot kod ovde
}

Метод за придвижување

Во овој метод се придвижува херојот според насоката се со додавање/одземање 1 на X или Y компонентата од позицијата на херојот. Ако излезе од граници се поставува циркуларно на почетната позиција од спротивната страна (пр. доколку десната граница е 15, кога Y ќе ја надмине оваа граница се поставува на 1 односно на левата граница).

Исто така при секое едно придвижување се менува состојбата на устата на херојот во отворена, односно затворена.

public void Move()
{
    // vasiot kod ovde
}

Метод за исцртување на херојот

Во овој метод се исцртува полно жолто кругче кога устата е затворена, а ако устата на херојот е отворена се исцтува пита (FillPie) 3/4 со преостанатата четвртина во насоката во која се движи херојот.

public void Draw(Graphics g)
{
    // vasiot kod ovde
}       

Имплементација на главната форма

За додавање на сликата во ресурсите на апликацијата десен клик на проектот, па потоа иберете:

Properties -> Resources -> Add Resource -> Add Existing File

Приватни членови во главната форма.

   Timer timer;
   Pacman pacman;
   static readonly int TIMER_INTERVAL = 250;
   static readonly int WORLD_WIDTH = 15;
   static readonly int WORLD_HEIGHT = 10;
   Image foodImage;
   bool[][] foodWorld;

Во конструкторот на формата се вчитува сликата и се повикува методот за стартување нова игра.

   public Form1()
   {
        InitializeComponent();
        // Vcituvanje na slika od resursi
        foodImage = Resources.food;
        DoubleBuffered = true;
        newGame();
   }

Во овој метод се иницијализира нова игра.

Прво додадете го кодот во кој се иницијализира секое поле од дводимензионалната низа foodWorld за претставување на храната во играта на true.

Потоа инстанцирајте нов објект од класата Timer и поставите го неговиот интервал на статичката променлива TIMER_INTERVAL. Имплементирајте го неговиот метод Tick и повикајте го методот за стартување.

   public void newGame()
   {
       pacman = new Pacman();
       this.Width = Pacman.RADIUS * 2 * (WORLD_WIDTH + 1);
       this.Height = Pacman.RADIUS * 2 * (WORLD_HEIGHT + 1);
       // овде кодот за иницијализација на матрицата foodWorld


       // овде кодот за иницијализација и стартување на тајмерот

   }

Имплементација на timer_Tick настанот. Во овој настан се ажурира состојбата на играта.

Треба да имплементирате изминување на матрицата и во зависност од тоа дали Pacman херојот се наоѓа на таа позиција соодветното поле да го поставите на false (храната е изедена).

    void timer_Tick (object sender, EventArgs e)
    {
        // овде вашиот код
           
             
        pacman.Move(WORLD_WIDTH, WORLD_HEIGHT);
        Invalidate();
    }

Играта ќе се контролира со помош на настанот KeyUp и затоа додадете метод за овој настан во кој за соодветното копче кое е притиснато треба да се постави насоката на pacman објектот со помош на методот ChangeDirection.

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        // не заборавајте да го додадете настанот на самата форма
        // вашиот код овде

        Invalidate();
    }

Имплементација на методот за исцртување на состојбата на играта.

 private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.Clear(Color.White);
    for (int i = 0; i < foodWorld.Length; i++)
    {
        for (int j = 0; j < foodWorld[i].Length; j++)
        {
            if (foodWorld[i][j])
            {
                g.DrawImageUnscaled(foodImage, j * Pacman.RADIUS * 2 + (Pacman.RADIUS * 2 - foodImage.Height) / 2, i * Pacman.RADIUS * 2 + (Pacman.RADIUS * 2 - foodImage.Width) / 2);
            }
        }
    }
    pacman.Draw(g);
}

Имплементација на играта Pacman на почетната страна на Google

Имплементација на играта Pacman на почетната страна на Google