cocos自学笔记-酷跑demo(下)

来源:互联网 发布:linux 启动ntp客户端 编辑:程序博客网 时间:2024/04/28 04:57
最近感觉Cocos很好玩,所以自己弄来玩玩。
其中部分资源及概念来源于各种书籍教程及互联网。
自学笔记仅记录自己操作及实践的过程并分享。
因本人水平有限,不保证内容的正确性。
如有错误或侵犯,实属意外,请联系我修改或删除。


上次拆了酷跑demo,这次自己写试试。


1、整理酷跑中出现的东西如下:

参与到游戏逻辑的有主角,怪兽和金币。怪兽和金币是通过一个序列产生。

场景布局有完全不动的背景图片,和一个一直在移动的地图。

然后有一个一直在显示金币状态和暂停按钮的json。


2 、Element

新建一个Element类作为基类,提供精灵初始化、碰撞检测和一个事件响应接口

通过cocos提供的AABB实现碰撞检测如下:

    bool rectElement(Element *element)

    {

        returnsprite->getAABB().intersects(element->sprite->getAABB());

    }

并提供一个响应碰撞后续处理的接口

    bool rectElement(Element *element)

    {

        returnsprite->getAABB().intersects(element->sprite->getAABB());

    }


3、SceneState

新建一个SceneState类,用来载入和显示金币及暂停的状态如下:

    staticint gold;

    staticcocos2d::ui::TextAtlas* stateGoldText;

并提供一个初始化的成员函数和一个刷新的成员函数

void initStateBar(cocos2d::Layer *layer,int cam);

void UpdateStateBar();


4、Coin、Monster、SceneMap

让Coin、Monster、SceneMap继承Element,并各自实现自己的精灵载入和事件响应。

因为Coin、Monster、SceneMap都用Action实现一直不停朝一个方向运动。

于是偷个懒,让这2个类再继承Action并实现

    virtualbool isDone()const;

    virtualvoid step(float time);

金币每次被玩家碰撞都会触发金币增长,于是让Coin再继承SceneState,响应碰撞时,调用父类SceneState的UpdateStateBar();刷新分数


5、Hatchery

Hatchery类提供怪物、金币产生时的序列,其实就是简单的对vector的封装。


6、Player、Move3D

Player继承自Element,实现自己的精灵载入和触摸事件响应,以及碰撞的响应。Move3D继承自ActionInterval实现player的运动。


7、MainLayer

包含以下成员

private:

    Hatchery hatchery;

    Player player;

    SceneState sceneState;

    cocos2d::Vec2 touch_begin_pos;

    cocos2d::Vec2 touch_end_pos;

然后将player、sceneState添加到自己的Layer中并设定相应的相机。
加入触摸响应和场景刷新。

onTouchBegan时记录touch_begin_pos,onTouchEnded时用touch_end_pos - touch_begin_pos后调用player的updateEvent来处理触摸移动。

MainLayer::upDateScene(float dt)

中如果player.alive就根据时间和hatchery创建新的Coin、Monster、SceneMap加入场景。

对于Coin、Monster创建时,调用addRectElement((Element*)&player)。将player加入到碰撞检测列表。

如果!player.alive就弹出json的restart,清理场景切换场景。

8、运行+调试
游戏正常然而SceneState依然会消失。。难过
最后发现这个状态栏被加入了MainLayer,MainLayer又在一开始设置了CameraFlag::USER2
CameraFlag::USER2下这个状态栏必然不能正常显示。

而一开始SceneState没有加入到CameraFlag::USER2时就可以显示,因为被默认加入了CameraFlag::DEFAULT

于是干掉MainLayer的setCameraMask。之后一切正常。

最后使用Instruments检测内存泄漏,一切正常。


9、总结

setCameraMask只对当前起作用,当需要多个Camera,而且都绑在一个Layer上时,给Layer设置CameraMask是自己找不愉快。

要么多个Layer各自对映Camera,最后一口气加完。

要么每加一个节点就给这个节点设置一个CameraMask。

游戏一开始的1s左右有些卡,很不爽。Instruments中发现最开始内存是一瞬间上升的。

也就是说,读取文件,创建精灵最好还是尽量分开弄,不要一口气加载。

要不然就让游戏一开始显示一个loading界面,多线程加载完后再开始跑。

最后感觉用Cocos直接上手写个例子并不难,但是想熟练用好,写出稳定高效的游戏,还是要仔细看api,看源码,和多敲多练。

于是就顺便给自己再挖个坑,先做一个原创的3d小游戏,然后再看设计模式方面的书,再重构代码。

祝我好运微笑



0 0
原创粉丝点击