PictureBox与几个pictureBox的碰撞

时间:2014-08-21 05:28:47

标签: c# winforms visual-studio-2010 picturebox

我试图只使用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值将搜索限制为仅在对象附近寻找碰撞的实例,但由于我有一些大的图片框,因此范围必须很大并且提升很小。

2 个答案:

答案 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