【问题标题】:Adding images to pictureBox将图像添加到图片框
【发布时间】:2012-12-21 21:35:39
【问题描述】:

我正在写一个简单的游戏——蛇。我想有背景和我的蛇。我认为最好的方法是使用两个图片框(一个有背景,第二个 - 透明,上面有蛇)。

这是个好办法吗?以及如何将几个小图像(蛇的片段)放在不同位置的一个图片框上(只需将像素(一个接一个)从图像复制到图片框,或者也许有最快的方法 - 将所有图像放在正确的位置)?我现在有带有背景(父)和另一个透明(子)的图片框。

结果应该是这样的:

我做了类似的东西(感谢@dotTutorials),但是我的蛇的部分比原始图像大一点,cookie 更小。哪里有问题?

绘图代码:

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

结果:

【问题讨论】:

  • 抱歉这个离题的评论,但你的蛇看起来棒极了!

标签: c# winforms image transparent picturebox


【解决方案1】:

实现这一点的最佳方法肯定是使用“图形”类。请进一步查看 GDI 和命名空间 System.Drawing

如果您想使用代表游戏空间的 Picturebox,您也可以通过调用成员 CreateGraphics 轻松地将图形实现到 Picturebox。

希望对您有所帮助! :) 请注意,当您开始认真的游戏开发时,您必须找到比 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
    }

更新: DrawImage 方法也接受 RectangleF 输入。一个 RectangleF 包含 4 种数据类型,float X、float Y、float Width 和 float Height。

使用 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;
        }
    }

【讨论】:

  • 我知道这一点 - 我想知道有两个图片框的想法是正确的,我想问有没有更简单的方法将小图像(蛇的片段)放在图片框上,以应对每个像素(只需放置它以纠正请求)。游戏是展示完全不同的东西的唯一方式(项目的主要主题 - 使用不同的控制器,如 KINECT 等) - 我只是认为它比控制台中的文本和数字更好。
  • 嗯。我不确定我是否完全理解你。但是,您可能正在寻找 Bitmap.LockBits 函数。
  • 它可以工作,但我有一个小问题 - 屏幕上的图片比原始图像大一点。你知道问题出在哪里吗? (我想蛇的部分)。请看我编辑的问题:)
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多