2015-05-01 34 views
0

我正在製作pacman遊戲,但這是我不知道該怎麼做的事情: 當pacman擊中食物時,食物應該消失。我的代碼不起作用。下面是初始化食品世界上功能:檢查pacman運動

namespace pacman 
{ 
public partial class Form1 : Form 
{ 
    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(); 

     foodImage = Properties.Resources.foodImage; 
     DoubleBuffered = true; 
     newGame(); 
    } 

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

     foodWorld = new bool[WORLD_WIDTH][]; 
     for (int i = 0; i < WORLD_WIDTH;i++) 
     { 
      foodWorld[i] = new bool[WORLD_HEIGHT]; 
     } 

     for (int i = 0; i < WORLD_WIDTH; i+=2) { 
      for (int j = 0; j < WORLD_HEIGHT; j++) { 

       foodWorld[i][j] = true; 

      } 
     } 

     // овде кодот за иницијализација и стартување на тајмерот 
     timer = new Timer(); 
     timer.Interval = TIMER_INTERVAL; 
     timer.Tick += new EventHandler(timer_Tick); 
     timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     // овде вашиот код 
     timer.Interval = TIMER_INTERVAL - 1; 
     if (TIMER_INTERVAL == 0) 
     { 
      timer.Stop(); 
     } 

     for (int i = 0; i < WORLD_WIDTH; i++) { 

      for (int j = 0; j < WORLD_HEIGHT; j++) { 

       if (pacman.x == i && pacman.y == j && foodWorld[i][j]) 
       { 

        foodWorld[i][j] = false; 
        this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); 
        pacman.open = true; 
       } 
       else { 

        pacman.open = false; 
       } 
      } 
     } 

     pacman.Move(WORLD_WIDTH, WORLD_HEIGHT); 
     Invalidate(); 
    } 

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

      pacman.ChangeDirection("UP"); 
     } 
     if (e.KeyCode == Keys.Down) 
     { 

      pacman.ChangeDirection("DOWN"); 
     } 
     if (e.KeyCode == Keys.Left) 
     { 

      pacman.ChangeDirection("LEFT"); 
     } 
     if (e.KeyCode == Keys.Right) 
     { 

      pacman.ChangeDirection("RIGHT"); 
     } 

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

    } 

} 
    } 

我應該怎麼改變,使得由吃豆子感動的畫面中消失?

+0

您需要發佈第一個代碼片段中的代碼所屬的方法。您是否還可以通過自己的代碼步驟,以便您可以嘗試查明斷開連接的位置。 – MethodMan

+0

我在編輯中發佈了我在該頁面上的所有內容。是的,我現在已經堅持了兩個小時,完全不知道錯誤在哪裏。 –

+0

當計時器滴答時,你確定pacman的位置實際上處於食物的位置嗎?你有沒有在'foodWorld [i] [j] = false'這行上設置一個斷點來確保代碼被執行?我懷疑國旗永遠不會被清除。 –

回答

4

當吃豆子吃的食物,你有這樣的:

this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); 

這句法是訂閱Paint事件。你應該只做過一次而已。相反,使用:

this.Invalidate(); 

呼叫無效告訴操作系統,「嘿,我需要重新畫!」。然後操作系統將生成最終觸發Paint事件並執行繪製代碼的事件。

+0

我改變了它,但沒有改變。圖像不會消失。 –

+0

@ Spirit_Scarlet可能是因爲計時器停止了。你以1/4秒的時間間隔開始,然後每次發射時間間隔縮短一次。沒有數學計算,我會說你的計時器在幾十秒內停止了?在帕克曼移動時執行食物檢查,而不是在計時器中。 – Tergiver