FlappyBird——byCocos
我的Cocos2d-x的第一个游戏
这里是游戏场景的部分图片:




学习Cocos2d-x后做的第一个游戏后的体会:
一:关于Cocos2d-x的内存管理机制:
它是计数管理的,拥有一个可以自动释放内存的内存池,这个机制在很大程度上方便了我的编写程序,可是对于初学者来说的我,这样的机制也给我带来了不少的麻烦!!!
首先是指针的问题,记得编写龙的时候,对的,这里的Bird就是龙,用Cocos怎么能没有骨骼动画,我把spine的那条龙拿来当作Bird了,我在龙的 .h 文件里用了
Dragon* skeletonNode;
这样的代码来代表这一条龙,可是每当我关闭进程时,它都会报错,每次关闭叮咚的一声,我就会不爽好一阵,调了好久的代码,发现是内存池机制搞的,当我的进程结束,Director类把当前
的场景资源内存都释放了,因为场景在创建时也被放进了内存池,所以导致我的 skeletonNode 变成野指针,当系统释放它时就会引起崩溃,ps:使用该指针在场景里面实例化了一个类,并且
没有 retain();
二:场景切换引发的问题:
其实和是问题是一样的,先上我解决这个错误的代码趴,
void bar::set_NULL()
{
now.clear();
Score = 0;
x = LabelTTF::create("0", "GameFont.ttf", 30);
x->setPosition(500, 40);
}
bar这个类就是FlappyBird里面的墙了,它也是用spine做出来的,只不过只有一些坍塌的简单动作,切换场景我的 x 也会被自动释放,该指针指向的地址就无效了,所以每次进入游戏都要把它初始化一下;
三:单例模式的使用
使用了bar这个类之后我又遇到了一个十分尴尬的情况,那就是游戏的场景类怎么操控bar类Create出来的实例呢,例如让bar移动等,其实可以在游戏场景类中使用bar的实例指针,bar有几个就使用几个,
可是这样的话管理它们变得十分繁琐,便且这些指针还有逐一使用 Retain() 函数,析构函数又要逐一 Release() ,这与Cocos2d-x的内存池的设计理念就相悖了,所以单例模式就出来拯救了我这一尴尬
境况,所以bar的单例,再用 map 映射它们的实例,析构函数也只要将 map Claer 即可,下面贴上基础单例代码,网上的懒汉式,饿汉式,还不太懂,甚至之前我都不知道单例模式有什么用;
bar* bar::getInstance() { if (_instance == nullptr||!_instance->x) { _instance = new (std::nothrow)bar; _instance->init(); } return _instance; }
当然了 _instance 是静态的了;
四:闭包函数
我对这个闭包函数的理解不是很透彻,为什么这么说嘞,这又得从我解决的一个问题说起,游戏的对话框美丑与玩家的体验的关系当然是越漂亮的对话框玩家题意越好了,所以我又怎么可以使用Cocos自带
的对话框鸭,于是我自己写了个对话框,大概长这样,
上传后变模糊了,不过还是能看清的,别看只是个对话框,差点就因为它的闭包自闭了就;
continue_Btn->addClickEventListener([this](Ref* ref) { if (continueFunc != nullptr) continueFunc(); }); end_gameBtn->addClickEventListener([this](Ref* ref) { if (endGamefunc != nullptr) endGamefunc(); }); void BDMessageBox::registerCallback(std::function<void()>continueCallback, std::function<void()> endgameCallback) { continueFunc = continueCallback; endGamefunc = endgameCallback; }
两个闭包函数从外部函数传进来,两个函数指针指向他们用来以后的执行,哈哈,真好,可惜事与愿违,
stop_Btn->addClickEventListener([=](Ref* ref) { unschedule(schedule_selector(HelloWorld::tiemer_hander)); auto on = stopMessageBox::create(); on->to = this; on->registerCallback ([=]() { on->to->schedule(schedule_selector(HelloWorld::tiemer_hander), 0); on->removeFromParent(); }, [=]() { //on->to->schedule(schedule_selector(HelloWorld::tiemer_hander), 0); on->removeFromParent(); auto tran = TransitionTurnOffTiles::create(2, Bg::create_Scene()); Director::getInstance()->replaceScene(tran); }); this->addChild(on, 12); });
看到 on->to = this; 了吗??这就是重点,每次我使用闭包函数传进来的 this对象 ,他总是报错,该指针为 0xfffffffffff ,这就是我不懂闭包函数的原因,this 进来了呀,错哪了???不过机智的我用机智
的方法解决了它,使用 to 变量记录 this;
五:Spine动画的制作
这个软件太好玩了,可以做出好多有趣的动作,要注意的是 root 骨骼千万要显示,要不然没有办法打骨骼,谁能想到我在这里卡了整整两天,暴汗。。。
还有就是要把图片放入骨骼槽里面,要不然你动骨骼图片是不会动的,想想我第一次好不容易打好骨骼,然后进入 animation界面 ,怎么不动??破解版的坏了???,为什么只有骨骼动,我的图片不动
甭提多蠢了,哇哇哇哇~~~;
还有就是动作的切换,我想让他什么动作都不做在程序里面会把它的 timescale 设置为零,切换动作当然就是 addanimation喽!!!
六:关于游戏的调度
我的游戏暂停与继续就是把简单地把场景的 updata 函数关了,现在对Cocos不太了解,这样的暂停凑合着也可以用;
七:关于游戏人物的技能
技能,技能。。。技术不够,不会做素材~~~~~

浙公网安备 33010602011771号