Java流控制问题

问题描述 投票:0回答:4

我正在编写一个简单的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!"); }

这是我到目前为止的内容。它可以工作,但是我对使用异常进行流控制的了解越少,我就越不喜欢它,所以我想看看是否有替代方法。

删除方法

public void remove(GameObject go) { //add to removedList //flag as removed //throw an exception if removing self from inside an updateEvent }

游戏循环

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个问题:

  1. 我是正确的,假设实现上述remove方法的stop-right-away部分的唯一方法是抛出一个自定义异常并将其捕获到游戏循环中? (我知道,使用异常进行流控制就像goto一样,这很糟糕。我只是想不出另一种方法来做我想要的!)

  2. 对于从列表本身中删除,

  3. 一个对象可以删除列表中更远的对象。目前,我正在执行任何代码之前检查已删除的标志,并且在每次遍历结束时都在删除对象以避免并发修改。有没有更好的方法,最好是即时/非轮询方法?

    [编辑]

阅读您的答案后,我想我将更改方法规范。我已经习惯在其他引擎上使用即时删除行为,但是您是对的,它与Java的工作方式并不完全匹配。是时候抽出头来绕过稍微不同的思维方式了!
我正在编写一个简单的2D游戏引擎。我已经决定了引擎的工作方式:它将由包含“事件”的对象组成,这些事件将在适当的时候触发我的主游戏循环。 A ...
java exception iterator control-flow conceptual
4个回答
1
投票
为什么不简单地返回,即

2
投票
我同意,异常方法是根据您的规范实施remove方法的最佳方法。

1
投票
为什么不只是:

1
投票
@@ jball的答案很好-+1。
© www.soinside.com 2019 - 2024. All rights reserved.