2015-05-19 72 views
2

我正在用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是ra DIUS。

+2

这是可能的帧速率不够高而即使子弹*看起来*像它的交叉播放器,程序只看到之前的帧与帧后。您可能想要尝试将阈值minDistance提高到两倍,并查看事情的工作方式。 – bcr

+0

你是如何更新坐标的? – haifzhan

+0

@bcr我会试着去看看给出了什么。但我必须说,当我(玩家)在敌人或障碍物上射击(我击中他们)时,他们会被移除。 – ml20

回答

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);  
} 
+1

您正在从左上角计算。你需要从圈子的中心计算 – ControlAltDel

+0

我不认为添加一个sqrt()会做到这一点,但我会尝试!如果你看到x_pos和y_pos作为中心坐标,那么@ControlAltDel就不是这个代码吗? – ml20

+0

@ ml20它可能无法做到这一点。但他似乎指出了一个没有人注意到的缺陷。 a^2 + b^2 = c^2。你的距离计算不正确,你需要得到c的平方根,这在你的情况下是'距离'。如果问题没有解决,这绝对是解决问题的重要步骤。 –

0

对于这种情况,我会建议Rectangle。当你创建一个Rectangle时,你可以告诉它左上角的点,那么它在每个方向上的延伸程度如何(就像你试图找出你的方法)。然后你只需要用球员(使用rectangle.reshape(x,y,width,height))更新Rectangle,并且在你目前检查碰撞的任何地方,用碰撞方法检查球员的敌手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 
} 
+0

这不是最佳的抽象形状的碰撞远这样 – ControlAltDel

+0

@ControlAltDel是的,这是有道理的,这是一个看着它......我不知道为什么我之前没想到它圆,但如果他们100%真的是圆,那么这不是做到这一点的方法。但是,如果它们仍然有效,它仍然可以工作。 –

+0

嗯,这是我尝试的第一件事,但是当两个物体发生碰撞时,它给我带来了困难,因为我的玩家和敌人可以翻译和旋转。 – ml20

-2

其实对于在模型化关于java游戏冲突的最好方法是画4个命中框:你的角色权 一个非常薄的顶部,底部,左侧矩形。 然后,如果敌方的一个命中盒包含玩家的命中盒(未命中相交方法),则会知道发生了碰撞,甚至更好,您将知道碰撞的一侧。

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

+0

不会在角色周围绘制4个框,就像包含玩家的1个大框一样有效? –

+0

根本不是!如果有一个命中盒,并且我们将左上角与敌人的一个命中盒相交,那么碰撞是顶部还是左侧?这就是为什么分开它们更好。 https://www.youtube.com/watch?v=mdJNtXP1QiY – Smallware

+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 
} 
+0

是的,我之前尝试过使用矩形,但由于玩家和敌人都可以翻译和旋转(他们是'坦克'),所以它给了我很多难题。我看着你说的话,它看起来和我的checkCollision函数非常相似(我的x_pos和y_pos是我的对象的中心协调)? – ml20

+1

你应该不得不提及它的位置在你的图纸的中心位置:) – Soley