cocos2dx 3.2制作Flappy Bird实践建立WelcomeScene欢迎场景
在本次实践中,我们将详细介绍如何使用cocos2dx 3.2来创建Flappy Bird游戏的WelcomeScene欢迎场景。下面,我们将逐步建立WelcomeScene类,作为游戏的第一个场景。
1. 头文件定义
首先,创建WelcomeScene.h头文件,定义WelcomeScene类。以下是该头文件的代码:
#ifndef __WELCOME_SCENE_H__
#define __WELCOME_SCENE_H__
#include "cocos2d.h"
#include "Land.h"
class WelcomeScene : public cocos2d::Layer
{
public:
// 推荐返回类实例指针
static cocos2d::Scene* createScene();
// cocos2d-x中的init方法返回bool类型,不同于cocos2d-iphone
virtual bool init();
// 选择器回调函数
void menuCloseCallback(cocos2d::Ref* pSender);
// 手动实现静态create()方法
CREATE_FUNC(WelcomeScene);
// 切换到游戏场景
void startGame();
};
#endif // __WELCOME_SCENE_H__
2. 源文件实现
接下来,创建WelcomeScene.cpp源文件,实现WelcomeScene类的具体功能。以下是该源文件的代码:
#include "WelcomeScene.h"
USING_NS_CC;
Scene* WelcomeScene::createScene()
{
// 创建一个带有物理引擎的场景,该场景为自动释放对象
auto scene = Scene::createWithPhysics();
// 创建WelcomeScene层,该层为自动释放对象
auto layer = WelcomeScene::create();
// 将层添加到场景中
scene->addChild(layer);
// 返回场景
return scene;
}
// 在init方法中初始化实例
bool WelcomeScene::init()
{
// 1. 首先调用父类的init方法
if (!Layer::init())
{
return false;
}
// 获取可见窗口的大小和原点
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
// 加载Plist文件
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("D:\\hello\\Bird\\proj.win32\\res\\birdSucai.plist", "D:\\hello\\Bird\\proj.win32\\res\\birdSucai.png");
// 添加背景
auto bg = Sprite::createWithSpriteFrameName("bg_day.png");
bg->setPosition(visibleSize.width / 2, visibleSize.height / 2);
addChild(bg);
// 添加标题
auto title = Sprite::createWithSpriteFrameName("title.png");
title->setPosition(visibleSize.width / 2, visibleSize.height / 2 + 100);
addChild(title);
// 添加小鸟动画
auto bird_animation = Animation::create();
bird_animation->setDelayPerUnit(0.1f);
bird_animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird0_0.png"));
bird_animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird0_1.png"));
bird_animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird0_2.png"));
auto bird_animate = Animate::create(bird_animation);
auto repeat = RepeatForever::create(bird_animate);
auto bird = Sprite::createWithSpriteFrameName("bird0_0.png");
bird->setPosition(visibleSize.width / 2, visibleSize.height / 2);
bird->runAction(repeat);
addChild(bird);
// 添加菜单项
auto menuImage = Sprite::createWithSpriteFrameName("button_play.png");
auto start_btn = MenuItemSprite::create(menuImage, menuImage, CC_CALLBACK_0(WelcomeScene::startGame, this));
auto menu = Menu::create(start_btn, NULL);
menu->setAnchorPoint(Point::ANCHOR_BOTTOM_LEFT);
menu->setPosition(Point(80, 150));
this->addChild(menu);
auto menuImage2 = Sprite::createWithSpriteFrameName("button_score.png");
auto end_btn = MenuItemSprite::create(menuImage2, menuImage2, CC_CALLBACK_1(WelcomeScene::menuCloseCallback, this));
auto menu2 = Menu::create(end_btn, NULL);
menu2->setAnchorPoint(Point::ANCHOR_BOTTOM_LEFT);
menu2->setPosition(Point(200, 150));
this->addChild(menu2);
// 添加陆地
auto land = Land::create();
land->landMove(1);
addChild(land);
// 添加版权信息
auto copyRight = Sprite::createWithSpriteFrameName("brand_copyright.png");
copyRight->setPosition(visibleSize.width / 2, 80);
addChild(copyRight);
return true;
}
void WelcomeScene::startGame()
{
// 此处可添加切换到游戏场景的具体逻辑
}
void WelcomeScene::menuCloseCallback(Ref* pSender)
{
// 处理不同平台的关闭操作
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.", "Alert");
return;
#endif
// 结束导演实例,退出游戏
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
通过以上步骤,我们完成了WelcomeScene欢迎场景的创建。在这个场景中,我们添加了背景、标题、小鸟动画、菜单项、陆地和版权信息。同时,还实现了开始游戏和关闭游戏的功能。你可以根据实际需求进一步完善startGame方法,实现切换到游戏场景的逻辑。