一个图片框与几个图片框碰撞

本文关键字:几个 碰撞 一个 | 更新日期: 2023-09-27 18:18:51

我正在尝试使用winforms制作一款吃豆人风格的大学游戏。

我需要玩家能够在迷宫中行走,远离墙壁。

目前,我的播放器和墙壁是图片框,所以我需要检查它们之间的碰撞。

我现在的代码做得很好,问题是它非常慢,我添加到游戏中的物品越多(也就是更多的图片框),它就越慢。

这是我的碰撞代码:

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循环遍历所有的picturebox实例,然后通过将picturebox移动到新位置来检查每个实例的碰撞,检查碰撞,然后将其移动回原来的位置(这样我就不会在移动代码中将玩家移动到墙内)。

我的问题是,我能做些什么来加快我的碰撞检查?我只在玩家与网格对齐时才检查碰撞,从而提高了速度,但它仍然很慢,我打算对敌人使用相同的碰撞检查,这意味着速度会更慢。我尝试通过使用碰撞的X和Y值将搜索限制为仅在对象附近寻找碰撞的实例,但由于我有一些大的图片框,范围必须很大,并且boost是最小的。

一个图片框与几个图片框碰撞

请考虑使用四叉树数据结构,它主要用于碰撞检测。优化应该从添加图片框到屏幕时开始。

http://en.wikipedia.org/wiki/Quadtree

c#中也有现成的代码片段,但是你需要根据你的需要定制它们,尽管它们不会花费很多时间。

如:http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C

有一种模式叫做MVC (Model, View, Control),它认为最好将每个组件分开。

基于这种模式,最好使用int(例如)矩阵,这是游戏每个状态的简单定义。1表示墙,0表示路径,2表示吃豆人。

检查矩阵中的碰撞比检查图片框要容易得多。

你应该稍后用图片框或其他东西来绘制矩阵。这叫做View

和键盘、鼠标和数据库的输入只会影响矩阵。

使用这种模式,使用矩阵作为每个组件的连接器,您肯定会达到最高的速度。