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 楼答案
有不同的方法可以做到这一点。我不认为我完全理解你想要什么,但这可能对各种情况有所帮助
然后
因此,现在在一个单独的线程上,或者当按下ENTER键时,可以将暂停的AtomicBoolean设置为true
PaneOrganizer.paused.set(true);
。你还需要一种解除它的方法如果要在暂停时仍处理ENTER键,则只需在检查暂停之前移动对ENTER键的处理