您的位置:首页 > 移动开发 > Cocos引擎

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;

}

这样把使用到的方法都一一创建,然后启动调试,如果看到以下图片,小鸟在扑哧扑哧飞,则大功告成,本节也就过过过了。最后退出的时候会报错,这是因为我们还没有完善这个游戏场景,不用担心,正常的诶

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: