我正在为我的 C# 学校项目编写俄罗斯方块克隆。我正在使用 Microsoft Visual Studio 2012。游戏本身实现为块的二维数组(块列表列表),每个块都有自己的纹理(bmp 图像)。我将整个数组绘制到 PictureBox 控件上,这就是问题的开始。更新 PictureBox 上的图像(移动/旋转活动形状)时,游戏会稍微滞后。我尝试在 Panel 控件上绘图,但结果是一样的。我有一个粗略的想法可能导致滞后,但我不知道如何摆脱它。
这是游戏“网格”的绘制方法:
public void Draw(Graphics g)
{
Brush brush;
Font font = new System.Drawing.Font( "Arial", 5);
for (int i = 0; i < Width; i++)
for (int j = 0; j < Height; j++)
{
brush = new TextureBrush(Blocks[i][j].Texture);
if (Blocks[i][j].Occupied==true)
g.FillRectangle(brush, i * 20, j * 20, i * 20 + Blocks[i][j].Texture.Width, j * 20 + Blocks[i][j].Texture.Height);
}
}
这是活动四联牌的绘制方法:
public void Draw(Graphics g)
{
Brush brush = new TextureBrush(Blocks[0].Texture);
foreach (FullBlock b in Blocks)
g.FillRectangle(brush, b.x * 20, b.y * 20,b.Texture.Width, b.Texture.Height);
}
然后游戏本身同时使用它们(双缓冲尝试):
public void GameDraw(PictureBox p)
{
Graphics g = Graphics.FromImage(gb);
gameGrid.Draw(g);
PlayingShape.Draw(g);
p.Image = gb;
p.Refresh();
}
"gb"
我在类构造函数中只创建一次的私有变量在哪里Bitmap
(以减少(不成功)滞后)。
GameDraw
每当游戏状态发生变化时,都会调用该方法(例如,移动/旋转活动的 tetromino 和每个“重力”滴答声)