我遇到了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();
}
}
谢谢!
答案 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(我自己没有尝试过)。