【问题标题】:game freeze when i run a different thread javafx当我运行不同的线程 javafx 时游戏冻结
【发布时间】:2014-05-18 05:30:37
【问题描述】:

我对 javaFX 有疑问: 当我运行新线程时,游戏会冻结加载并且永远不会继续

这是游戏循环类:

public class Motor implements Runnable{
private Mapa mapa;

public Motor(Canvas canvas,Label label){
    ArrayList<Nivel> lstNiveles = new ArrayList<Nivel>();
    mapa=new Mapa(lstNiveles,canvas,label);
}

public void start(){
    System.out.println(Platform.isFxApplicationThread());
    Platform.runLater(this);
}   

public void run(){
    System.out.println(Platform.isFxApplicationThread());
    ArrayList<Nivel> lstNiveles = new ArrayList<Nivel>();
    mapa=new Mapa(lstNiveles,ControladorMapa.canvas,ControladorMapa.mapa);
    mapa.cargarMapa();
    while(true){
        try{
            mapa.rePaint();

            Thread.sleep(2000);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
}

播放器类:

public class PjAnimado {    
private Image imagen;
private int sx;
private int sy;
private int sw;
private int sh;
private int posX;
private int posY;
private int widht;
private int height;
private final int sMoveX=50;
private final int sMoveY=75;
private int numImag=0;
private Canvas pantalla; 



 public PjAnimado(int posX, int posY,Canvas pantalla) {
    this.imagen = new Image(getClass().getResource("../recursos/sprite_player.png").toExternalForm());
    this.sx=0;
    this.sy=0;
    this.sw=50;
    this.sh=75;
    this.widht=60;
    this.height=60;
    this.posX = posX;
    this.posY = posY;
    this.pantalla=pantalla;
}
public void paint(){
    GraphicsContext g2d = pantalla.getGraphicsContext2D();
    g2d.drawImage(imagen, sx, sy, sw, sh,posX,posY, widht, height);
}
public void moverDerecha(){
    this.numImag++;
    if(this.numImag<7){
        this.sx=sx+sMoveX;
    }else{
        this.sx=0;
    }

    this.posX+=50;
    this.posY+=50;
}
public void MoverPj(){
    this.pantalla.addEventHandler(KeyEvent.KEY_PRESSED,new EventHandler<KeyEvent>(){

        @Override
        public void handle(KeyEvent event) {
            if(event.getCode()==KeyCode.D){
                moverDerecha(); 
            }
        }

    });

}

public int getPosX() {
    return posX;
}

public void setPosX(int posX) {
    this.posX = posX;
}

public int getPosY() {
    return posY;
}
public void setPosY(int posY) {
    this.posY = posY;
}
}

地图类:

public class Mapa {

private PjAnimado pj;
private ArrayList<Nivel> lstNiveles;
private Label mapa;

public Mapa(ArrayList<Nivel> lstNiveles,Canvas canvas,Label mapa){
    this.setLstNiveles(lstNiveles);
    pj=new PjAnimado(100,100,canvas);
    this.mapa=mapa;
}

public void cargarMapa(){
    pj.paint();
    ponerFondo();

}
public void rePaint(){
    pj.paint();
}
private void ponerFondo(){
    mapa.setGraphic(new ImageView(new Image(getClass().getResource("../recursos/Desert.jpg").toExternalForm())));
}

public PjAnimado getPj() {
    return pj;
}

public void setPj(PjAnimado pj) {
    this.pj = pj;
}

public ArrayList<Nivel> getLstNiveles() {
    return lstNiveles;
}

public void setLstNiveles(ArrayList<Nivel> lstNiveles) {
    this.lstNiveles = lstNiveles;
}
}

fxml 的控制器类: 在这个类中,我从 fxml 加载所有内容

public class ControladorMapa implements Initializable,EventHandler<KeyEvent>{

@FXML StackPane logo1;
@FXML public static AnchorPane contPrincipal;
@FXML public static Label mapa;
@FXML public static Canvas canvas;

public void initialize(URL arg0, ResourceBundle arg1) { 
}

最后这是主线程的一个猜测:

public class test extends Application {

@Override
public void start(Stage escenario) throws Exception {
    Parent root= FXMLLoader.load(getClass().getResource("Mapa.fxml"));
    Scene scene = new Scene(root);
    escenario.setScene(scene);
    escenario.show();
    Motor motor = new Motor(ControladorMapa.canvas,ControladorMapa.mapa);
    motor.start();
}
public static void main(String[] args) {
    launch(args);
}


}

【问题讨论】:

    标签: java multithreading javafx-2 freeze


    【解决方案1】:

    您正在阻止 Motor.run 中的 FX 应用程序线程:

    while (true) {
        try {
            mapa.rePaint();
            Thread.sleep(2000);
        } catch(Exception e){
            e.printStackTrace();
        }
    }
    

    我不知道你为什么需要这个循环,但是通过 FX 应用程序线程运行它肯定是错误的。

    【讨论】:

    • 这个循环用里面的玩家更新地图,我不知道我怎么能把它放在主线程或新线程中
    • @user3624703 正如我所写:我不知道这个循环是干什么用的。为什么需要循环重绘任何东西?
    • 因为我必须在地图上移动玩家来更新他的位置并注意如果玩家在地图中达到了一个级别
    • 如果播放器是JavaFX节点,当你重新定位它时会自动重新绘制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多