Java 与其他ArrayList中的对象的碰撞检测,同时忽略其自身ArrayList中的对象

Java 与其他ArrayList中的对象的碰撞检测,同时忽略其自身ArrayList中的对象,java,arraylist,javafx,collision-detection,game-physics,Java,Arraylist,Javafx,Collision Detection,Game Physics,我正在用JavaFX从头开始创建一款子弹地狱式的太空射击游戏。类似于热登系列的东西 有关我当前设置的一点背景信息: 我有三个数组列表。一个用于玩家角色,一个用于敌人角色,一个用于射弹。这些数组列表中的所有对象都来自名为“实体”的父类的子类。也就是说,玩家角色、敌人角色和投射物类都是“实体”的子类 现在,每次游戏创建一个实体对象时,它都会被添加到相应的数组列表中 例如: //"playerEntities" is the array list //"playerCharacter" is the

我正在用JavaFX从头开始创建一款子弹地狱式的太空射击游戏。类似于热登系列的东西

有关我当前设置的一点背景信息:

我有三个数组列表。一个用于玩家角色,一个用于敌人角色,一个用于射弹。这些数组列表中的所有对象都来自名为“实体”的父类的子类。也就是说,玩家角色、敌人角色和投射物类都是“实体”的子类

现在,每次游戏创建一个实体对象时,它都会被添加到相应的数组列表中

例如:

//"playerEntities" is the array list
//"playerCharacter" is the object being added
private void addPlayerCharacter()
    {
        PlayerCharacter playerCharacter = new PlayerCharacter();

        playerEntities.add(playerCharacter);

        gameArea.getChildren().add(playerCharacter.getTempCharacter());
    }`
@Override
public void checkCollision()
{
    if((!Game.playerEntities.isEmpty()) && (!Game.enemyEntities.isEmpty()))
    {
        for(int i = 0; i < Game.playerEntities.size(); i++)
        {
            for(int j = 0; j < Game.enemyEntities.size(); j++)
            {
                Entity firstEntity = Game.playerEntities.get(i);
                Entity secondEntity = Game.enemyEntities.get(j);

                if(firstEntity.location.x < secondEntity.location.x + (secondEntity.width) &&
                        firstEntity.location.x + (firstEntity.width) > secondEntity.location.x &&
                        firstEntity.location.y < secondEntity.location.y + (secondEntity.height) &&
                        firstEntity.location.y + (firstEntity.height) > secondEntity.location.y)
                {
                    Game.playerEntities.remove(firstEntity);
                    Game.enemyEntities.remove(secondEntity);
                }
            }
        }
    }   
}
然后,通过比较两个对象的边界和当前坐标,检查它们之间的碰撞检测。如果对象相交,它们将从各自的阵列列表中删除

例如:

//"playerEntities" is the array list
//"playerCharacter" is the object being added
private void addPlayerCharacter()
    {
        PlayerCharacter playerCharacter = new PlayerCharacter();

        playerEntities.add(playerCharacter);

        gameArea.getChildren().add(playerCharacter.getTempCharacter());
    }`
@Override
public void checkCollision()
{
    if((!Game.playerEntities.isEmpty()) && (!Game.enemyEntities.isEmpty()))
    {
        for(int i = 0; i < Game.playerEntities.size(); i++)
        {
            for(int j = 0; j < Game.enemyEntities.size(); j++)
            {
                Entity firstEntity = Game.playerEntities.get(i);
                Entity secondEntity = Game.enemyEntities.get(j);

                if(firstEntity.location.x < secondEntity.location.x + (secondEntity.width) &&
                        firstEntity.location.x + (firstEntity.width) > secondEntity.location.x &&
                        firstEntity.location.y < secondEntity.location.y + (secondEntity.height) &&
                        firstEntity.location.y + (firstEntity.height) > secondEntity.location.y)
                {
                    Game.playerEntities.remove(firstEntity);
                    Game.enemyEntities.remove(secondEntity);
                }
            }
        }
    }   
}
应该注意的是,一旦发生碰撞,屏幕上的对象就会消失

当数组列表在没有对象存在的情况下甚至不能被调用来检查冲突时,我无法理解数组列表如何为空,或者在没有对象在数组列表中的明显存在和冲突被注册的情况下,如何从屏幕上删除对象

我的主要目标是允许相似类型的实体不相互冲突,而在相反类型之间检测冲突。也就是说,敌人将在不被删除的情况下相互穿过,但将与玩家角色和玩家角色的投射物碰撞。有没有更简单的方法可以实现这一点,或者修复我目前的方法?我已经试着处理这个问题好几个小时了,现在我开始感到沮丧


我错过了什么?

很简单。。。就拿这个例子来说

player.size==3 敌人的大小==5

玩家nr 3与敌人nr 4相交的情况也是如此。 然后移除玩家2,现在player.size==2,敌人.size==4; i==3,j==3。 这将导致循环继续,尝试将玩家(3)与敌人(3)进行比较。玩家3不存在,将导致一个数组超出边界

for(int i = 0; i < Game.playerEntities.size(); i++)
    {
        for(int j = 0; j < Game.enemyEntities.size() && i < Game.playerEntities.size(); j++)
        {
            Entity firstEntity = Game.playerEntities.get(i);
            Entity secondEntity = Game.enemyEntities.get(j);

            if(firstEntity.location.x < secondEntity.location.x + (secondEntity.width) &&
                    firstEntity.location.x + (firstEntity.width) > secondEntity.location.x &&
                    firstEntity.location.y < secondEntity.location.y + (secondEntity.height) &&
                    firstEntity.location.y + (firstEntity.height) > secondEntity.location.y)
            {
                Game.playerEntities.remove(firstEntity);
                Game.enemyEntities.remove(secondEntity);
            }
        }
    }
for(int i=0;isecondEntity.location.x&&
firstEntity.location.ysecondEntity.location.y)
{
Game.playerEntities.remove(第一实体);
Game.enemyenties.remove(第二实体);
}
}
}
内部循环条件的改变应该可以解决您的问题。您还可以引入“继续”:

for(int i=0;isecondEntity.location.x&&
firstEntity.location.ysecondEntity.location.y)
{
Game.playerEntities.remove(第一实体);
Game.enemyenties.remove(第二实体);
继续;
}
}
}

这很简单。。。就拿这个例子来说

player.size==3 敌人的大小==5

玩家nr 3与敌人nr 4相交的情况也是如此。 然后移除玩家2,现在player.size==2,敌人.size==4; i==3,j==3。 这将导致循环继续,尝试将玩家(3)与敌人(3)进行比较。玩家3不存在,将导致一个数组超出边界

for(int i = 0; i < Game.playerEntities.size(); i++)
    {
        for(int j = 0; j < Game.enemyEntities.size() && i < Game.playerEntities.size(); j++)
        {
            Entity firstEntity = Game.playerEntities.get(i);
            Entity secondEntity = Game.enemyEntities.get(j);

            if(firstEntity.location.x < secondEntity.location.x + (secondEntity.width) &&
                    firstEntity.location.x + (firstEntity.width) > secondEntity.location.x &&
                    firstEntity.location.y < secondEntity.location.y + (secondEntity.height) &&
                    firstEntity.location.y + (firstEntity.height) > secondEntity.location.y)
            {
                Game.playerEntities.remove(firstEntity);
                Game.enemyEntities.remove(secondEntity);
            }
        }
    }
for(int i=0;isecondEntity.location.x&&
firstEntity.location.ysecondEntity.location.y)
{
Game.playerEntities.remove(第一实体);
Game.enemyenties.remove(第二实体);
}
}
}
内部循环条件的改变应该可以解决您的问题。您还可以引入“继续”:

for(int i=0;isecondEntity.location.x&&
firstEntity.location.ysecondEntity.location.y)
List<Integer> indices_to_remove_player=new ArrayList<Integer>();
List<Integer> indices_to_remove_enemies=new ArrayList<Integer>();
indices_to_remove_player.add(i);
indices_to_remove_enemies.add(j);
for (int r=indices_to_remove_player.size()-1; r >= 0; r++) {
     Game.playerEntities.remove(indices_to_remove_player[r]);
}
for (int e=indices_to_remove_enemies.size()-1; e >= 0; e++) {
     Game.enemyEntities.remove(indices_to_remove_enemies[r]);
}
i=Game.playerEntities.size()-1; i <= 0; i++
j=Game.enemyEntities.size()-1; j <= 0; j++