Я работаю над небольшой 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();
}
}
Заранее спасибо, даже если у вас нет ответа для меня.