Sunny Doll 开发日志 2

Posted by SlothSimon's Skytree on December 2, 2016

完成工作

  1. 人物沿坡道移动
  2. 状态机
  3. 完整的五个关卡和两个结局

坡道移动的bug

BUG:

  • 无法沿坡运动
  • 无法停留在坡道上(受重力向下)
  • 若给坡道设置足够停留在坡道上的摩擦系数又会导致无法上坡

解决方案:

  1. getForce获取受力方向,然后加上切向加速度
    • getForce获取的力为0,无法得到受力方向,invalid
  2. 查资料后,setSurfaceVelocity
    • valid,但是会反向运动或者开始运动后无法停止发生漂移等。 2.1. 漂移的原因:忘记在停止运动的函数中设置surface velocity为0,仅仅设置velocity为0是无用的。 2.2. 反向运动:摩擦力反向 2.3. 无法上坡:上坡需要坡道摩擦系数>1

参考资料:

Using surface velocity to move bodies 有摩擦力才能计算表面速度 Propelling a vehicle up a slope 上坡需要坡道摩擦系数>1 chipmunk中文手册

状态机

好的状态机教程很多就不多提了。虽然最终通过EventDispatcher完成状态机,但是实际用的时候并没有感觉到状态机的必要性和便利性,也许是我的打开方式不对?

参考资料:

cocos2d-x 游戏开发之有限状态机(FSM) (四) 【木头Cocos2d-x 025】状态机篇(第04章) –事件驱动,你想象不到的强大(没有update的状态机) cocos2dx3.2 (12)——新事件分发机制 cocos2dx3.2 (21)——观察者模式NotificationCenter

枚举类型

状态机本来想用枚举类型,但是尝试过后很不方便,即使在stackoverflow上查到了一些枚举和字符串互相转换的方法。

参考资料

Is there a simple way to convert C++ enum to string? enum to string in modern C++ and future C++17 / C++20 C++枚举 #define的用法盘点

剧情动画

本想在EventDispatcher中把回调函数作为usercontent传到状态机处理函数中,但是明明指针指向的位置没变,但是指针指向的内容已被清空,尤其是回调嵌套回调难以追溯问题到底出在哪里,直觉也不是个好的解决方案。 最终采取了cocos2dx 几个精灵按照顺序播放动画解决方法的做法。

火焰粒子

调试粒子系统还是用ParticleDesigner方便,版本老一点也没关系(好吧!其实是买不起最新版本!)。

人物跟随

人物本身也没有特别复杂的动作,设置个scheduler每秒获取被跟随人物的位置然后移动即可。

一些报错总结

  1. exc_bad_access 通常都是被释放的内存又被使用的缘故,比如有的Node没有addChild到某个父结点下,但是保存了指针,函数结束后该Node被释放,但指针仍然在之后被使用了。 新建类或者new指针后千万不能忘了autorelease或者CC_SAFE_DELETEC++不好好管理指针简直是痛

  2. linker command failed with exit code 1 参考iOS开发中Xcode编译错误 linker command failed with exit code 1 (use -v to see invocation) 的解决办法,里面总结很多情况。 个人情况是constants.h里包含了函数实现,且该头文件被多次包含导致,之后又去查了些头文件包含原则

  3. string s = null 会报错 必须初始化为“” 具体报错信息当时没有记录下来,貌似也不是直接指明原因,找了好一会才发现是string初始化的问题。

  4. Command /usr/bin/codesign failed with exit code 1 这个问题似乎是在更新Xcode后才出现的问题,添加新的素材文件或者替换素材文件后run就会报这样的错,用terminal打开到素材目录下然后运行xattr -c *即可。 参考Xcode 8 can’t archive “Command /usr/bin/codesign failed with exit code 1”

  5. Expected ';' after top level declarator 又是一个更新后出现的问题……最后发现是自动补全的参数是占位符而不是参数列表。 参考Mistakes occurred when using Xcode to compile C++ program

其他

上篇开发日志写到了音效、音乐渐变的代码,但是其实找图书馆借了本cocos2d的书一看,发现其实cocos2d本身提供音乐渐变的函数CDLongAudioSourceFader

TODO

  1. Bug: 气球可以重复点击获取
  2. Bug: 第五关在点击气球后点击移动会造成卡死,人物无法移动
  3. Art: 晴天娃娃入水无法移动的动画
  4. Art: 小女孩立绘