我的碰撞检测代码可以正常工作,但只要我设置了我的播放器&怪物速度超过1我得到奇怪的结果我该如何解决这个问题?
速度为1
速度为4
我的碰撞检测:
static boolean collisionDown(Entity e)
{
for(Block i : Game.blocks)
{
Rectangle player = new Rectangle(e.getX(), e.getY() + e.getVelocity(), e.getWidth(), e.getHeight());
Rectangle block = new Rectangle(i.getX(), i.getY(), size, size );
if (player.intersects(block))
{
//e.goUp(1);
return true;
}
}
return false;
}
static boolean collisionUp(Entity e)
{
for(Block i : Game.blocks)
{
Rectangle player = new Rectangle(e.getX(), e.getY() - e.getVelocity(), e.getWidth(), e.getHeight());
Rectangle block = new Rectangle(i.getX(), i.getY(), size, size);
if (player.intersects(block))
{
return true;
}
}
return false;
}
static boolean collisionRight(Entity e)
{
for(Block i : Game.blocks)
{
Rectangle player = new Rectangle(e.getX() + e.getVelocity(), e.getY(), e.getWidth(), e.getHeight());
Rectangle block = new Rectangle(i.getX(), i.getY(), size, size);
if (player.intersects(block))
{
return true;
}
}
return false;
}
static boolean collisionLeft(Entity e)
{
for(Block i : Game.blocks)
{
Rectangle player = new Rectangle(e.getX() - e.getVelocity(), e.getY(), e.getWidth(), e.getHeight());
Rectangle block = new Rectangle(i.getX(), i.getY(), size, size);
if (player.intersects(block))
{
return true;
}
}
return false;
}
我使用碰撞检测的地方
void goUp(int v)
{
if(!Block.collisionUp(this))
y -= v;
}
void goDown(int v)
{
if(!Block.collisionDown(this))
y += v;
}
void goRight(int v)
{
if(!Block.collisionRight(this))
x += v;
}
void goLeft(int v)
{
if(!Block.collisionLeft(this))
x -= v;
}
谢谢
答案 0 :(得分:3)
假设您正在评估角色 将在下一次游戏迭代中的位置,那么您的碰撞方法对我来说就不错了。我愿意打赌,当发生碰撞时,你将你的角色移动到一个偏移处,将它移出碰撞盒并返回有效区域进行补偿。当速度较高时,它会放大这种小的副作用。仔细检查调用这些方法的所有位置,并在这些方法返回true时遵循后面的逻辑(主要是在Y方向上的那些方法)。
要尝试的另一件事,将角色的速度提高到更高的值,或介于两者之间。如果你操纵值时你的角色走得越来越近,这很可能发生了什么。
在旁注中,请注意所有方法中的这一行
Rectangle player = new Rectangle(e.getX(), e.getY() - e.getVelocity(), e.getWidth(), e.getHeight());
在方法调用期间,此矩形不会更改(假设您没有在游戏中实现线程),因此在for循环的每次迭代中重新创建它只是占用时间。考虑修改方法:
static boolean collisionDown(Entity e)
{
Rectangle player = new Rectangle(e.getX(), e.getY() + e.getVelocity(), e.getWidth(), e.getHeight());
for(Block i : Game.blocks)
{
Rectangle block = new Rectangle(i.getX(), i.getY(), size, size );
if (player.intersects(block))
{
//e.goUp(1);
return true;
}
}
return false;
}
答案 1 :(得分:1)
我为碰撞检测所做的是开发一个名为CollissionDetector
的类。对于以下方法,它有一些逻辑:
public boolean isColliding();
public boolean collided(Rectangular r1, Rectangular r2);
Rectangular是一个具有一种方法的接口:
public Rectangle getRectangle();
因此,我的CollisionDetector
课程可以处理任何可以实现名为Rectangular
的界面并返回Rectangle
的内容。
一些应该检测到碰撞的代码的问题是它不止一次地报告相同的碰撞。
使用我的碰撞探测器,碰撞探测器对象将跟踪碰撞开始的时间,两个物体是否仍在碰撞,以及碰撞何时结束。
好像我也有CollissionListener
。我知道这一切都非常复杂,但确实有效。 CollisionListener
有以下方法:
public void CollissionStarted();
public void CollissionEnded();
我希望我能给你一个SSCCE:http://sscce.org但我不再有代码了。