android 2D游戏开发,引擎设计(五) 扮演者追加扮演者BUG ConcurrentModificationException
来源:互联网 发布:mysql update语法 编辑:程序博客网 时间:2024/04/27 14:43
如果在遍历一个List的时候向其中添加新元素,java就会抛出ConcurrentModificationException异常。
但是我们需要这个功能。在游戏引擎中非常需要这个功能。例如很多BOSS过了一段时间后身上追加了一件神器,
或者很多飞机设计游戏,航空母舰 增加一台小飞机。
java.util.ConcurrentModificationException BUG产生的原因
解决思路是Actor添加元素,并不会立刻添加进List中
而是等Actor在重新绘制追加新元素
代码示例
public class Actor implements IAct {/** 延迟追加列表 */protected LinkedList<IAct> addList;/** 延迟移除列表 */protected LinkedList<IAct> removeList; /** * 给扮演者添加一个扮演者 * 这个方法不会立刻执行而是在 * 这个方法上draw方法前调用 * @see #safeIterator() * @see #draw(GameCanvas, IAct) */public void addAct(IAct act) {if (act == this) {return;}if (addList == null) {addList = new LinkedList();}Log.e("tag", "" + addList.size());System.out.println("=====" + addList);addList.add(act);}/** * 给扮演者添加一个扮演者 * 这个方法直接运行会不安全 * 产生java.util.ConcurrentModificationException * 这个方法上draw方法前调用 * @see #safeIterator() * @see #draw(GameCanvas, IAct) */private void addActOfTrue(IAct act) {if (childList == null) {childList = new ArrayList ();}// 如果act的容器父类已经存在if (act.getActParent() != null) {// 将它的从它的容器中移除act.getActParent().removeAct(act);}childList.add(act);act.setGameStage(getGameStage());act.setActParent(this);}/** * 给扮演者一次一个扮演者 * 这个方法直接运行会不安全 * 产生java.util.ConcurrentModificationException * 这个方法上draw方法前调用 * @see #safeIterator() * @see #draw(GameCanvas, IAct) */private void removeActOfTrue(IAct act) {if (act == this) {return;}// 添加新元素时可能会造成if (childList == null) {return;} else {// 如果act的容器父类已经存在if (act.getActParent() != null) {// 将它的从它的容器中移除act.getActParent().removeAct(act);}}childList.remove(act);act.setActParent(null);}/** * 给扮演者移除一个扮演者 * 这个方法不会立刻执行而是在 * 这个方法上draw方法前调用 * @see #safeIterator() * @see #draw(GameCanvas, IAct) */public void removeAct(IAct act) {if (removeList == null) {removeList = new LinkedList ();}removeList.add(act);} /*** * 安全迭代 * 该方法在draw方法前调用 * @see Actor#draw(GameCanvas, IAct); */protected final void safeIterator(){if (addList != null) {while (!addList.isEmpty()) {this.addActOfTrue(addList.poll());}addList = null;}if (removeList != null) {while (!removeList.isEmpty()) {this.removeActOfTrue(removeList.poll());}removeList = null;}}/** 绘制当前 */public void draw(GameCanvas canvas, IAct thisAct) {//绘制前将需要添加的扮演导入safeIterator();// 绘制当前造型if (getModel() != null)getModel().drawPlay(canvas, thisAct);// 绘制子扮演者drawChild(canvas);if (this.getScript() != null) {this.getScript().callTimeScript(thisAct.getGameStage(), canvas,this);}};/** 绘制子扮演者 */public void drawChild(GameCanvas canvas) {if (childList != null) {Iterator it = childList.iterator();while (it.hasNext()) {IAct act = it.next();act.draw(canvas, act);}}}
- android 2D游戏开发,引擎设计(五) 扮演者追加扮演者BUG ConcurrentModificationException
- android 2D游戏开发,引擎设计(一) 基本构思
- android 2D游戏开发,引擎设计(二)脚本思考
- android 2D游戏开发,引擎设计(四) 造型类Model的设计。简单进度条
- android 2D游戏开发,引擎设计(三) 实验脚本编写与纸娃娃系统
- android 2D游戏开发,引擎设计(六) 画面平移晃动与平移边界问题
- 2D游戏引擎开发
- Android 2D游戏引擎
- 物流标准化在物流管理中扮演者重要的“角色”
- Android 2D游戏引擎1
- Android 2D游戏引擎Rokon
- 3D游戏引擎系列五
- android 2D游戏开发
- #Android##bug#ConcurrentModificationException
- Android开发_libgdx游戏引擎教程 性能优良的游戏引擎—libgdx (五)
- android游戏开发引擎
- Android 游戏开发引擎
- 3D游戏引擎设计与实现(2)
- Linux rm命令 删除文件夹
- Awk 中变量作用域的问题
- 74个Android开发开源项目汇总<转载>
- C# 异常管理(一)
- VS2010运行速度优化汇总
- android 2D游戏开发,引擎设计(五) 扮演者追加扮演者BUG ConcurrentModificationException
- android资源目录---assets与res/raw区别
- C# winform 窗体间传值
- 孩子日常生活中的18种潜在特长
- 64 bit systems VS. 32 bit systems
- 布局参数的使用
- element.style覆盖样式,使用!improtant解决
- Awk 实例
- js获取滚动条位置:绝对有效