cocos2d-x-3.0 alpha1与C++11练习五:飞镖忍者,如何检测碰撞(3)
来源:未知 责任编辑:责任编辑 发表时间:2014-01-20 07:51 点击:次
p> }
p>
p> if (targetsToDelete->count() > 0) {
p> projectilesToDelete->addObject(projectile);
p> this->removeChild(projectile);
p> }
p> targetsToDelete->release();
p> }
p>
p> CCARRAY_FOREACH(projectilesToDelete, obj2){
p> Sprite *projectile = (Sprite *)obj2;
p> this->removeChild(projectile);
p> _projectiles->removeObject(projectile);
p> }
p>
p> projectilesToDelete->release();
p>}
p> 代码稀松的紧,大意便是两个for循环,依次使用getBoundingBox与intersectsRect检测碰撞。
p>
p> 最后一件事,在init return之前,我们要把update()加入到schedule里让它每帧都能被调用。
p>
p>
p>this->scheduleUpdate();
p>
p>
p>3,代码报错,问题出在哪里
p>编译&运行,程序报错了:
p>
p>
p>
p>_projectiles变量为NULL。
p>
p>在cocos2d-x 3.0中,使用Array::create创建的变量,自动加进了自动释放池,见其源码:
p>
p>
p>Array::create:
p>Array* Array::create()
p>{
p> Array* pArray = new Array();
p>
p> if (pArray && pArray->init())
p> {
p> pArray->autorelease();
p> }
p> else
p> {
p> CC_SAFE_DELETE(pArray);
p> }
p>
p> return pArray;
p>}
p>//---------
p>Object* Object::autorelease(void)
p>{
p> PoolManager::sharedPoolManager()->addObject(this);
p> return this;
p>}
p>答案便在这里,_projectiles与_targets变量,在未派上用场之前,便被自动释放管理器释放了。解决方法,便是在初始化之后,显式调用retain方法,在init中:
p>
p>
p>...
p> this->_targets = Array::create();
p> _targets->retain();
p> this->_projectiles = Array::create();
p> _projectiles->retain();
p>...
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>