JavaFX Objekte bewegen

Lukascoder

Mitglied
Hallo
Ich bin gerade dabei ein Spiel in JavaFX zu programmieren und habe Probleme mit der Steuerung.
Durch recherchieren habe ich schon eine Möglichkeit gefunden, nämlich "setFocusTraversable(true)".

Das Problem ist aber das, dass mehr als schwammig ist:

1. schräg gehen ist unmöglich

2. wenn man die Taste gedrückt hält, bleibt es eine halbe Sekunde stehen und düst dann ab.(wie bei einer Texteingabe)

Hat da vielleicht einer eine bessere Idee?

PS
ich programmiere mit FXML.(wenn das eine Rolle spielt)
 
Dieses Problem tritt auch in Swing auf.

Du kannst dieses jedoch umgehen, indem du die Tasteneingaben nicht direkt verarbeitest,
sondern einen Flag setzt, ob die Taste gerade gedrückt ist oder eben nicht.
(Am besten verwendest du zu diesem Zweck eine HashMap<Integer, Boolean>)

Dann arbeitest du mit diesen Werten in deinem Main-Loop weiter.

Ich hoffe, ich konnte dir helfen.

Mit freundlichen Grüßen,
Androbin
 
Danke
Bin aber inzwischen auch auf das mit den Flags gekommen.
Habe dann das aber mit mehreren Threads gelöst

So:
Java:
import javafx.scene.input.KeyCode;import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class Steuerung{
    
    private Rectangle rechteck;
   
    private AnchorPane spielfeld;


    
    
    private boolean isRunning = false;
    
    private boolean[] flags = new boolean[9];


    public Thread thread;
    
    private boolean buttonPressed = false;
    
    public AnchorPane getSpielfeld() {
        return spielfeld;
    }


    public void setSpielfeld(AnchorPane spielfeld) {
        this.spielfeld = spielfeld;
    }
    
    public Rectangle getRechteck() {
        return rechteck;
    }


    public void setRechteck(Rectangle rechteck) {
        this.rechteck = rechteck;
    }
    
    public void tasteLosgelassen(KeyEvent event){
        if(event.getCode()==KeyCode.W)flags[0]=false;
        if(event.getCode()==KeyCode.D)flags[1]=false;
        if(event.getCode()==KeyCode.S)flags[2]=false;
        if(event.getCode()==KeyCode.A)flags[3]=false;
        
        
    }
    
    public void tasteGedrueckt(KeyEvent event){

        if(event.getCode()==KeyCode.W)flags[0]=true;
        if(event.getCode()==KeyCode.D)flags[1]=true;
        if(event.getCode()==KeyCode.S)flags[2]=true;
        if(event.getCode()==KeyCode.A)flags[3]=true;
        if(event.getCode()==KeyCode.ESCAPE)flags[4]=true;
        Stage spielStage = (Stage) rechteck.getScene().getWindow();
        if(flags[4]){


            if(!buttonPressed){
                spielStage.setFullScreen(false);
                this.buttonPressed=true;
            }else{
                spielStage.setFullScreen(true);
                this.buttonPressed=false;
            }     
        }
        if(isRunning)return;
       
            thread = new Thread(new Runnable() {


                @Override
                public void run() {
                    isRunning=true;
                    steuerung();
                    
                }
            });
            thread.start();
        isRunning=false;
    }
    
    public void steuerung(){


       while(flags[0]||flags[1]||flags[2]||flags[3]||flags[4]){
        if(flags[0]){
            rechteck.setLayoutY(rechteck.getLayoutY()-1);
            if(rechteck.getLayoutY()<spielfeld.getLayoutY()){
                rechteck.setLayoutY(0);


            }  
        }if(flags[1]){          
            rechteck.setLayoutX(rechteck.getLayoutX()+1);            
            if(rechteck.getLayoutX()+rechteck.getWidth()>spielfeld.getPrefWidth()){
                rechteck.setLayoutX(spielfeld.getPrefWidth()-rechteck.getWidth());
            }
        
        }if(flags[2]){
            rechteck.setLayoutY(rechteck.getLayoutY()+1);
            if(rechteck.getLayoutY()+rechteck.getHeight()>spielfeld.getPrefHeight()){
                rechteck.setLayoutY(spielfeld.getPrefHeight()-rechteck.getHeight());
            }


        }if(flags[3]){
            rechteck.setLayoutX(rechteck.getLayoutX()-1);
            if(rechteck.getLayoutX()<spielfeld.getLayoutX()){
                rechteck.setLayoutX(0);
            }
        }      
        try {
                Thread.sleep(2);
            } catch (InterruptedException ex) {
               
            }
        
        }
    }
}

Man muss hierbei nur aufpassen das der Thread am Ende nicht die Ressourcen blockiert
Ich muss jetzt nur noch dafür sorgen das nur bestimmte Tasten zugelassen werden und dann hab ich die Steuerung😀
 
Zuletzt bearbeitet:
OK ich hab mein Problem mit den Ressourcen gefunden.
Und zwar die Stage(zum verlassen des Fullscreens) muss innerhalb von der Keycode
Überprüfung stehen

So mein aktueller Stand:
Java:
import javafx.scene.input.KeyCode;import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class Steuerung{
    
 
    private Rectangle rechteck;
 
    private AnchorPane spielfeld;
 


 
 
    private boolean isRunning = false;
 
    private boolean[] flags = new boolean[9];
 
 
    public Thread thread;
 
    private boolean buttonPressed = false;
 
    public AnchorPane getSpielfeld() {
        return spielfeld;
    }
 
 
    public void setSpielfeld(AnchorPane spielfeld) {
        this.spielfeld = spielfeld;
    }
 
    public Rectangle getRechteck() {
        return rechteck;
    }
 
 
    public void setRechteck(Rectangle rechteck) {
        this.rechteck = rechteck;
    }
 
    public void tasteLosgelassen(KeyEvent event){
        if(event.getCode()==KeyCode.W)flags[0]=false;
        if(event.getCode()==KeyCode.D)flags[1]=false;
        if(event.getCode()==KeyCode.S)flags[2]=false;
        if(event.getCode()==KeyCode.A)flags[3]=false;
 
 
    }
 
    public void tasteGedrueckt(KeyEvent event){
 
        if(event.getCode()==KeyCode.W)flags[0]=true;
        if(event.getCode()==KeyCode.D)flags[1]=true;
        if(event.getCode()==KeyCode.S)flags[2]=true;
        if(event.getCode()==KeyCode.A)flags[3]=true;
        
        if(event.getCode()==KeyCode.ESCAPE){
            Stage stage = (Stage)rechteck.getScene().getWindow();
        
            if(buttonPressed){
                stage.setFullScreen(true);
                buttonPressed=false;
            }else if(!buttonPressed){
                stage.setFullScreen(false);
                buttonPressed =  true;
            }
        }
        if(isRunning)return;
            
            thread = new Thread(new Runnable() {
 
 
                @Override
                public void run() {
                    isRunning=true;
                    steuerung();
                    isRunning=false;
                }
            });
            thread.start();
        
    }
 
    public void steuerung(){
 
 
       while(flags[0]||flags[1]||flags[2]||flags[3]){
        if(flags[0]){
            rechteck.setLayoutY(rechteck.getLayoutY()-1);
            if(rechteck.getLayoutY()<spielfeld.getLayoutY()){
                rechteck.setLayoutY(0);
 
 
            }  
        }if(flags[1]){          
            rechteck.setLayoutX(rechteck.getLayoutX()+1);            
            if(rechteck.getLayoutX()+rechteck.getWidth()>spielfeld.getPrefWidth()){
                rechteck.setLayoutX(spielfeld.getPrefWidth()-rechteck.getWidth());
            }
 
        }if(flags[2]){
            rechteck.setLayoutY(rechteck.getLayoutY()+1);
            if(rechteck.getLayoutY()+rechteck.getHeight()>spielfeld.getPrefHeight()){
                rechteck.setLayoutY(spielfeld.getPrefHeight()-rechteck.getHeight());
            }
 
 
        }if(flags[3]){
            rechteck.setLayoutX(rechteck.getLayoutX()-1);
            if(rechteck.getLayoutX()<spielfeld.getLayoutX()){
                rechteck.setLayoutX(0);
            }
        }      
        try {
                Thread.sleep(2);
            } catch (InterruptedException ex) {
 
            }
 
        }
       
    }
}
 

Zurück
Oben