有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaFX上带线程程序的java暂停事件执行

我正在做一个项目,我必须使用线程。我有一个小游戏,用户可以用键移动角色。我想在用户按enter键时暂停游戏。这里的问题是:如何使用线程停止KeyEvent执行

这是我的组织课

public class PaneOrganizer {
private BorderPane border;
private Pane _root;
private PajaroMensajero pajaro1;
private PajaroMensajero pajaro2;
private ImageView imagenPajaro1;
private ImageView imagenPajaro2;

public PaneOrganizer(){
    _root=new Pane();
    pajaro1=new PajaroMensajero("porygon_red.png");
    pajaro2=new PajaroMensajero("porygon_blue.png");
    imagenPajaro1=pajaro1.getImagenPajaro();
    imagenPajaro2=pajaro2.getImagenPajaro();
    Scene scene=Main.scene;
    scene.setOnKeyPressed(new ManejadorTeclas());
    _root.getChildren().addAll(imagenPajaro1,imagenPajaro2);
    imagenPajaro1.setLayoutX(Constantes.POSICION_INICIAL_PAJARO_1);
    imagenPajaro1.setLayoutY(0);
    imagenPajaro2.setLayoutX(Constantes.POSICION_INICIAL_PAJARO_2);
    imagenPajaro2.setLayoutY(0);
    setStyle();
}

public Pane getRoot(){
    return this._root;
}

public void setStyle(){
    Background b= new Background(new BackgroundFill(Color.GREY,CornerRadii.EMPTY,Insets.EMPTY));
    _root.setBackground(b);
}

private class ManejadorTeclas implements EventHandler<KeyEvent>{

    @Override
    public void handle(KeyEvent event) {

        double LIMITE_ALTURA=_root.heightProperty().doubleValue();
        double LIMITE_ANCHO=_root.widthProperty().doubleValue();

        System.out.println("p1: "+imagenPajaro1.getLayoutX());
        System.out.println("p2: "+imagenPajaro2.getLayoutX());

        if(event.getCode()==Constantes.UP_P1){
            double nuevaPosicionY= imagenPajaro1.getLayoutY()-Constantes.MOVIMIENTO_Y;
            if(nuevaPosicionY >= 0 &&
               !imagenPajaro2.getBoundsInParent().intersects(imagenPajaro1.getBoundsInParent().getMinX(),imagenPajaro1.getBoundsInParent().getMinY()-Constantes.MOVIMIENTO_Y,imagenPajaro1.getBoundsInParent().getWidth(),imagenPajaro1.getBoundsInParent().getHeight())){
                imagenPajaro1.setLayoutY(nuevaPosicionY);
            }
        }
        else if(event.getCode()==Constantes.DOWN_P1){
            double nuevaPosicionY= imagenPajaro1.getLayoutY()+Constantes.MOVIMIENTO_Y;
            if(nuevaPosicionY <= LIMITE_ALTURA - Constantes.TAMAÑO_POKEMON_Y &&
            !imagenPajaro2.getBoundsInParent().intersects(imagenPajaro1.getBoundsInParent().getMinX(),imagenPajaro1.getBoundsInParent().getMinY()+Constantes.MOVIMIENTO_Y,imagenPajaro1.getBoundsInParent().getWidth(),imagenPajaro1.getBoundsInParent().getHeight())){
                imagenPajaro1.setLayoutY(nuevaPosicionY);
            }

        }
        else if(event.getCode()==Constantes.LEFT_P1){
            double nuevaPosicionX= imagenPajaro1.getLayoutX()- Constantes.MOVIMIENTO_X;
            if(nuevaPosicionX>=0 &&
               !imagenPajaro2.getBoundsInParent().intersects(imagenPajaro1.getBoundsInParent().getMinX()-Constantes.MOVIMIENTO_X,imagenPajaro1.getBoundsInParent().getMinY(),imagenPajaro1.getBoundsInParent().getWidth(),imagenPajaro1.getBoundsInParent().getHeight()))
            {
                imagenPajaro1.setLayoutX(nuevaPosicionX);
            }
        }
        else if(event.getCode()==Constantes.RIGHT_P1){
            double nuevaPosicionX= imagenPajaro1.getLayoutX() + Constantes.MOVIMIENTO_X;
            if(nuevaPosicionX <= LIMITE_ANCHO - Constantes.TAMAÑO_POKEMON_X && 
               !imagenPajaro2.getBoundsInParent().intersects(imagenPajaro1.getBoundsInParent().getMinX()+Constantes.MOVIMIENTO_X,imagenPajaro1.getBoundsInParent().getMinY(),imagenPajaro1.getBoundsInParent().getWidth(),imagenPajaro1.getBoundsInParent().getHeight()))
            {
                imagenPajaro1.setLayoutX(nuevaPosicionX);
            }
        }
        else if(event.getCode()==Constantes.UP_P2){
            double nuevaPosicionY= imagenPajaro2.getLayoutY()-Constantes.MOVIMIENTO_Y;
            if(nuevaPosicionY >= 0 &&
               !imagenPajaro1.getBoundsInParent().intersects(imagenPajaro2.getBoundsInParent().getMinX(),imagenPajaro2.getBoundsInParent().getMinY()-Constantes.MOVIMIENTO_Y,imagenPajaro2.getBoundsInParent().getWidth(),imagenPajaro2.getBoundsInParent().getHeight())){
                imagenPajaro2.setLayoutY(nuevaPosicionY);
            }
        }
        else if(event.getCode()==Constantes.DOWN_P2){
            double nuevaPosicionY= imagenPajaro2.getLayoutY()+Constantes.MOVIMIENTO_Y;
            if(nuevaPosicionY <= LIMITE_ALTURA- Constantes.TAMAÑO_POKEMON_Y &&
               !imagenPajaro1.getBoundsInParent().intersects(imagenPajaro2.getBoundsInParent().getMinX(),imagenPajaro2.getBoundsInParent().getMinY()+Constantes.MOVIMIENTO_Y,imagenPajaro2.getBoundsInParent().getWidth(),imagenPajaro2.getBoundsInParent().getHeight())){
                imagenPajaro2.setLayoutY(nuevaPosicionY);
            }
        }
        else if(event.getCode()==Constantes.LEFT_P2){
            double nuevaPosicionX= imagenPajaro2.getLayoutX()- Constantes.MOVIMIENTO_X;
            if(nuevaPosicionX>=0 && 
               !imagenPajaro1.getBoundsInParent().intersects(imagenPajaro2.getBoundsInParent().getMinX()-Constantes.MOVIMIENTO_X,imagenPajaro2.getBoundsInParent().getMinY(),imagenPajaro2.getBoundsInParent().getWidth(),imagenPajaro2.getBoundsInParent().getHeight())){
                imagenPajaro2.setLayoutX(nuevaPosicionX);
            }
        }
        else if(event.getCode()==Constantes.RIGHT_P2){
            double nuevaPosicionX= imagenPajaro2.getLayoutX() + Constantes.MOVIMIENTO_X;
            if(nuevaPosicionX <= LIMITE_ANCHO - Constantes.TAMAÑO_POKEMON_X &&
               !imagenPajaro1.getBoundsInParent().intersects(imagenPajaro2.getBoundsInParent().getMinX()+Constantes.MOVIMIENTO_X,imagenPajaro2.getBoundsInParent().getMinY(),imagenPajaro2.getBoundsInParent().getWidth(),imagenPajaro2.getBoundsInParent().getHeight())){
                imagenPajaro2.setLayoutX(nuevaPosicionX);
            }
        }
        else if (event.getCode()==KeyCode.ENTER){

        }

   }
}
}

其他公用事业类别

public class PajaroMensajero {
private Image imagen;
private ImageView imagenView;

public PajaroMensajero(String nombreArchivo){
    this.imagen=new Image(nombreArchivo,Constantes.TAMAÑO_POKEMON_X,Constantes.TAMAÑO_POKEMON_Y,true,true);
    imagenView=new ImageView(this.imagen);
}

public ImageView getImagenPajaro(){
    return this.imagenView;
}
}

public class Constantes {
final static int TAMAÑO_X=600;
final static int TAMAÑO_Y=400;

final static int TAMAÑO_POKEMON_X=50;
final static int TAMAÑO_POKEMON_Y=50;

final static double MOVIMIENTO_X=30;
final static double MOVIMIENTO_Y=30;

final static int POSICION_INICIAL_PAJARO_1=TAMAÑO_X * 1/4;
final static int POSICION_INICIAL_PAJARO_2=TAMAÑO_X * 3/4;

final static String DIRECTORIO_IMAGENES="";

static KeyCode UP_P1=KeyCode.UP;
static KeyCode DOWN_P1=KeyCode.DOWN;
static KeyCode LEFT_P1=KeyCode.LEFT;
static KeyCode RIGHT_P1=KeyCode.RIGHT;

static KeyCode UP_P2=KeyCode.W;
static KeyCode DOWN_P2=KeyCode.S;
static KeyCode LEFT_P2=KeyCode.A;
static KeyCode RIGHT_P2=KeyCode.D;
}

共 (1) 个答案

  1. # 1 楼答案

    有不同的方法可以做到这一点。我不认为我完全理解你想要什么,但这可能对各种情况有所帮助

    public PaneOrganizer(){
        public static final AtomicBoolean paused = new AtomicBoolean(false);
    

    然后

    private class ManejadorTeclas implements EventHandler<KeyEvent>{
    
        @Override
        public void handle(KeyEvent event) {
    
            if (paused.get()) {
                //program is paused, do not process the KeyEvent
                return;
            }
    

    因此,现在在一个单独的线程上,或者当按下ENTER键时,可以将暂停的AtomicBoolean设置为truePaneOrganizer.paused.set(true);。你还需要一种解除它的方法

    如果要在暂停时仍处理ENTER键,则只需在检查暂停之前移动对ENTER键的处理

    private class ManejadorTeclas implements EventHandler<KeyEvent>{
    
        @Override
        public void handle(KeyEvent event) {
    
            if (event.getCode()==KeyCode.ENTER){
                //handle ENTER...
                //possibly toggle the pause state.... paused.set(!paused.get());
            }else if (paused.get()) {
                //program is paused, do not process the KeyEvent
                return;
            }