Мне удалось закодировать обнаружение столкновений Axis-Aligned-Bounding-Box в мою 3d-игру lwjgl2, но я не уверен, как предотвратить попадание игрока в hitbox.Когда в основном классе обнаруживается столкновение, в классе игрока устанавливается логическое значение true.
Я пытался инвертировать факторы движения и вычислять направление, используя lastDx
float
.
* 1006.* // Класс движения HumanEntity
boolean collision = false;
public void move(){
if(collision){
//player inside the hitbox
}else{
Vector4f movement = new Vector4f();
checkInputs();
float xDistance = currentSpeed * MainGameHandler.getFrameTimeSeconds();
float zDistance = currentTurnSpeed * MainGameHandler.getFrameTimeSeconds();
float dx = xDistance;
float dz = zDistance;
movement.x += dx;
movement.z += dz;
Matrix4f invertedViewMatrix = new Matrix4f();
Matrix4f.invert(viewMatrix,invertedViewMatrix);
Matrix4f.transform(invertedViewMatrix,movement,movement);
dx = movement.x;
dz = movement.z;
lastDx = dx;
lastDz = dz;
increasePosition(new Vector3f(dx, 0, dz));
float terrainHeight = MainGameHandler.terrain.getHeightOfTerrainForPlayer(position.x, position.z);
upwardsSpeed += GRAVITY * MainGameHandler.getFrameTimeSeconds();
increasePosition(new Vector3f(0,upwardsSpeed * MainGameHandler.getFrameTimeSeconds(),0));
if(position.y<terrainHeight){
upwardsSpeed = 0;
inAir = false;
setPosition(new Vector3f(position.x,terrainHeight,position.z));
}
}
}
// Основной класс
e
-> HumanEntity
e.setCollision();
-> boolean
столкновение становится истинным в классевыше
if(HitBoxMath.isColliding(e.entity.getBox(), entity.getBox())){
System.out.println("Yay");
e.setCollision(true);
}else{
System.out.println("No");
e.setCollision(false);
}