Java FX, реализующий гравитацию с картой тайлов - PullRequest
0 голосов
/ 05 марта 2020

Я сейчас программирую на Java FX и пытаюсь ознакомиться с реализацией таких вещей, как карты тайлов, гравитация, спрайтовые анимации и т. Д. c, так как я довольно новичок в этом. В настоящее время у меня есть прямоугольник (который скоро станет спрайтом), который перемещается влево и вправо на карте тайлов, которая хранится внутри. Я пытаюсь сделать функцию прыжка для прямоугольника, и я реализовал гравитацию. Тем не менее, у меня нет функции обнаружения столкновений на полу карты тайлов, поэтому игрок просто проваливается через платформы карт тайлов. Моя программа использует наследование, поэтому мое главное - это то, где я рендеринг на моей карте тайлов, а мой класс игрока (наследующий от моего спрайтового класса) - это место, где все ключевые слушатели предназначены для движений игрока. Я пытался исследовать, как использовать обнаружение столкновений на картах плиток, но все результаты включают в себя наличие карты игрока и плиток в одном классе. Вот код для некоторого контекста:

Основной класс для рендеринга карты уровня:

public Scene MainGame() {

    Lw = LevelMap.LEVEL1[0].length() * 60;
    for (int i = 0; i < LevelMap.LEVEL1.length; i++) {
        String line = LevelMap.LEVEL1[i];
        for (int j = 0; j < line.length(); j++) {
            switch (line.charAt(j)) {
                case '0':
                    break;
                case '1':
                    Node platform = createEntity(j * 60, i * 58, 60, 60, Color.BROWN);
                    LM.add(platform);
                    break;
            }
        }



    }

    AnimationTimer timer = new AnimationTimer() {

        @Override
        public void handle(long now) {
            player.move();

        }

    };
    timer.start();

    appRoot.getChildren().addAll(gameRoot, player.getRect());
    appRoot.setId("appR");
    final Scene gameWindow = new Scene(appRoot, screenWidth, screenHeight);

    gameWindow.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            player.KeyPressed(event);
        }
    });

    gameWindow.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            player.KeyReleased(event);
        }
    });

    return gameWindow;

}

Класс игрока:

private Rectangle rect;
private String color;
private boolean jump, left, right;
private KeyCode jumpKey, leftKey, rightKey;
int xSpeed;
int ySpeed;
private boolean canJump;
protected double gravity;
private boolean falling = true;
private double upForce;
private int jumpForce;
private boolean jumping;
private int Lw;
int getTranslateX;

public Player(String Name, double xPos, double yPos, int width, int height, int speed) {
    super(Name, xPos, yPos, width, height, speed);
    rect = new Rectangle(xPos, yPos, width, height);
    rect.setFill(Color.BLUE);
    rect.setArcWidth(30);
    rect.setArcHeight(30);

    leftKey = KeyCode.LEFT;
    rightKey = KeyCode.RIGHT;
    jumpKey = KeyCode.SPACE;
    gravity = 0.5;
    xSpeed = 10;
    ySpeed = 10;

}


public void KeyPressed(javafx.scene.input.KeyEvent code) {
    KeyCode j = code.getCode();
    switch (j) {
        case LEFT:
            left = true;
            System.out.println("Left pressed");
            break;
        case RIGHT:
            right = true;
            System.out.println("Right pressed");
            break;
        case SPACE:
            jump = true;
            System.out.println("Space pressed");
            break;
    }
}

public void KeyReleased(javafx.scene.input.KeyEvent code) {
    KeyCode j = code.getCode();
    switch (j) {
        case LEFT:
            left = false;
            System.out.println("Left Released");
            break;
        case RIGHT:
            right = false;
            System.out.println("Right released");
            break;
        case SPACE:
            jump = false;
            System.out.println("Space released");
            break;
    }
}

public void move() {
    if (right) {
        xPos += xSpeed;
    }
    if (left) {
        xPos -= xSpeed;
    }

    if (jump && canJump && !jumping) {
        jumpForce = 10;
        jumping = true;
    } 
    else if (jumpForce > 0) {
        jumpForce--;

    } 
    else {
        jumping = false;
    }

    if (canJump) {
        upForce = -gravity;
    } 
    else {
        upForce = 0;
    }



    rect.setX(xPos);
    rect.setY(yPos);
}

} В идеале я хотел бы, чтобы обнаружение столкновений проходите в классе игрока, любой совет / помощь приветствуется.

...