我正在制作一个游戏,你可以在其中发射一个简单的圆圈来发射子弹及其多人游戏等等。好吧,我试图让边界有点像迷宫型的东西,你必须经历我尝试过这样的碰撞检测:
public void checkCollisions(){
Rectangle r1 = bo.getBounds();
Rectangle d = p.getBounds();
if (d.intersects(r1))
border = true;
}
基本上如果border = true,那么我就会阻止角色移动。我这样做有两个问题,
我使用这样的边框:
boolean border = false;
然后在我的绘画方法中我说:
if (border)
p.dx = 0;
p.dy = 0;
p表示Guy类:P 更多dx和dy:
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_A)
dx = -2;
if (key == KeyEvent.VK_D)
dx = 2;
if (key == KeyEvent.VK_W)
dy = -2;
if (key == KeyEvent.VK_S)
dy = 2;
对于keyReleased,我只需将dx和dy的值更改为0 还有这个家伙的动作:
public void move() {
x = x + dx;
y = y + dy;
}
请帮我弄清楚为什么这不起作用。
答案 0 :(得分:1)
好的,我仍然认为你的游戏逻辑的完全重组是有序的,但我想我可以说明发生了什么。让我们看一下发生事情的各个地方:
paint()
时,您会看到是否存在冲突,如果是,则将速度调零(假设您修复了阻塞)。所以这就是问题所在:在Java中,就像任何其他程序一样,当你按住某个键时,你会得到多个按键事件。第一个和第二个之间会有短暂的延迟,然后它们会迅速重复。在浏览器的文本框中尝试它,在那里会出现相同的行为。
那对你有什么影响?好吧,你可能正在进入这样的场景:
PAINT -> speed set to zero
KEY -> speed set back to -2
MOVE -> guy is moved -2
CHECK -> border = false
PAINT -> speed set to zero again
真的,如果您重新构建代码,以便获得类似于此的游戏循环:
public void runGame() {
while(true) {
updateSpeeds();
updatePositionFromSpeed();
repaint();
}
}
updateSpeeds()
代替关键字是关闭还是关闭,并计算该人是否可以向该方向移动,updatePositionFromSpeed()
将更新该人的位置。然后paint()
会依赖仅对该人的x
和y
坐标,不会写入它们,也不需要知道速度。
答案 1 :(得分:0)
这是一个非常简单的解决方案。
这是我的伪代码。
if(player.getBounds().intersects(wall.getBounds())){
//Go Back to prior position, regardless of direction coming from. Since the reverse velocity X and velocity Y directions are taken care off
x -= velX;
y -= velY;
//Then Stop at that prior position to make next move
velX = 0;
velY = 0;
}