Отмените запущенную сопрограмму и инициируйте новую с каждым щелчком мыши в Kotlin. - PullRequest
0 голосов
/ 13 мая 2018

Обратите внимание, что я использую библиотеку javafx. Ниже приведена функция из класса Ship, которая перемещается в пространстве. игрок нажимает на корабль, появляется раскрывающееся меню, и после нажатия кнопки «Move» запускается сопрограмма \ moveJob \, которая вызывает функцию \ move () \, которая заставит объект начать движение к месту назначения.

Проблема в том, что, если я еще раз нажму «переместить» в середине пути, тогда объект будет вести себя беспорядочно, поскольку две сопрограммы будут работать одновременно и обновлять координаты x и y объекта.

Поэтому мне нужно отменять \ moveJob \ каждый раз, когда я нажимаю "переместить" и запускаю новую сопрограмму с новым пунктом назначения. Я просто не выяснил, как я могу использовать \ movingJob.cancel () \, так сказать, превентивно, если уже есть одна сопрограмма.

item1.setOnAction {

        println("Something...")
        root.onMouseClicked = EventHandler { event ->
            launch {
                println("Clicked on an object.")
            }
            /* If you click on an object, you don't want scene.onMouseClicked
                to be executed. event.consume() gobbles the event so that it isn't passed
                down.
             */
            event.consume()
            // Here we should have something that reaches
            root.onMouseClicked = null
            scene.onMouseClicked = null
        }
        scene.onMouseClicked = EventHandler { event ->
            val moveJob =launch {
                move(event, root)
            }
            root.onMouseClicked = null
            scene.onMouseClicked = null
        }

        /* Move to coorindates that the user clicks next */
    }

1 Ответ

0 голосов
/ 13 мая 2018

Объявите Job переменную где-то в вашем классе

private var currentJob: Job? = null

И используйте следующий код

item1.setOnAction {
    println("Something...")
    root.onMouseClicked = EventHandler { event ->
        currentJob?.cancel()
        currentJob = launch {
            println("Clicked on an object.")
        }
        /* If you click on an object, you don't want scene.onMouseClicked
            to be executed. event.consume() gobbles the event so that it isn't passed
            down.
         */
        event.consume()
        // Here we should have something that reaches
        root.onMouseClicked = null
        scene.onMouseClicked = null
    }
    scene.onMouseClicked = EventHandler { event ->
        currentJob?.cancel()
        currentJob = launch {
            move(event, root)
        }
        root.onMouseClicked = null
        scene.onMouseClicked = null
    }

    /* Move to coorindates that the user clicks next */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...