Poruszanie obiektem za pomocą klawiatury

0

Witam, jestem początkującym w JavaFX, mój "program" w skrócie polega na poruszaniu kwadracikiem po ekranie. Niby działa, ale niezgodnie z oczekiwaniami.

  1. Pierwszy problem to jeśli wcisnę na klawiaturze UP, kwadrat porusza sie do góry, następnie wciskam LEFT (nie puszczając UP ) i kwadrat porusza się prawidłowo, czyli w lewy góry róg. Lecz gdy wcisnę naraz UP && LEFT to kwadrat porusza się w lewy góry róg, ale wydaje mi się, że z dwa razy większa szybkością. Analogicznie z innymi kierunkami.
  2. Drugi problem "kwadrat za długo myśli" chodzi o to, że jeśli nacisnę klawisz LEFT to porusza się w lewo, jest ok. Potem puszczam LEFT i naciskam np RIGHT wtedy kwadrat staje na chwilę, a dopiero po krótkiej chwili porusza się prawidłowo(nie jest to płynne przejście).
    Jeśli ktoś, wie w czym leży problem bardzo proszę o pomoc i krótkie wyjaśnienie
package sample;

import javafx.scene.input.KeyCode;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Rectangle;

/**
 * Created by Mateusz on 2017-08-13.
 */
public class Player extends Rectangle{

    // Wartosci te odpowiadaja o ile przesunie sie Player
    private int speedX;
    private int speedY;

    private boolean up;
    private boolean down;
    private boolean left;
    private boolean right;

    public Player(double width, double height, Paint fill) {
        super(width, height, fill);
        setFocusTraversable(true);
        speedX=5;
        speedY=5;
    }

    public void move(int x,int y)
    {
        this.setX(this.getX()+x);
        this.setY(this.getY()+y);
    }

    public void move() {
        setOnKeyPressed(
                event ->
                {
                   if(event.getCode()== KeyCode.UP) {
                       up=true;
                   }
                   if(event.getCode()== KeyCode.DOWN)
                    {
                        down=true;
                    }if(event.getCode() == KeyCode.LEFT)
                    {
                    left=true;
                    }
                    if(event.getCode() == KeyCode.RIGHT)
                    {
                    right=true;
                    }
                    moveCombination();
                }
        );
        setOnKeyReleased(
                event -> {
                    up=false;
                    down=false;
                    left=false;
                    right=false;
                }
        );
    }

    private void moveCombination()
    {
        if(up && !left && !right)
    {
        move(0,-getSpeedY());
    }else if(down && !left && !right)
    {
        move(0,getSpeedY());

    }else if(left && !up && !right && !down)
    {
        move(-getSpeedX(),0);
    }else if(right && !up && !left && !down)
    {
        move(getSpeedX(),0);
    }else if(up&&right)
    {
        move(getSpeedX(),-getSpeedY());
    }else if(up&&left)
    {
        move(-getSpeedX(),-getSpeedY());
    }else if(down&&right)
    {
        move(getSpeedX(),getSpeedY());
    }else if(down&&left)
    {
        move(-getSpeedX(),getSpeedY());
    }
    }

    public int getSpeedX() {
        return speedX;
    }

    public void setSpeedX(int speedX) {
        this.speedX = speedX;
    }

    public int getSpeedY() {
        return speedY;
    }

    public void setSpeedY(int speedY) {
        this.speedY = speedY;
    }
}

package sample;

import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Paint;


public class Controller{

    @FXML
    private AnchorPane anchorPane;

    Player player;

    @FXML
    void initialize() {
       player = new Player(35,35,Paint.valueOf("BLACK"));
       player.setX(350);
       player.setY(250);
       anchorPane.getChildren().add(player);
       player.move();
    }
}
package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 800, 600));
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

0

W setOnKeyReleased nie sprawdzasz, który klawisz został podniesiony. Polecam jeszcze pomyśleć jak można uprościć ten kod, żeby pozbyć się tej strasznej drabinki ifów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1