

Render用の`Task`である`RenderTask`を

[code]

    public class RenderTask extends Task<Integer> {
    
        final private MainApp app;
        private boolean exit;
    
        public RenderTask(MainApp app){
    
            this.app = app;
    
        }
    
        @Override
        public Integer call() {
    
            System.out.println("RenderTask start");
    
            EntityNode theEntity = EntityNode.create(app.entityRegistry.get(0), 64, 64);
            addEntity(theEntity);
    
            for(;;){//here
    
                if(exit)
                    break ;
    
                theEntity.setPosition(theEntity.getX()+0.1, theEntity.getY());
                System.out.println(theEntity);
    
                try {
                    System.out.println(GameSystem.getNormalThreadSleepTime());
                    Thread.sleep(GameSystem.getNormalThreadSleepTime()/* return 1000/60*/);
                } catch (InterruptedException interrupted) {
                    System.err.println("ERR");
                }
            }
    
            System.out.println("RenderTask end");
    
            return 0;
    
        }
    
        public EntityNode addEntity(EntityNode entityNode){
    
            app.groupEntity.getChildren().add(entityNode);
            return entityNode;
    
        }
    
        public EntityNode addEntity(Entity entity, double posX, double posY){
    
            return this.addEntity(EntityNode.create(entity, posX, posY));
    
        }
    
        public void exit(){
    
            this.exit = true;
    
        }
    
    }
    
[/code]

と宣言し，MainAppを

[code]

    public class MainApp extends Application {
    
        final public AnchorPane pane = new AnchorPane();
    
        final public GameTask gameTask = new GameTask(this);
        final public GameServerTask gameServerTask = new GameServerTask(this);
        final public RenderTask renderTask = new RenderTask(this);
    
        final public EntityRegistry entityRegistry = new EntityRegistry();
    
        final public Group groupEntity = new Group();
    
        public static void main(String[] args){
    
            MainApp.launch(args);
    
        }
    
        @Override
        public void start(Stage stage) {
    
            stage.setTitle("INVASION");
    
            stage.setWidth(GameSystem.windowWidth);
            stage.setHeight(GameSystem.windowHeight);
            stage.setMaxWidth(GameSystem.windowWidth);
            stage.setMaxHeight(GameSystem.windowHeight);
            stage.setMinWidth(GameSystem.windowWidth);
            stage.setMinHeight(GameSystem.windowHeight);
    
            stage.setScene(new Scene(pane));
    
            new Thread(gameTask).start();
            new Thread(gameServerTask).start();
            Platform.runLater(renderTask);
    
            gameServerTask.order(new Order("init", 0));
    
            pane.getChildren().add(groupEntity);
    
            stage.show();
    
        }
    }
    
[/code]

`RenderTask`の`//here`部分のループが一度の実行で終わってしまっています。  
しかし`for`の外は実行されていないのでどこかで処理が止まっているのかと思います。  
凡ミスかもしれませんが回答お願いします。


CC BY-SA 3.0
2017-10-08T05:32:29.323
38529
2020-12-17T02:00:30.053
2017-10-08T09:19:11.930
13199
25688
question
java javafx
JavaFXでのタスクループ


画面要素であるgroupEntityに別スレッドのRenderTaskから要素を足しているため、画面に更新が走ってロックが起こっているのかもしれません。  
setPositionの行をコメントアウトしたら、ループが動くようになりませんか？


CC BY-SA 3.0
2017-10-10T10:00:34.830
38565
2017-10-10T10:00:34.830
12233
38529
answer