Cocos2dx 3.2 横版过关游戏Brave学习笔记(七)
来源:互联网 发布:淘宝急需开通直播 编辑:程序博客网 时间:2024/06/05 20:38
这次还是按照原版教程来,补上游戏开始界面,过关界面,画面滚动等等。
感觉MainScene::init里的代码有点乱,所以先整理一下。
bool MainScene::init(){ if ( !Layer::init() ) { return false; } //load frames into cacheSpriteFrameCache::getInstance()->addSpriteFramesWithFile("image/role.plist","image/role.pvr.ccz");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("image/ui.plist","image/ui.pvr.ccz");addRoles();addUI();addListener();addObserver(); return true;}
看上去好多了,运行了一下发现角色被背景挡住了,还是设置一下zorder好了。
另外发现可以用Director的方法实现暂停。
游戏开始界面
新建一个scene,名叫StartScene,并将AppDelegate.cpp中的MainScene改为StartScene。
#ifndef __StartScene__#define __StartScene__#include "cocos2d.h"USING_NS_CC;class StartScene : public Layer{public:bool init();static Scene* createScene();void onStart(Ref* obj);CREATE_FUNC(StartScene);};#endif
可以在这里载入缓存,添加按钮并响应。
#include "StartScene.h"#include "MainScene.h"#include "VisibleRect.h"#include "CustomTool.h"bool StartScene::init(){if(!Layer::init())return false;log("StartLayer::init");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("image/role.plist","image/role.pvr.ccz");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("image/ui.plist","image/ui.pvr.ccz");auto background = Sprite::create("image/start-bg.jpg");background->setPosition(VisibleRect::center());this->addChild(background);auto item = CustomTool::createMenuItemImage("start1.png", "start2.png", CC_CALLBACK_1(StartScene::onStart,this));auto menu = Menu::createWithItem(item);this->addChild(menu);return true;}Scene* StartScene::createScene(){ auto scene = Scene::create(); auto layer = StartScene::create(); scene->addChild(layer); return scene;}void StartScene::onStart(Ref* obj){log("StartLayer::onStart");auto scene = MainScene::createScene();Director::getInstance()->replaceScene(scene);}
另外使原来PauseLayer中的Home按钮实现切换到StartScene的作用:
void PauseLayer::home(Ref* obj){_eventDispatcher->removeEventListener(_listener);auto main = (MainScene*)this->getParent();main->onTouchResume();this->removeFromParentAndCleanup(true);auto start = StartScene::createScene();Director::getInstance()->replaceScene(start);}
运行了一下,出错了,貌似忘了把listener什么的在onExit里注销掉。还忘了在点击home之后也继续一下,否则进入关卡后还是暂停状态。当然这些错误没有白犯,多犯几次就能熟练应对了。
过关
下面加入过场,即敌人死光后,会出现一个GO>>>的提示,点击就会进入下个小关,有新的敌人,消灭后还可以继续切换……建立一个容器容纳敌人,每死一个就将其移除,死光则显示Go图标。
在Player中,敌人死亡,发送一个消息通知MainScene.,在状态机回调函数onDead的回调函数func中:
if(_type != PLAYER)NotificationCenter::getInstance()->postNotification("enemyDead",this);
MainScene接收消息
NotificationCenter::getInstance()->addObserver(this, callfuncO_selector(MainScene::enemyDead),"enemyDead",nullptr);
收到后会做出反应:
void MainScene::enemyDead(Ref* obj){auto player= (Player*)obj;_enemys.eraseObject(player,true);log("onEnemyDead:%d", _enemys.size());if(_enemys.size() == 0)showNextLevelItem();}
在addUI里加入这个GO图标:
auto goItem = CustomTool::createMenuItemImage("go.png", "go.png", CC_CALLBACK_1(MainScene::gotoNextLevel,this));goItem->setVisible(false);goItem->setTag(2);goItem->setPosition(VisibleRect::right().x - goItem->getContentSize().width/2, VisibleRect::center().y);_menu = Menu::create(pauseItem, debugItem, goItem, NULL);_menu->setPosition(0,0);this->addChild(_menu, 20);
并加入回调函数:
void MainScene::gotoNextLevel(Ref* obj){auto goItem = this->_menu->getChildByTag(2);goItem->setVisible(false);goItem->stopAllActions();_background->move("left",_player);}
要进行背景滚动,实现一个Background类
#ifndef __Background__#define __Background__#include "cocos2d.h"USING_NS_CC;class Background : public Layer{public:bool init();CREATE_FUNC(Background);void move(const char* direction, Sprite* withSprite);void onMoveEnd();private:bool _isMoving;Sprite* _spriteA;Sprite* _spriteB;};#endif
滚动完毕,发消息通知MainScene再次放置怪物。
发送消息:Background::onMoveEnd()
NotificationCenter::getInstance()->postNotification("backgroundMoveEnd");
接受消息:MainScene
NotificationCenter::getInstance()->addObserver(this, callfuncO_selector(MainScene::backgroundMoveEnd),"backgroundMoveEnd",nullptr);
响应:
void MainScene::backgroundMoveEnd(Ref* obj){addEnemy();log("adding enemy...");}
现在原教程里的功能就基本上实现了。
然后提交了一下, 名称为"Note 7 Finish Basic Tutorial"
https://github.com/douxt/Brave_cpp
0 0
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(七)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(一)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(二)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(三)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(四)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(五)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(六)
- 横版过关游戏源码
- 横版过关游戏开发-游戏流程
- cocos2dx游戏开发学习笔记(一)
- cocos2dx游戏开发学习笔记(二)
- cocos2dx游戏开发学习笔记(三)
- 横版过关游戏开发1
- 横版过关游戏开发-人物控制
- 横版过关游戏开发-碰撞检测
- 横版过关游戏开发-图像处理
- 2d横版过关游戏
- cocos2dx游戏开发学习笔记(四)之Hello World
- GoF之依赖倒转原则
- java 字符串中去除特定的字符
- poj 1185
- 【产品经理】沟通篇之如何与前端沟通
- jQuery属性,验证码失效,动态内容加载
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(七)
- Volley分析(1)
- 最短路径算法(java实现)
- 华为机试题
- VS2013解决html文件无法打开设计视图
- android lint 安全分析
- arm-6410友善之臂 uboot linux内核.文件系统移植
- c++二叉树的非递归建立和遍历
- java 配置及Eclipse安装