我用Python + Pygame制作了这个游戏,但速度很慢,所以我尝试用C#及其形式。它甚至更慢!我在i5 radeon 6770m NTB上只获得了20fps,比我希望这款游戏运行的硬件快了数百万倍,我还没有完成游戏,它只能渲染一张地图。它是用缓慢的几MHz处理器运行的游戏的翻版。它的地图包含400x200瓷砖和相机显示仅79 * 79。我还安装了团结4.5;它是否值得学习它,它会给我带来显着的性能提升 - 如果有人知道它我将如何做一个由600 * 400瓷砖随机组成的地图,无论是深色瓷砖还是亮色;它必须是"可碰撞的"?或者我在形式上做错了吗?
public void render()
{
Bitmap frame = new Bitmap(Game.CANVAS_WIDTH, Game.CANVAS_HEIGHT);
Graphics frameGraphics = Graphics.FromImage(frame);
TextureID[,] textures = Background.Blocks;
while (true)
{
//frameGraphics.FillRectangle(new SolidBrush(Color.Aqua), 0, 0, Game.CANVAS_WIDTH, Game.CANVAS_HEIGHT);
for (int x = 0; x < Game.AR_WIDTH; x++)
{
int xx = x * Game.TILE_SIDE - game.green_tank_pos[0] + Game.DIFF;
if (xx < 0) continue;
if (xx > Game.CANVAS_WIDTH) break;
for (int y = 0; y < Game.AR_HEIGHT; y++)
{
int yy = y * Game.TILE_SIDE - game.green_tank_pos[1] + Game.DIFF;
if (yy < 0) continue;
if (yy > Game.CANVAS_HEIGHT) continue;
switch(textures[x,y])
{
case TextureID.dark:
frameGraphics.DrawImage(tex_dark_gnd, xx, yy);
break;
case TextureID.bright:
frameGraphics.DrawImage(tex_bright_gnd, x * Game.TILE_SIDE - game.green_tank_pos[0] + Game.DIFF, y * Game.TILE_SIDE - game.green_tank_pos[1] + Game.DIFF);
break;
}
}
}
frameGraphics.DrawImage(tex_green_tank, Game.DIFF, Game.DIFF);
drawHandle.DrawImage(frame, 0, 0);
答案 0 :(得分:5)
WinForms是游戏的一个糟糕的平台,甚至是2D平台。它适用于业务线应用程序,包括很少甚至没有硬件加速。
此外,该技术很难编写游戏,更不用说高效游戏了。您可能会使用WPF来完成一个非常简单的游戏,但您真的想学习XNA,MonoGame,Unity或其他一些可以利用DirectX的实际游戏平台(WPF也是如此) ,顺便说一句。
答案 1 :(得分:2)
有很多方法可以在winforms中获得更好的性能,但对于游戏来说,最好选择更适合工作的工具。 (不要用螺丝刀敲钉子。)
较新版本的Unity3D具有内置的2D工具。我个人正在构建一个2D游戏,并强烈推荐它。
编辑:删除了我提到的XNA - 我不知道它已经“死了”。
在Unity3D中创建切片可以通过多种方式完成
至于渲染,Unity3D将为您处理。
EDIT2 :我创建了一个简短的Unity3D行为,您可以将其附加到场景中的某个位置。这使用我上面概述的第3种方法,它将从应用的一组预制件中随机挑选。该脚本假设从瓷砖中随机挑选,并且瓷砖的宽度为1个游戏单位宽/高。
这是行为:
using UnityEngine;
class TileCreator : MonoBehaviour
{
private static System.Random rng = new System.Random();
public GameObject[] TilePrefabs;
public int TilesWide;
public int TilesHigh;
public Vector3 TileMapTopLeft;
void Start()
{
for (int x = 0; x < TilesWide; x++)
{
for (int y = 0; y < TilesHigh; y++)
{
Instantiate(TilePrefabs[rng.Next(TilePrefabs.Length)], new Vector3(x + TileMapTopLeft.x, y + TileMapTopLeft.y, TileMapTopLeft.z), Quaternion.identity);
}
}
}
}
您可能需要查找有关如何导入资源和创建预制件的教程,但此脚本应该可以帮助您找到正确的方向。