玩家和敌人之间的碰撞不起作用

时间:2015-05-19 17:58:42

标签: java

我正在用Java制作游戏。而且玩家和敌人之间的碰撞运作不正常。

我想要的是:当它们发生碰撞时,它的游戏结束,我们需要进入面板游戏。 它做了什么:敌人跑过玩家,游戏继续进行。

我复制粘贴了一段我的代码,我真的希望有人能找到我做错了什么。

有关更多信息,玩家和敌人可以互相发射子弹并且碰撞有效。随机存在障碍,玩家和敌人都会发现这些障碍。

当玩家与敌人发生碰撞时会怎样做:

for(Enemy enemy: enemies){
if (checkCollision(player, enemy)){
    player.dead = true;
    }
}

我在动作执行功能中更新了玩家:

if (!player.dead)
            player.redraw();

else
{
    spelTimer.stop();
    mainVenster.switchPanel(new GameOverPanel(mainVenster));}

功能checkCollision(idk,如果这可能有帮助):

public boolean checkCollision(tanks.Game_Object object1, tanks.Game_Object object2){

    double dx = object1.x_pos - object2.x_pos;
    double dy = object1.y_pos - object2.y_pos;
    double distance = (dx*dx) + (dy*dy);
    double minDistance = (object1.r+object2.r);

    return (distance < minDistance*minDistance);    
}

编辑:x_pos和y_pos是我的对象的中心坐标,r是半径。

4 个答案:

答案 0 :(得分:1)

你的玩家和敌人用圆圈表示,对吗?这就是你的代码看起来的样子。在这种情况下,正确的碰撞公式是:

double dist = Math.sqrt(Math.sqr(obj1.x + ob1.radius - obj2.x - obj2.radius) + Math.sqr(obj1.y + ob1.radius - obj2.y - obj2.radius));

if (dist < (obj1.radius + obj2.radius)) {
  //collision
}

答案 1 :(得分:0)

可能是

public boolean checkCollision(tanks.Game_Object object1, tanks.Game_Object object2){

    double dx = object1.x_pos - object2.x_pos;
    double dy = object1.y_pos - object2.y_pos;
    double distance = (dx*dx) + (dy*dy);
    double minDistance = (object1.r+object2.r);

    return (Math.sqrt(distance) < minDistance);    
}

答案 2 :(得分:0)

对于这种情况,我建议Rectangle。当你创建一个Rectangle时,你会告诉它左上角,然后它在每个方向上延伸多远(就像你在尝试弄清楚你的方法一样)。然后,您只需要使用播放器(使用Rectangle)更新rectangle.reshape(x,y,width,height),并在当前检查冲突的任何位置,检查播放器Rectangle以查看敌人的情况。 Rectangle使用碰撞方法。

Rectangle r = new Rectangle(x,y,100,100);
Rectangle q = new Rectangle(x2,y2,100,100);
if(r.intersects(q)){
    //What occurs during collision
}

答案 3 :(得分:-2)

实际上,在java游戏中模拟碰撞的最佳方法是绘制4个命中框: 角色顶部,底部,左侧和右侧的一个非常薄的矩形。 然后,如果敌人的一个命中框包含玩家的命中箱(不是交叉方法),你就会知道发生了碰撞,甚至更好,你会知道碰撞的一面。 / p>

更多信息: https://www.youtube.com/watch?v=mdJNtXP1QiY