AndEngine如何删除sprite

回忆过去的事情,尤其是在很多不连续的时间中,要很好的描述清楚过去发生的事不是一件很简单的事情,好吧,我只是想到什么就说什么,现在说一个我在使用AndEngine中遇到的一个问题
很多情况下需要删除一个sprite,比如爆炸的动画效果结束之后要从场景中删去,或者物体被摧毁后要从画面中消失等等

在AndEngine中是很简单的一句

scene.detachChild(sprite);

如果你的游戏不是很激烈的话,那这样写基本上是没有任何问题的,但是,我在测试的时候总会出现一个问题,如果游戏的过程比较激烈的话,可能在非常短的时间之内会不断的添加/删除很多个sprite,这样就会有相当大的几率出现一个索引超出序列的exception

这个问题我之前已经修复了,而且也没有保存下来当时出错的stack trace,所以很抱歉不能提供在这里,总之是一个相当普通的java 索引超出序列的exception

很多时候问题出现的都比较奇怪,但在解决之后总会恍然大悟。经过多次测试和debug,终于发现了原因
AndEngine的运行机制是有两个核心线程,一个更新线程,一个处理线程,更新线程有一个while循环会不断的遍历当前所有可见元素(包括background, sprite, animate, particle)并将元素实时画在屏幕上,处理线程则负责进行运算操作,如果在处理线程中执行删除sprite的语句,而同时更新线程需要更新元素时,就会有索引超出序列的exception出现

所以,安全的做法是在更新线程做删除操作

this.runOnUpdateThread(new Runnable() {
@Override
public void run() {

scene.detachChild(Sprite);
}
});


在AndEngine最新的实例中也有说明
/*Removing entities can only be done safely on the UpdateThread.
*Doing it while updating/drawing can
*cause an exception with a suddenly missing entity.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值