libgdx Stage.dispose() не сразу отсоединяет актеров

Я работаю с libgdx, и у меня есть такая ситуация, когда я использую Stage с присоединенными тремяActors. Когда для сцены вызывается метод act(), вызывается метод act() каждого из актеров. Это поведение по умолчанию, и оно правильное.

Но если я размещаю сцену в методе act() второго актера, то метод act() третьего актера все еще вызывается. Я не ожидал такого поведения. Как будто этот актер не отсоединяется сразу после вызова метода dispose() на сцене. Этот последний вызов третьего актера проблематичен для меня, потому что я получаю исключение и не знаю, как его избежать. Если бы метод act() третьего актера не вызывался в последний раз перед тем, как сцена будет фактически удалена, было бы здорово.

У вас есть идеи, как я могу этого избежать?

Мне сложно изменить свой игровой дизайн, потому что в моем случае второй актор — враг, а третий актор — защитная башня. Когда враг умирает, я располагаю сцену, чтобы показать игру на экране. Но башня по-прежнему действует на заднем плане...


person linu    schedule 04.12.2014    source источник
comment
Это разработанное поведение Stage. Это гарантирует, что метод act каждого актора вызывается один раз в кадре, независимо от того, что делают другие акторы. Я думаю, что в большинстве случаев это самое полезное поведение. Может быть, вы могли бы рассказать, что происходит в методе действия вашей башни, что вызывает исключение.   -  person Tenfour04    schedule 05.12.2014
comment
Спасибо, я считаю, что редизайн части моего приложения мог бы избежать этого. Просто мне кажется странным, что на сцене все еще есть актер, даже после того, как ее убрали. Я не думаю, что есть чистый способ справиться с этим.   -  person linu    schedule 08.12.2014


Ответы (2)


Попробуйте использовать act.remove() или stage.clear().

person Juan Javier Cassani    schedule 04.12.2014
comment
Спасибо за подсказку, я попробовал, но ничего не изменилось. Это так странно, даже если сцена очищена и к ней больше не привязаны актеры, метод act() третьего актера все равно вызывается. Я считаю, что этот рекурсивный метод act() вызывается в своем собственном потоке, и я не могу остановить его преждевременно :) - person linu; 05.12.2014

Вместо того, чтобы менять экраны/распоряжаться своей сценой сразу после смерти ваших врагов, вы можете передать любой класс, контролирующий вашу сцену, в качестве аргумента вашим актерам. Когда ваш актер умирает, вы можете, например, установить boolean в классе, содержащем вашу сцену, для перехода, а затем после вызова stage.act() проверить, нужно ли вам сделать переход, а затем безопасно избавиться от сцены. Это не очень элегантно, но обязательно сработает. Есть также много способов реализации переходов, вызываемых внешними объектами. boolean может быть очень ограничивающим, потому что вы не можете сказать своей игре, на какой экран вы хотите перейти, поэтому вы можете захотеть реализовать какую-то реализацию Runnable. Есть много способов.

Просто идея. Надеюсь, это поможет.

person matthewtory    schedule 04.12.2014
comment
Ты прав. Такое поведение происходит только один раз (для кадра, в котором расположена сцена). Для меня немного странно, что метод акта актера все еще выполняется после того, как сцена расположена. Я думаю, что нет другого чистого способа преодолеть это, кроме как каким-то образом перепроектировать мое приложение. Спасибо - person linu; 08.12.2014