C#,Windows窗体,重绘pictureBox

时间:2018-04-18 13:32:15

标签: c# winforms picturebox

我遇到了C#游戏的问题。 有一个随机放置的狼和浣熊的矩阵。当用户点击“新游戏”按钮时,我需要为动物生成新的位置并重绘我的画布(PicureBox)。 所以,我对生成没有任何问题,但是在pictureBox中动物的位置不会改变(但它会在第一次生成时显示)。

此外,我尝试用动物图标创建几个pictureBox(并在游戏过程中移动它),但它们没有显示(我已将它添加到此。控件中,但没有任何反应)。也许在浏览器中有一些像web-inspector这样的表单管理器,看看到底发生了什么?

我不想将项目移动到WPF应用程序。

以下代码:

private static Bitmap _gameArea = new Bitmap(_gameAreaSize, _gameAreaSize);

绘制事件(创建表格):

        private void drawTable(object sender, PaintEventArgs e)
    {
        Pen p = new Pen(Color.LightSlateGray);

        var g = Graphics.FromImage(_gameArea);
       for (int i = 0; i < Configs.MatrixSize + 1; i++)
        {
            float coord = i * _cellSize;
            if (coord.Equals(_gameAreaSize))
                coord = _gameAreaSize - 1;

           g.DrawLine(p, coord, 0, coord, _gameAreaSize);
           g.DrawLine(p, 0, coord, _gameAreaSize, coord);
        }
        pictureBox1.BackgroundImage = _gameArea;

        g.Dispose();
    }

对于游戏开始和新游戏点击:

        GameLogic.InitGame(); // change positions, without threads
        RefreshMap();

RefreshMap:

        private static void RefreshMap()
    {
        var g = Graphics.FromImage(_gameArea);
        g.Clear(Color.White);
        g.Dispose();

        RefreshRacoons();
        RefreshWolves();
    }

我试图像这样做:

        private static void RefreshMap()
    {
        var sync = SynchronizationContext.Current;

        new Thread(__ =>
            sync.Post(_ =>
            {
                var g = Graphics.FromImage(_gameArea);
                g.Clear(Color.White);
                g.Dispose();

                RefreshRacoons();
                RefreshWolves();
            }, null)).Start();
    }

刷新(使用synContext,不使用它)

private static void RefreshRacoons()
    {
        foreach (var racoon in GameLogic.Racoons)
        {
           var g = Graphics.FromImage(_gameArea);
           g.DrawImage(_racoonImg,
               _cellSize * racoon.X + _offsetX,
               _cellSize * racoon.Y + _offsetY,
               _animalIconWidth,
               _animalIconHeight);

           g.Dispose();

        }
    }
    private static void RefreshWolves()
    {
        var sync = SynchronizationContext.Current;

        foreach (var wolf in GameLogic.Wolves)
        {
            new Thread(__ =>
                sync.Post(_ =>
                {
                    var g = Graphics.FromImage(_gameArea);
                    g.DrawImage(_wolfImg,
                        _cellSize * wolf.X + _offsetX,
                        _cellSize * wolf.Y + _offsetY,
                        _animalIconWidth,
                        _animalIconHeight);
                    g.Dispose();
                }, null)).Start();
        }
    }

谢谢!

1 个答案:

答案 0 :(得分:-2)

我通常的免责声明是:Windows Forms不是游戏开发的正确环境。如果您不使用动画过度,那么基于Turnbased的单人游戏或热门多人游戏可以正常运行。但是Solitaire和Minesweeper几乎是可能的上限。

有许多可用于游戏开发的Dedicateed Display技术/引擎。但最终任何允许你直接,低级别绘图访问并且具有某种类型的游戏循环的东西应该可以解决。虽然你可以在某种程度上在Windows窗体中伪造它,但是当你有一辆完全装满汽车并且Ignition中的钥匙只是站在那里时,你基本上会重新发明轮子。

对于.NET Framework,过时的解决方案是XNA Framework。但如果你选择.NET Core,至少有3种官方解决方案: https://www.microsoft.com/net/learn/apps/gaming

大多数人都使用Mono,有些甚至可以使用.NET Framework(我自己没有尝试过)。