Остановка движения игрока при обнаружении столкновения - PullRequest
0 голосов
/ 07 апреля 2019

Мне удалось закодировать обнаружение столкновений 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);
}

...