我用c#(https://www.google.cz/search?q=vlacek+hra&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjDtY7BosrTAhUDGZoKHfL5DuIQ_AUICCgB&biw=1280&bih=624#imgrc=dnnr33z9bcaNnM:)编写这个游戏,这是Snake的捷克版本,使用Windows Forms和System.Drawing。
到目前为止,行为和功能不是问题,我有疑问,我无法回答的是,是否有可能创建和成像,位图,图形,矩形或任何可以工作的对象,由小图像的总和组成。具体来说,游戏的每个关卡都有普通的墙,加上特定的关卡墙,所以我如何绘制那堵墙或创建一个图像或位图,由一个图像的重复组成。
问题是我需要从这个小图像 https://github.com/PabloRodriz/Vlacek-hra-Train-Game-/blob/master/Snake%20Game/Images/wall.gif 的总和中创建墙壁(这是我将要更新的所有代码所在),它将"进入"一个矩形对象(Graphics.DrawImage(Image,Rectangle),因为我需要矩形来检查与墙壁和火车车身的碰撞。
那么我如何用这幅图像绘制整面墙。循环并多次绘制相同的图像?我可以将所有这些存储在单个图像中吗?
我假设你在这里使用WinForms。如果这是 WPF,请告诉我们。
为什么不使用 GDI+ 中提供的矢量方法,而不是绘制位图?您应该将每个级别的墙壁配置存储在内存中(xml/其他任何内容)。这些可能都是线段集(x1,y1 到 x2,y2)。然后在失效时,您可以读取当前关卡的墙壁数据,并使用e.Graphics.DrawLine()
或e.Graphics.DrawRectangle()
等Paint
事件中绘制它们。
请确保在用于创建游戏帧的计时器中Invalidate()
窗体/控件。许多人错误地在计时器事件中创建Graphics
对象,从而对游戏响应能力造成严重影响。
您的墙壁数据应如下所示:
class Wall
{
public Point Start {get; set;}
public Point End {get; set;}
}
和水平类将是这样的
class Level
{
public string Name {get; set;}
public List<Wall> Walls {get; set;}
}
您可以在Wall
类中实现一个碰撞检测器,它只是一个检查蛇头 (x,y) 是否位于该线段上的函数。