Cocos2d-x开发FlappyBird03-GameScene游戏场景初进入

来源:互联网 发布:淘宝做图片用什么软件 编辑:程序博客网 时间:2024/05/17 23:40

尊师重道很重要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;
}

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


0 0
原创粉丝点击