【cocos2dx 3.2】Flappy Bird开发超详细讲解(五)游戏的总逻辑控制
2014-11-19 18:56
417 查看
本文可以任意转载,转载请出名出处。
正常来说,我们通过上面的例子,点击开始游戏那个按钮的时候我们就可以开始游戏了。所以我们要写一个正式开始游戏的逻辑,那就是我们的大管家GameLayer。
这个层可不简单,它负责我们整个游戏的逻辑,是名副其实的东厂总管,其他小角色都得由他控制。
好了,我们看代码吧:
//GameLayer.h
//GameLayer.cpp
这里要注意的是,这里我们创建的场景和之前不一样,这里我们创建的是一个物理世界,小鸟要收到重力的作用,会和其他东西碰撞等等,这些都是物理属性,所以在这里要特别留意。
还有就是我们之前创建的草地层没有物理属性,这里我们修改一下草地层,给它添上物理属性,详见代码如下(这次我把整个都贴出来了,下次有修改我就只贴修改部分,节省一下版面,还有就是大家如果有什么不清楚的地方可以下载源码下来看,我每次都会附上每期对应的源码):
//LandLayer.cpp
这里要特别注意的一点是,由于我们添加了物理属性,草地的锚点(默认是中心点,之前我们设置为ZERO,即左小角)现在会恢复成中心点,所以我们改一下坐标设置,,当然,下面定时器里草地是否滚出屏幕的判断条件也要改一下,如上代码中所示。
记得在点击按钮的响应函数那边修改一下哈
我们预览一下成果吧
好了,这期就到这里了,每期呢我尽量会在代码里多注释点
本期的源码下载地址链接: http://pan.baidu.com/s/1qWjsW9m 密码: 64y5
正常来说,我们通过上面的例子,点击开始游戏那个按钮的时候我们就可以开始游戏了。所以我们要写一个正式开始游戏的逻辑,那就是我们的大管家GameLayer。
这个层可不简单,它负责我们整个游戏的逻辑,是名副其实的东厂总管,其他小角色都得由他控制。
好了,我们看代码吧:
//GameLayer.h
/*我们这个类是我们的总管,控制游戏的逻辑。 其他的东西各个部件,像小鸟啊,管道啊,草地啊,我们都可以各自封装成各自的类,然后添加到这里来,然后由这个总管控制它们。 */ #ifndef _GAMELAYER_H_ #define _GAMELAYER_H_ #include "cocos2d.h" USING_NS_CC; class GameLayer:public Layer { public: static Scene* createScene(); virtual bool init(); CREATE_FUNC(GameLayer); }; #endif
//GameLayer.cpp
#include "GameLayer.h" #include "define.h" #include "LandLayer.h" Scene* GameLayer::createScene() { //注意这里和平时创建的场景不一样,这里我们创建的是一个物理世界 auto scene = Scene::createWithPhysics(); scene->getPhysicsWorld()->setGravity(GRAVITY); auto layer = GameLayer::create(); scene->addChild(layer); return scene; } bool GameLayer::init() { if (!Layer::init()) { return false; } auto winSize = Director::getInstance()->getWinSize(); //创建背景图片 auto bg = Sprite::createWithSpriteFrameName("bg_day.png"); bg->setPosition(Point(winSize / 2)); this->addChild(bg); //添加草地层 auto land = LandLayer::create(); this->addChild(land); return true; }
这里要注意的是,这里我们创建的场景和之前不一样,这里我们创建的是一个物理世界,小鸟要收到重力的作用,会和其他东西碰撞等等,这些都是物理属性,所以在这里要特别留意。
还有就是我们之前创建的草地层没有物理属性,这里我们修改一下草地层,给它添上物理属性,详见代码如下(这次我把整个都贴出来了,下次有修改我就只贴修改部分,节省一下版面,还有就是大家如果有什么不清楚的地方可以下载源码下来看,我每次都会附上每期对应的源码):
//LandLayer.cpp
#include "LandLayer.h" #include "define.h" Scene* LandLayer::createScene() { auto scene = Scene::create(); auto layer = LandLayer::create(); scene->addChild(layer); return scene; } bool LandLayer::init() { if (!Layer::init()) { return false; } auto winSize = Director::getInstance()->getWinSize(); //=================================================================================================== //添加草地一的图片和背景位置,setAliasTexParameters是为了防止两块草地滚动起来的时候出现黑边 land1 = Sprite::createWithSpriteFrameName("land.png"); land1->setPosition(Point(land1->getContentSize().width / 2, land1->getContentSize().height / 2)); land1->getTexture()->setAliasTexParameters(); //给草地添加物理属性 //添加身体 auto body1 = PhysicsBody::create(); //添加外壳 auto shape1 = PhysicsShapeBox::create(land1->getContentSize()); //外壳添加到身体,好难听。。。那就换一个说法,给身体披上衣服 body1->addShape(shape1); //设置静态,使它不受碰撞力的作用 body1->setDynamic(false); //设置不受重力的作用 body1->setGravityEnable(false); //这三个暂时不知道,就先照搬吧,我也是原教程搬过来的 body1->setCategoryBitmask(1); body1->setCollisionBitmask(-1); body1->setContactTestBitmask(-1); body1->setLinearDamping(0.7f); //给我们的草地绑上身体属性 land1->setPhysicsBody(body1); this->addChild(land1); log("land1--point(%f,%f)", land1->getPositionX(), land1->getPositionY()); //======================================================================================================== //添加草地二的图片和背景位置,草地二的位置是在草地一的右边,这边减2是防止两块草地之间出现空隙 land2 = Sprite::createWithSpriteFrameName("land.png"); land2->setPosition(Point(land1->getPositionX()+land1->getContentSize().width-2,land1->getPositionY())); land2->getTexture()->setAliasTexParameters(); //给草地二添加物理属性,同草地一,这里就不详解了 auto body2 = PhysicsBody::create(); auto shape2 = PhysicsShapeBox::create(land2->getContentSize()); body2->addShape(shape2); body2->setDynamic(false); body2->setGravityEnable(false); body2->setCategoryBitmask(1); body2->setCollisionBitmask(-1); body2->setContactTestBitmask(-1); body2->setLinearDamping(0.7f); land2->setPhysicsBody(body2); this->addChild(land2); log("land2--point(%f,%f)", land2->getPositionX(), land2->getPositionY()); //添加定时器,调用草地滚动的函数,让草地滚动起来吧! this->schedule(schedule_selector(LandLayer::landMove)); return true; } //草地滚动函数 void LandLayer::landMove(float) { //通过不断改变草地x轴的位置来实现草地滚动 land1->setPositionX(land1->getPositionX() - LAND_OFFSET); land2->setPositionX(land2->getPositionX() - LAND_OFFSET); //判断条件,当草地一滚出屏幕的时候让草地一接在草地二后面,草地二同理 if (land1->getPositionX()==-land1->getContentSize().width/2) { land1->setPositionX(land2->getPositionX()+land2->getContentSize().width-2); } else if (land2->getPositionX()==-land2->getContentSize().width/2) { land2->setPositionX(land1->getPositionX() + land1->getContentSize().width - 2); } }
这里要特别注意的一点是,由于我们添加了物理属性,草地的锚点(默认是中心点,之前我们设置为ZERO,即左小角)现在会恢复成中心点,所以我们改一下坐标设置,,当然,下面定时器里草地是否滚出屏幕的判断条件也要改一下,如上代码中所示。
记得在点击按钮的响应函数那边修改一下哈
void StartGame::gameStart() { //转场特效,从右往左推进 Director::getInstance()->replaceScene(TransitionSlideInR::create(CHANGESCENE_TIME, GameLayer::createScene())); }
我们预览一下成果吧
好了,这期就到这里了,每期呢我尽量会在代码里多注释点
本期的源码下载地址链接: http://pan.baidu.com/s/1qWjsW9m 密码: 64y5
相关文章推荐
- 【cocos2dx 3.2】Flappy Bird开发超详细讲解(三)预加载场景和开始场景
- 【cocos2dx 3.2】Flappy Bird开发超详细讲解(二)素材准备和屏幕自适应分辨率
- 【cocos2dx 3.2】Flappy Bird开发超详细讲解(一)准备工作
- 【cocos2dx 3.2】Flappy Bird开发超详细讲解(四)让地图滚动起来吧
- 【cocos2dx 3.2】Flappy Bird开发超详细讲解(六)主角小鸟的创建
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- unity3d开发flappy bird之游戏逻辑控制(二)
- 利用cocos2dx 3.2开发消灭星星(八)游戏的结束判断与数据控制
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 【iphone游戏开发】iphone-Cocos2d游戏开发之三:精灵表的详细讲解(二)小鸟眨眼睛
- cocos2d游戏开发 精灵表的详细讲解和Zwoptex工具
- 【iphone游戏开发】iphone-Cocos2d游戏开发之三:精灵表的详细讲解(二)小鸟眨眼睛
- [iphone游戏开发]iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- 【Cocos2d-X(2.x) 游戏开发系列之一】cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解!在2.x版CCFileData类被去除等