一个图片框与几个图片框碰撞
本文关键字:几个 碰撞 一个 | 更新日期: 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/Quadtreec#中也有现成的代码片段,但是你需要根据你的需要定制它们,尽管它们不会花费很多时间。
如:http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C
有一种模式叫做MVC (Model, View, Control),它认为最好将每个组件分开。
基于这种模式,最好使用int(例如)矩阵,这是游戏每个状态的简单定义。1表示墙,0表示路径,2表示吃豆人。检查矩阵中的碰撞比检查图片框要容易得多。
你应该稍后用图片框或其他东西来绘制矩阵。这叫做View
和键盘、鼠标和数据库的输入只会影响矩阵。
使用这种模式,使用矩阵作为每个组件的连接器,您肯定会达到最高的速度。