2012-12-21 137 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