我试图只使用winforms为大学制作Pacman风格的游戏。
我需要玩家能够在迷宫中走动,远离墙壁。
目前,我的播放器和墙壁是图片框,所以我需要检查它们之间的碰撞。
我目前的代码工作得很好,问题在于它非常慢,而且我添加到游戏中的项目(也就是更多的图片框)越慢。
这是我的碰撞代码:
private string checkCollision(PictureBox collider, int x, int y, int dir, int speed)
{
string pbTag = "NONE";
foreach (PictureBox collided in this.Controls.OfType<PictureBox>() )
{
pbTag = collided.Tag.ToString();
if (!(collided == collider) )
{
switch (dir)
{
case 0:
{
collider.Location = new Point(x + speed, y);
if (collider.Bounds.IntersectsWith(collided.Bounds))
{
collider.Location = new Point(x, y);
return pbTag;
}
collider.Location = new Point(x, y);
break;
}
// other directions go here, they are all the same with different x and y values
}
}
return pbTag;
正如您所看到的,我使用foreach遍历所有图片框实例,然后通过将图片框移动到新位置,检查碰撞然后将其移回原位来对每个实例进行碰撞检查(这样我就不会在运动代码中将玩家移到墙内。)
我的问题是,我该怎样做才能加快碰撞检查速度?我设法通过仅在玩家与网格对齐时检查碰撞来获得速度提升,但它仍然非常慢并且我将对敌人使用相同的碰撞检查,这意味着更加减速。我尝试通过使用碰撞的X和Y值将搜索限制为仅在对象附近寻找碰撞的实例,但由于我有一些大的图片框,因此范围必须很大并且提升很小。
答案 0 :(得分:0)
有一种称为MVC(模型,视图,控制)的模式,它表示最好将每个组件分开。
基于这种模式,最好使用int(例如)矩阵,它是游戏每种状态的简单定义。 1表示墙,0表示路径,2表示pacman。
检查矩阵中的碰撞比检查图片框要容易得多。这叫做模型。
您应该稍后使用图片框或其他任何东西绘制矩阵。这叫做View
键盘,鼠标和数据库的输入只会影响矩阵。这叫做Control。
使用此模式,使用矩阵作为每个组件的连接器,您一定会达到最高速度。
答案 1 :(得分:0)
请考虑使用Quad Tree数据结构,它主要用于碰撞检测。优化应该从您将图片框添加到屏幕时开始。
http://en.wikipedia.org/wiki/Quadtree
c#中也有准备好的代码片段,但是你需要根据自己的需要定制它们,尽管它们不会花费太多时间。
EG:http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C