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