Я программирую простой движок 2d игры.Я решил, как бы я хотел, чтобы механизм работал: он будет состоять из объектов, содержащих «события», которые будут запускаться моим основным игровым циклом, когда это уместно.
Еще немного о структуре: Каждый GameObject
имеет updateEvent
метод.objectList
- это список всех объектов, которые будут получать события обновления.Только объекты в этом списке имеют свой метод updateEvent, вызываемый игровым циклом.
Я пытаюсь реализовать этот метод в классе GameObject (Эта спецификация - это то, что я хотел бы методдля достижения):
/**
* This method removes a GameObject from objectList. The GameObject
* should immediately stop executing code, that is, absolutely no more
* code inside update events will be executed for the removed game object.
* If necessary, control should transfer to the game loop.
* @param go The GameObject to be removed
*/
public void remove(GameObject go)
Таким образом, если объект пытается удалить себя внутри события обновления, управление должно перейти обратно к игровому движку:
public void updateEvent() {
//object's update event
remove(this);
System.out.println("Should never reach here!");
}
Вот что у меня такдалеко.Это работает, но чем больше я читаю об использовании исключений для управления потоком, тем меньше мне это нравится, поэтому я хочу посмотреть, есть ли альтернативы.
Метод удаления
<code>public void remove(GameObject go) {
//add to removedList
//flag as removed
//throw an exception if removing self from inside an updateEvent
}
Игровой цикл
<code>for(GameObject go : objectList) {
try {
if (!go.removed) {
go.updateEvent();
} else {
//object is scheduled to be removed, do nothing
}
} catch(ObjectRemovedException e) {
//control has been transferred back to the game loop
//no need to do anything here
}
}
// now remove the objects that are in removedList from objectList
2 вопроса:
Я прав?в предположении, что единственный способ реализовать часть метода remove-right-сразу, как описано выше, состоит в том, чтобы вызвать пользовательское исключение и перехватить его в игровом цикле?(Я знаю, использование исключений для управления потоком похоже на goto, что плохо. Я просто не могу придумать другой способ сделать то, что я хочу!)
Для удаления изСам список, можно , можно , чтобы один объект мог удалить объект, находящийся ниже в списке.В настоящее время я проверяю флаг удаления перед выполнением любого кода, и в конце каждого прохода удаляю объекты, чтобы избежать одновременной модификации.Есть ли лучший, желательно мгновенный / не опросный способ сделать это?
[Редактировать] После прочтения ваших ответов, я думаю, что я изменю методспецификации.Поведение мгновенного удаления - это то, к чему я привык работать в другом движке, но вы правы, оно не совсем соответствует тому, как работает Java.Пришло время попытаться обернуть мою голову немного другим способом мышления!