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.
- 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.
- 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);
}
}