2012-12-21 177 views
2

我正在寫一個簡單的遊戲 - 蛇。我想有背景和我的蛇。我認爲最好的方法是使用兩個pictureBox(一個帶背景,第二個帶透明蛇)。將圖像添加到圖片框

這是一個好方法嗎?如何在不同的地方在一個圖片框上放置幾個小圖片(蛇的片段)(只需將圖片的像素(一個接一個)從圖像複製到pictureBox或者最快的方法 - 將所有圖像放在正確的位置)?我有pictureBox背景(父母)和另一個,透明(孩子)現在。

結果應該看起來類似的東西:

sample Image

我做了類似的東西(感謝@dotTutorials),但我的蛇段比原始圖像和餅乾中稍大一點更小。哪裏可以成爲問題?

繪圖代碼:

public Bitmap PrinPlayground() 
{ 

    char[,] tempPitch = play.getPitch(); 

    Graphics g = pb2.CreateGraphics(); 
    Bitmap bitmap = new Bitmap(512, 512); 
    Graphics BBG = Graphics.FromImage(bitmap); 

    Bitmap head = CookieSnake.Properties.Resources.head; 
    Bitmap body01 = CookieSnake.Properties.Resources.body01; 
    Bitmap tail = CookieSnake.Properties.Resources.tail; 
    Bitmap cookie = CookieSnake.Properties.Resources.cookie; 

    BBG.Clear(Color.Transparent); 

    for (int i = 0; i < 16; i++) 
     for (int j = 0; j < 16; j++) 
     { 
      if (tempPitch[i, j] == 'H') 
      { 
       BBG.DrawImage(head, new Point(32*j, 32*i)); 
      } 
      else if (tempPitch[i, j] == 'B') 
      { 
       BBG.DrawImage(body01, new Point(32*j, 32*i)); 
      } 
      else if (tempPitch[i, j] == 'T') 
      { 
       BBG.DrawImage(tail, new Point(32 * j, 32 * i)); 
      } 
      else if (tempPitch[i, j] == 'C') 
      { 
       BBG.DrawImage(cookie, new Point(32 * j, 32 * i)); 
      } 
     } 
    g.DrawImage(bitmap, new Point(0,0)); 
    return bitmap; 
} 

結果:

enter image description here

+2

對不起這個題外評論,但你的蛇看起來很棒! –

回答

4

實現這一目標的最佳途徑無疑是使用 '圖形' 類。請進一步查看GDI以及名稱空間System.Drawing

如果您想使用代表遊戲空間的Picturebox,您可以通過呼叫成員CreateGraphics輕鬆地將圖形實現爲圖片框。

我希望這可以幫助你! :) 請注意,當您進入嚴肅的遊戲開發階段時,您必須找到比GDI更好的替代方案。我個人更喜歡XNA庫

GDI的使用示例[寫得很快,不應該被複制粘貼。然而;它是起源一個好點的:)]

Graphics g = pictureBox1.CreateGraphics(); 
    Bitmap BB = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
    Graphics BBG = Graphics.FromImage(BB); 

    Bitmap Background = (Bitmap)Bitmap.FromFile("BackgroundPicture.png"); 
    Bitmap Head = (Bitmap)Bitmap.FromFile("SnakeHead.png"); 
    Bitmap Tail = (Bitmap)Bitmap.FromFile("SnakeTail.png"); 

    Point snakeLocation = new Point((BB.Width/2) - (Head.Width/2), (BB.Height/2) - (Head.Height/2)); 


    while (true) { 
     #region Update 
     // update method here! 
     snakeLocation.X += 1; 
     #endregion 

     #region Draw 
     BBG.Clear(Color.CornflowerBlue); 
     BBG.DrawImage(Background, new Point(0, 0)); 

     BBG.DrawImage(Head, snakeLocation); 
     BBG.DrawImage(Tail, new Point(snakeLocation.X - Head.Width, snakeLocation.Y)); 

     g.DrawImage(BB, new Point(0, 0)); // draw to screen 
     #endregion 
    } 

UPDATE:的的DrawImage方法還可以接受的RectangleF輸入。 RectangleF由4個數據類型組成,浮點數X,浮點數Y,浮點寬度和浮點高度。

使用RectangleF可以輕鬆指定繪製圖像的大小。看看下面的代碼:

public Bitmap PrinPlayground() { 

      char[,] tempPitch = play.getPitch(); 

      Graphics g = pb2.CreateGraphics(); 
      Bitmap bitmap = new Bitmap(512, 512); 
      Graphics BBG = Graphics.FromImage(bitmap); 

      Bitmap head = CookieSnake.Properties.Resources.head; 
      Bitmap body01 = CookieSnake.Properties.Resources.body01; 
      Bitmap tail = CookieSnake.Properties.Resources.tail; 
      Bitmap cookie = CookieSnake.Properties.Resources.cookie; 

      BBG.Clear(Color.Transparent); 

      for (int i = 0; i < 16; i++) 
       for (int j = 0; j < 16; j++) { 
        if (tempPitch[i, j] == 'H') { 
         BBG.DrawImage(head, new RectangleF(new Point(32 * j, 32 * i), new SizeF(/*Adjust the size after your pleasure*/32, 32))); 
        } 
        else if (tempPitch[i, j] == 'B') { 
         BBG.DrawImage(body01, new RectangleF(new Point(32 * j, 32 * i), new SizeF(32, 32))); 
        } 
        else if (tempPitch[i, j] == 'T') { 
         BBG.DrawImage(tail, new RectangleF(new Point(32 * j, 32 * i), new SizeF(32, 32))); 
        } 
        else if (tempPitch[i, j] == 'C') { 
         BBG.DrawImage(cookie, new RectangleF(new Point(32 * j, 32 * i), new SizeF(/*Half the size of the head [Adjust after your needs!]*/32/2, 32/2))); 
        } 
       } 
      g.DrawImage(bitmap, new Point(0, 0)); 
      return bitmap; 
     } 
    } 
+0

我知道這一點 - 我想知道這個想法與兩個picturebox是正確的,我想問的是,有一種更簡單的方法來將小圖像(蛇的段)放在pictureBox上,以應付每個像素(只需將它放在正確的pleace上)。 而遊戲只是展現完全不同的東西的方法(項目的主要主題 - 使用不同的控制器,如KINECT等) - 我只是認爲它比控制檯中的文本和數字更好。 – CookieMonssster

+0

嗯。我不確定我是否完全理解你。但是,您可能正在尋找Bitmap.LockBits函數。 – dotTutorials

+0

它的作品,但我有一個小問題 - 屏幕上的圖片比原始圖像有點大。你知道哪裏可以解決問題嗎? (我想到蛇的細分)。看看我編輯的問題,請:) – CookieMonssster