cocos2dx 3.2制作Flappy Bird实践建立WelcomeScene欢迎场景

2015年03月17日 17:15 0 点赞 0 评论 更新于 2025-11-21 17:30

在本次实践中,我们将详细介绍如何使用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方法,实现切换到游戏场景的逻辑。

作者信息

feifeila

feifeila

共发布了 3994 篇文章