我的游戏碰撞检测系统有点问题.在游戏中有几个相互连接的结构.但是,当它们之间存在另一个结构时,它们不应该连接.
由于一些奇怪的原因,当它们后面有直接线的结构时,它有时无法连接到直接相邻的结构.很少会产生其他奇怪的联系.
应该连接红色标记的节点.
public void drawConnections(Graphics g) { ArrayListstructurecopy = (ArrayList ) Mainclass.structures.clone(); //all structures in a list structurecopy.remove(this); //as we are member of the list structurecopy.removeIf(t -> (!hasStructureInRangeWithoutObstaclesInBetween(t))); structurecopy.removeIf(t -> !t.receivesEnergyfromNeighbors()); //unimportant check if it is allowed to connect (its working) structurecopy.forEach(t -> drawConnectionTo(t, g)); //also works fine } public boolean hasStructureInRangeWithoutObstaclesInBetween(Structure structureWhichShouldBeInRange) { // if in Range if (getRange() >= Math.hypot(structureWhichShouldBeInRange.getX() - getX(), structureWhichShouldBeInRange.getY() - getY())){ //checks if structure is in range ArrayList structureclone = (ArrayList ) Mainclass.structures.clone(); structureclone.remove(this); //again removes itself from the list structureclone.remove(structureWhichShouldBeInRange); //also removes target - so it doesn't block itself structureclone.removeIf(t -> !t.collidesWithLine(this.getX(), structureWhichShouldBeInRange.getX(), this.getY(), structureWhichShouldBeInRange.getY())); //removes it when it does not collide return structureclone.size() == 0; //returns true when no collisions are found } return false; } public boolean collidesWithLine(int x1, int x2, int y1, int y2) { // Line Segment - Circle Collision Detection double dx = x2 - x1; double dy = y2 - y1; double a = dx * dx + dy * dy; //this is the distance double b = 2 * dx * (x1 - getX()) + 2 * dy * (y1 - getY()); double c = getX() * getX() + getY() * getY() + x1 * x1 + y1 * y1 - 2 * (getX() * x1 + getY() * y1) - getCollisionRadius() * getCollisionRadius(); double discriminant = b * b - 4 * a * c; return discriminant >= 0; // no intersection -> discriminant <0 }
(我仅为此文本添加了注释,因此如果它们导致编译错误,请忽略它们).
有人能告诉我我做错了什么吗?