本文是 Android cocos2d 弹弓游戏 Catapult 源代码 的后续


参考下面两篇文章, 完成了较为完整的弹弓游戏

http://mssyy2010.blog.51cto.com/4595971/856611

http://www.raywenderlich.com/4787/how-to-make-a-catapult-shooting-game-with-cocos2d-and-box2d-part-2


现在把源代码提供给大家, 可以从下面的 link 下载

https://github.com/PaynePan/share_src/archive/master.zip


相对前一个版本改进如下

1) 增加了 MyContactListener 进行碰撞监听

2) 增加了粒子系统, 作为碰撞的动画

3) 增加了 GameOverScene, 游戏结束后用户可以重新开始或者退出


要点

加入 Scene 的 Node 不用delete

加入到 HelloWorld 中的 Node ( 就是用 this->addChild(sprite, 0) ), 不需要析构

Cocos2d 有机制自动析构这些对象


b2World 对象需delete

我们创建了 m_world = new b2World(gravity);, 应该delete它

m_world 中的 entity, 就是用下面的方法创建的实体, b2World 有机制自己去析构

m_world->CreateBody()

m_world->CreateJoint()

但不是b2World 中的实体, 比如 contactListener 需要析构


作为Delegate的 Scence 需要remove

当Scene 析构的时候,如果 Scene 是 TouchDelegate, 要把它 remove 掉

CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);

否则当 Scence 都不存在, Director 还会调用它的方法,引起 crash


析构的位置

当调用replaceScene 的时候

CCDirector::sharedDirector()->replaceScene(GameOver::scene());

下面的函数void HelloWorld::onExit() 被触发

void HelloWorld::onExit() {delete m_world;delete contactListener;CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);}

我选择这个位置进行相关对象的析构, 程序跑起来还没发现问题.


更多相关文章

  1. Android(安卓)对话框中的进度条 ProgressDialog
  2. 【COCOS2DX-ANDROID-游戏开发之二三】 界面中嵌入Android的WebVi
  3. android intent 传递list或者对象
  4. Android源码学习之五-Android的IPC机制
  5. Android之HttpURLConnection小结
  6. Android之使用PackageManager取得程序的包名、图标等
  7. android jetpack 简单livedata和viewmodel
  8. Android剪切板用法
  9. Android(安卓)Fragment 优化与切换

随机推荐

  1. 策略模式原来就这么简单!
  2. Docker入门为什么可以这么简单?
  3. JAVA中的“抽象接口”
  4. 三分钟学会门面模式!
  5. 海康网络摄像机SDK Linux对接
  6. 2018再见,2019你好
  7. 国外版《从入门到放弃》大全,脑洞无极限!
  8. 使用Python开发鸿蒙应用--2021.01.07直播
  9. SpringBoot自动配置原理!
  10. 2.19 使用vSphere Client端的USB设备详解