Уменьшение задержки в JavaFX - PullRequest
0 голосов
/ 31 марта 2020

Я работаю над небольшой 2D-игрой, созданной на JavaFX, и для ввода (в настоящее время только перемещая игрока с помощью WASD), существует заметная задержка при быстром переключении направлений. Есть ли способ, которым я могу уменьшить эту задержку, чтобы она была менее заметна, или способ полностью удалить задержку? Я видел, как некоторые люди используют Таймеры для достижения этой цели, но я не знаю, как их использовать. Мой код ниже:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Main extends Application
{
    public int direction;
    public KeyEvent key;

    public int playerX = 250;
    public int playerY = 250;

    public static void main(String[] args)
    {
        launch(args);
    }

    public void start(Stage stage) throws FileNotFoundException
    {
        // Loads the grass block image
        Image grassImage1 = new Image(new FileInputStream("resources/textures/official/grass/grass32x32.png"));
        ImageView grassImageView = new ImageView(grassImage1);
        grassImageView.setPreserveRatio(true);
        grassImageView.setX(150);
        grassImageView.setY(50);

        // Loads the character image left side
        Image characterImgLeftNO = new Image(new FileInputStream("resources/textures/official/mainCharacter/mainCharLeftNO.png"));
        ImageView personImgViewLeftNO = new ImageView(characterImgLeftNO);
        personImgViewLeftNO.setPreserveRatio(true);
        personImgViewLeftNO.setX(playerX);
        personImgViewLeftNO.setY(playerY);

        // Loads the character image right side
        Image characterImgRightNO = new Image(new FileInputStream("resources/textures/official/mainCharacter/mainCharRightNO.png"));
        ImageView personImgViewRightNO = new ImageView(characterImgRightNO);
        personImgViewRightNO.setPreserveRatio(true);
        personImgViewRightNO.setX(playerX);
        personImgViewRightNO.setY(playerY);

        // Loads the character image back side
        Image characterImgBackNO = new Image(new FileInputStream("resources/textures/official/mainCharacter/mainCharBackNO.png"));
        ImageView personImgViewBackNO = new ImageView(characterImgBackNO);
        personImgViewBackNO.setPreserveRatio(true);
        personImgViewBackNO.setX(playerX);
        personImgViewBackNO.setY(playerY);

        // Loads the character image front side
        Image characterImgFrontNO = new Image(new FileInputStream("resources/textures/official/mainCharacter/mainCharFrontNO.png"));
        ImageView personImgViewFrontNO = new ImageView(characterImgFrontNO);
        personImgViewFrontNO.setPreserveRatio(true);
        personImgViewFrontNO.setX(playerX);
        personImgViewFrontNO.setY(playerY);

        // Creates a group with all of our sprites
        Group root = new Group(grassImageView, personImgViewLeftNO, personImgViewRightNO, personImgViewBackNO, personImgViewFrontNO);
        Scene scene = new Scene(root, 640, 480);

        // Getting basic key presses, W, A, S, and D
        scene.setOnKeyPressed(e ->
        {
            if (e.getCode() == KeyCode.W || e.getCode() == KeyCode.UP)
            {
                System.out.println("W key pressed, up");
                direction = 1;
                playerY -= 5;

                personImgViewLeftNO.setX(playerX);
                personImgViewLeftNO.setY(playerY);

                personImgViewRightNO.setX(playerX);
                personImgViewRightNO.setY(playerY);

                personImgViewFrontNO.setX(playerX);
                personImgViewFrontNO.setY(playerY);

                personImgViewBackNO.setX(playerX);
                personImgViewBackNO.setY(playerY);

                // Make anything but back view invisible
                personImgViewBackNO.setVisible(true);
                personImgViewFrontNO.setVisible(false);
                personImgViewLeftNO.setVisible(false);
                personImgViewRightNO.setVisible(false);
            }
            else if (e.getCode() == KeyCode.A || e.getCode() == KeyCode.LEFT)
            {
                System.out.println("A key pressed, left");
                direction = 2;
                playerX -= 5;

                personImgViewLeftNO.setX(playerX);
                personImgViewLeftNO.setY(playerY);

                personImgViewFrontNO.setX(playerX);
                personImgViewFrontNO.setY(playerY);

                personImgViewBackNO.setX(playerX);
                personImgViewBackNO.setY(playerY);

                personImgViewRightNO.setX(playerX);
                personImgViewRightNO.setY(playerY);

                // Make anything but Left invisible
                personImgViewBackNO.setVisible(false);
                personImgViewFrontNO.setVisible(false);
                personImgViewLeftNO.setVisible(true);
                personImgViewRightNO.setVisible(false);
            }
            else if (e.getCode() == KeyCode.S || e.getCode() == KeyCode.DOWN)
            {
                System.out.println("S key pressed, down");
                direction = 3;
                playerY += 5;
                personImgViewLeftNO.setX(playerX);
                personImgViewLeftNO.setY(playerY);

                personImgViewFrontNO.setX(playerX);
                personImgViewFrontNO.setY(playerY);

                personImgViewBackNO.setX(playerX);
                personImgViewBackNO.setY(playerY);

                personImgViewRightNO.setX(playerX);
                personImgViewRightNO.setY(playerY);


                // Make anything but front invisible
                personImgViewBackNO.setVisible(false);
                personImgViewFrontNO.setVisible(true);
                personImgViewLeftNO.setVisible(false);
                personImgViewRightNO.setVisible(false);
            }
            else if (e.getCode() == KeyCode.D || e.getCode() == KeyCode.RIGHT)
            {
                System.out.println("D key pressed, right");
                direction = 4;
                playerX += 5;

                personImgViewLeftNO.setX(playerX);
                personImgViewLeftNO.setY(playerY);

                personImgViewFrontNO.setX(playerX);
                personImgViewFrontNO.setY(playerY);

                personImgViewBackNO.setX(playerX);
                personImgViewBackNO.setY(playerY);

                personImgViewRightNO.setX(playerX);
                personImgViewRightNO.setY(playerY);

                // Make anything but right invisible
                personImgViewBackNO.setVisible(false);
                personImgViewFrontNO.setVisible(false);
                personImgViewLeftNO.setVisible(false);
                personImgViewRightNO.setVisible(true);
            }
        });

        // Title for window
        stage.setTitle("Blocky");

        // Measurements for window
        stage.setMinWidth(640);
        stage.setMaxWidth(640);
        stage.setMinHeight(480);
        stage.setMaxHeight(480);
        stage.setWidth(640);
        stage.setHeight(480);

        scene.setFill(Color.WHITE);

        stage.setScene(scene);

        stage.show();
    }
}

Заранее спасибо, даже если у вас нет ответа для меня.

...