我正在用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是半径。
答案 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>