Cocos2d-x开发FlappyBird03-GameScene游戏场景初进入
2016-02-24 14:21
417 查看
尊师重道很重要0-0.。。。非常感谢泰课在线的老师NetFly童鞋,我这篇就是学习他的教程后写的开发日志。
上节记录了加载初始场景,这节就到了游戏场景GameScene。新加场景,所以我们还是先打开项目中的Classes文件夹,创建两个GameScene.h和GameScene.cpp。然后把这两项加载到src中。
一、打开GameScene.h,接下来要做的就是定义一些全局变量;之后再创建一个GameScene类,在类中添加方法和声明变量。这次是整个游戏需要的都添加了进去,代码我就贴到下面记着:
#pragma once //添加一个宏,防止重复编译
#include "cocos2d.h" //添加一个核心引擎库
using namespace cocos2d;
//定义一些全局变量
const int BIRD_RADIUS = 15;//小鸟半径
const int PIPE_HEIGHT = 320;//半根管道长度
const int PIPE_WIDTH = 52;//管道宽度
const int PIPE_SPACE = 100;//上下管道的缝隙
const int PEPE_INTERVAL = 170;//横向两根管道间的距离,计算为:288/2+52/2
const int WAIT_DISTANCE = 380;//等待距离
//枚举
enum GAME_STATUS//游戏状态 准备 开始 结束
{
GAME_READY,
GAME_START,
GAME_OVER
};
//创建一个类GameScene,继承自Layer
class GameScene : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();//声明场景
virtual bool init();//初始化方法
CREATE_FUNC(GameScene); //引擎为每一个节点实现Create()方法而定义的一个宏指令
void update(float dt);//更新方法
void scrollLand(float dt);//地面滚动方法
void setPhysicWord(cocos2d::PhysicsWorld *world);//声明一个游戏中需要的的物理世界
virtual bool onContactBegin(const cocos2d::PhysicsContact& contact);//碰撞检测
virtual bool onTouchBegin(cocos2d::Touch *touch, cocos2d::Event *event);//触摸开始
virtual void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event);//触摸结束
void createPipes();//添加一个创建管道的方法
int getRandomHeight();//管道随机生成一个高度
int gameStart();
int gameOver();
int gameRestart(Ref *sender);
void gamePanelAppear();//界面板块显示
private:
cocos2d::Sprite *bordSprite;//小鸟
cocos2d::RepeatForever *swingAction;//小鸟飞舞动画
cocos2d::Label *scoreLabel;//分数
cocos2d::Sprite *land1, *land2;//地面
cocos2d::Vector<cocos2d::Node*>pipes;//管道,这里用容器装起来
cocos2d::PhysicsWorld *m_physicWorld;//游戏层的物理世界(拥有物理属性的“世界”)
GAME_STATUS gameStatus;//游戏状态
int score, bestScore;//当前分数和最高分数
int touchX; //触摸点横坐标
};
二、当GameScene.h写好后,接下来自然就是GameScene.cpp的代码之旅了。
1、写好头文件和命名空间:
#include "GameScene.h"
#include "SimpleAudioEngine.h"//涉及到音频
USING_NS_CC;//命名空间
using namespace CocosDenshion;//与SimpleAudioEngine有关的命名空间
2、然后开始一步步创建GameScene.h中声明的各个方法了。今天这节就先能够进入游戏界面就算成功,首先创建游戏场景和添加游戏层。
Scene* GameScene::createScene()
{
//创建游戏场景
auto gameScene = Scene::createWithPhysics();//用物理世界初始化场景
gameScene->getPhysicsWorld()->setGravity(Vec2(0, -900));//设置重力场,重力加速度可根据手感调节
//添加主游戏层
auto gameLayer = GameScene::create();
gameLayer->setPhysicWord(gameScene->getPhysicsWorld());//绑定物理世界
gameScene->addChild(gameLayer);
return gameScene;
}
3、之后就是初始化游戏,把有的游戏要素都添加进来。现在只添加场景,LOGO,管道和小鸟
bool GameScene::init()
{
if (!Layer::init())
return false;
Size visibleSize = Director::getInstance()->getVisibleSize();//设置大小和位置
Vec2 visibleOrigin = Director::getInstance()->getVisibleOrigin();
//初始化游戏状态
gameStatus = GAME_READY;
score = 0;
//添加游戏背景
Sprite *background = Sprite::createWithSpriteFrameName("bg.png");//获取game.png图片中的背景图
background->setPosition(visibleOrigin.x + visibleSize.width / 2, visibleOrigin.y + visibleSize.height / 2);
this->addChild(background);
//添加LOGO
auto gameLogo = Sprite::createWithSpriteFrameName("bird_logo.png");
gameLogo->setPosition(visibleOrigin.x + visibleSize.width / 2, visibleOrigin.y + visibleSize.height / 2 + 100);
gameLogo->setName("logo");
this->addChild(gameLogo);
//添加管道
createPipes();
//添加小鸟
birdSprite = Sprite::create();
birdSprite->setPosition(visibleOrigin.x + visibleSize.width / 3, visibleOrigin.y + visibleSize.height / 2);
this->addChild(birdSprite);
//翅膀挥舞动画
auto birdAnim = Animate::create(AnimationCache::getInstance()->animationByName("birdAnimation"));
birdSprite->runAction(RepeatForever::create(birdAnim));
auto up = MoveBy::create(0.4f, Vec2(0, 8));
auto upBack = up->reverse();
if (gameStatus == GAME_READY)
{
swingAction = RepeatForever::create(Sequence::create(up, upBack, NULL));
birdSprite->runAction(swingAction);//上下飞舞动画
}
}
4、游戏场景基本要素填写好之后,就在LoadingScene.cpp的回调函数中添加以下代码:(不要忘了开头要添加#include "GameScene.h"头文件)
//加载完毕,跳转到游戏场景
auto gameScene = GameScene::createScene();
TransitionScene *transition = TransitionScene::create(0.5f, gameScene);
Director::getInstance()->replaceScene(transition);
5、我们再回到GameScene.cpp中,因为在头文件中已经声明了很多方法,所以不创建这些方法是无法运行的。头文件中要么注释掉这些方法,要么.cpp内先添加进去这些方法,如下:
//更新方法
void GameScene::update(float dt)
{
}
//碰撞检测
bool GameScene::onContactBegin(const PhysicsContact& contact)
{
return false;
}
//管道随机生成一个高度
int GameScene::getRandomHeight()
{
return 0;
}
这样把使用到的方法都一一创建,然后启动调试,如果看到以下图片,小鸟在扑哧扑哧飞,则大功告成,本节也就过过过了。最后退出的时候会报错,这是因为我们还没有完善这个游戏场景,不用担心,正常的诶
上节记录了加载初始场景,这节就到了游戏场景GameScene。新加场景,所以我们还是先打开项目中的Classes文件夹,创建两个GameScene.h和GameScene.cpp。然后把这两项加载到src中。
一、打开GameScene.h,接下来要做的就是定义一些全局变量;之后再创建一个GameScene类,在类中添加方法和声明变量。这次是整个游戏需要的都添加了进去,代码我就贴到下面记着:
#pragma once //添加一个宏,防止重复编译
#include "cocos2d.h" //添加一个核心引擎库
using namespace cocos2d;
//定义一些全局变量
const int BIRD_RADIUS = 15;//小鸟半径
const int PIPE_HEIGHT = 320;//半根管道长度
const int PIPE_WIDTH = 52;//管道宽度
const int PIPE_SPACE = 100;//上下管道的缝隙
const int PEPE_INTERVAL = 170;//横向两根管道间的距离,计算为:288/2+52/2
const int WAIT_DISTANCE = 380;//等待距离
//枚举
enum GAME_STATUS//游戏状态 准备 开始 结束
{
GAME_READY,
GAME_START,
GAME_OVER
};
//创建一个类GameScene,继承自Layer
class GameScene : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();//声明场景
virtual bool init();//初始化方法
CREATE_FUNC(GameScene); //引擎为每一个节点实现Create()方法而定义的一个宏指令
void update(float dt);//更新方法
void scrollLand(float dt);//地面滚动方法
void setPhysicWord(cocos2d::PhysicsWorld *world);//声明一个游戏中需要的的物理世界
virtual bool onContactBegin(const cocos2d::PhysicsContact& contact);//碰撞检测
virtual bool onTouchBegin(cocos2d::Touch *touch, cocos2d::Event *event);//触摸开始
virtual void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event);//触摸结束
void createPipes();//添加一个创建管道的方法
int getRandomHeight();//管道随机生成一个高度
int gameStart();
int gameOver();
int gameRestart(Ref *sender);
void gamePanelAppear();//界面板块显示
private:
cocos2d::Sprite *bordSprite;//小鸟
cocos2d::RepeatForever *swingAction;//小鸟飞舞动画
cocos2d::Label *scoreLabel;//分数
cocos2d::Sprite *land1, *land2;//地面
cocos2d::Vector<cocos2d::Node*>pipes;//管道,这里用容器装起来
cocos2d::PhysicsWorld *m_physicWorld;//游戏层的物理世界(拥有物理属性的“世界”)
GAME_STATUS gameStatus;//游戏状态
int score, bestScore;//当前分数和最高分数
int touchX; //触摸点横坐标
};
二、当GameScene.h写好后,接下来自然就是GameScene.cpp的代码之旅了。
1、写好头文件和命名空间:
#include "GameScene.h"
#include "SimpleAudioEngine.h"//涉及到音频
USING_NS_CC;//命名空间
using namespace CocosDenshion;//与SimpleAudioEngine有关的命名空间
2、然后开始一步步创建GameScene.h中声明的各个方法了。今天这节就先能够进入游戏界面就算成功,首先创建游戏场景和添加游戏层。
Scene* GameScene::createScene()
{
//创建游戏场景
auto gameScene = Scene::createWithPhysics();//用物理世界初始化场景
gameScene->getPhysicsWorld()->setGravity(Vec2(0, -900));//设置重力场,重力加速度可根据手感调节
//添加主游戏层
auto gameLayer = GameScene::create();
gameLayer->setPhysicWord(gameScene->getPhysicsWorld());//绑定物理世界
gameScene->addChild(gameLayer);
return gameScene;
}
3、之后就是初始化游戏,把有的游戏要素都添加进来。现在只添加场景,LOGO,管道和小鸟
bool GameScene::init()
{
if (!Layer::init())
return false;
Size visibleSize = Director::getInstance()->getVisibleSize();//设置大小和位置
Vec2 visibleOrigin = Director::getInstance()->getVisibleOrigin();
//初始化游戏状态
gameStatus = GAME_READY;
score = 0;
//添加游戏背景
Sprite *background = Sprite::createWithSpriteFrameName("bg.png");//获取game.png图片中的背景图
background->setPosition(visibleOrigin.x + visibleSize.width / 2, visibleOrigin.y + visibleSize.height / 2);
this->addChild(background);
//添加LOGO
auto gameLogo = Sprite::createWithSpriteFrameName("bird_logo.png");
gameLogo->setPosition(visibleOrigin.x + visibleSize.width / 2, visibleOrigin.y + visibleSize.height / 2 + 100);
gameLogo->setName("logo");
this->addChild(gameLogo);
//添加管道
createPipes();
//添加小鸟
birdSprite = Sprite::create();
birdSprite->setPosition(visibleOrigin.x + visibleSize.width / 3, visibleOrigin.y + visibleSize.height / 2);
this->addChild(birdSprite);
//翅膀挥舞动画
auto birdAnim = Animate::create(AnimationCache::getInstance()->animationByName("birdAnimation"));
birdSprite->runAction(RepeatForever::create(birdAnim));
auto up = MoveBy::create(0.4f, Vec2(0, 8));
auto upBack = up->reverse();
if (gameStatus == GAME_READY)
{
swingAction = RepeatForever::create(Sequence::create(up, upBack, NULL));
birdSprite->runAction(swingAction);//上下飞舞动画
}
}
4、游戏场景基本要素填写好之后,就在LoadingScene.cpp的回调函数中添加以下代码:(不要忘了开头要添加#include "GameScene.h"头文件)
//加载完毕,跳转到游戏场景
auto gameScene = GameScene::createScene();
TransitionScene *transition = TransitionScene::create(0.5f, gameScene);
Director::getInstance()->replaceScene(transition);
5、我们再回到GameScene.cpp中,因为在头文件中已经声明了很多方法,所以不创建这些方法是无法运行的。头文件中要么注释掉这些方法,要么.cpp内先添加进去这些方法,如下:
//更新方法
void GameScene::update(float dt)
{
}
//碰撞检测
bool GameScene::onContactBegin(const PhysicsContact& contact)
{
return false;
}
//管道随机生成一个高度
int GameScene::getRandomHeight()
{
return 0;
}
这样把使用到的方法都一一创建,然后启动调试,如果看到以下图片,小鸟在扑哧扑哧飞,则大功告成,本节也就过过过了。最后退出的时候会报错,这是因为我们还没有完善这个游戏场景,不用担心,正常的诶
相关文章推荐
- cocos2d-x 骨骼动画做水平翻转和改变播放速率
- 【cocos2dx 3.x】CCSpriteBatchNode
- 【cocos2dx 3.x】画线
- cocos 手游开发与 cocos-html5 页游的屏幕适配
- 【Cocos2d-x】截图分享功能
- cocos-js ExportJson
- 全屏背景-Quick-cocos2dx
- 事件触摸-Quick-Cocos2dx
- 【cocos3.x+tilemap】制作rpg小游戏(二)遮挡与碰撞
- Cocos2d-x开发FlappyBird02-LoadingScene启动场景和文件预加载
- Cocos2d-x开发FlappyBird01-环境变量配置和测试案例运行
- 全局调度-Quick-Cocos2dx
- cocos2d-x3.6 连连看随机地图实现
- Cocos2d-html5入门 (跨平台游戏开发)
- 自学 cocos2d 游戏开发应该按什么步骤进行?
- Cocos2d-x 3.x瓦片地图
- Cocos2d-x实例:设置背景音乐与音效-HelloWorld场景实现
- 第一个Cocos2d-JS游戏
- 【cocos3.x+tilemap】制作rpg小游戏(一)地图制作
- cocos2d-x移植到android如何读取Excel文件