cocos2dx 3.2制作Flappy Bird实践建立Land陆地层

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

接下来,我们将详细学习如何使用cocos2dx 3.2制作Flappy Bird游戏中的Land陆地层。首先,我们需要对AppDelegate.cpp进行设置,修改屏幕大小,并将第一个场景设置为WelcomeScene

1. 修改AppDelegate.cpp

以下是修改后的AppDelegate.cpp代码:

#include "AppDelegate.h"
#include "WelcomeScene.h"
USING_NS_CC;

AppDelegate::AppDelegate() {
}

AppDelegate::~AppDelegate() {
}

bool AppDelegate::applicationDidFinishLaunching() {
// 初始化导演
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if (!glview) {
// 修改屏幕参数
glview = GLView::createWithRect("FlappyBird", Rect(0, 0, 286, 512), 1.0f);
director->setOpenGLView(glview);
}
// 开启FPS显示
director->setDisplayStats(true);
// 设置帧率,默认值为1.0/60
director->setAnimationInterval(1.0 / 60);
// 创建WelcomeScene作为游戏的第一个场景
auto welcomeScene = WelcomeScene::createScene();
// 运行场景
director->runWithScene(welcomeScene);
return true;
}

// 当应用程序进入后台时调用此函数,例如来电时也会触发
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()->stopAnimation();
// 如果你使用SimpleAudioEngine,这里必须暂停背景音乐
// SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

// 当应用程序重新进入前台时调用此函数
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()->startAnimation();
// 如果你使用SimpleAudioEngine,这里必须恢复背景音乐
// SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}

代码解释:

  • 初始化导演:获取Director实例,并检查OpenGLView是否存在。如果不存在,则创建一个指定大小的OpenGLView
  • 设置显示参数:开启FPS显示,并设置帧率为60帧每秒。
  • 创建并运行场景:创建WelcomeScene实例,并使用runWithScene方法运行该场景。
  • 后台和前台处理:当应用程序进入后台时,停止动画;当应用程序重新进入前台时,恢复动画。

2. 创建Land类

接下来,我们需要创建一个Land类,该类继承自Layer,用于实现陆地层的滚动效果。

2.1 Land.h文件

#include "cocos2d.h"
USING_NS_CC;

class Land : public Layer {
public:
Land(void);
~Land(void);
virtual bool init();
CREATE_FUNC(Land);
// 地面开始滚动
void landMove(float);
// 地面停止滚动
void landStop();
private:
Sprite *land1;
Sprite *land2;
};

2.2 Land.cpp文件

#include "Land.h"

Land::Land(void) {
}

Land::~Land(void) {
}

bool Land::init() {
if (!Layer::init()) {
return false;
}
auto origin = Director::getInstance()->getVisibleOrigin();
auto visibleSize = Director::getInstance()->getVisibleSize();
// 创建2个land,实现滚动效果
land1 = Sprite::createWithSpriteFrameName("land.png");
land1->setPosition(Vec2(origin.x + land1->getContentSize().width / 2, origin.y + land1->getContentSize().height / 2));
// 防止两个精灵叠加时出现黑边
land1->getTexture()->setAliasTexParameters();
auto land1_body = PhysicsBody::create();
auto land1_shape = PhysicsShapeBox::create(land1->getContentSize());
land1_body->addShape(land1_shape);
land1_body->setDynamic(false); // 设置为静态物体
land1_body->setGravityEnable(false); // 不受重力影响
land1_body->setCategoryBitmask(1);
land1_body->setCollisionBitmask(-1);
land1_body->setContactTestBitmask(-1);
land1_body->setLinearDamping(0.7f); // 线性阻尼
land1->setPhysicsBody(land1_body); // 绑定land1和land1_body
addChild(land1);

land2 = Sprite::createWithSpriteFrameName("land.png");
land2->setPosition(Vec2(origin.x + land1->getPositionX() + land1->getContentSize().width - 2, land1->getPositionY()));
land2->getTexture()->setAliasTexParameters();
auto land2_body = PhysicsBody::create();
auto land2_shape = PhysicsShapeBox::create(land2->getContentSize());
land2_body->addShape(land2_shape);
land2_body->setDynamic(false);
land2_body->setGravityEnable(false);
land2_body->setCategoryBitmask(1);
land2_body->setCollisionBitmask(-1);
land2_body->setContactTestBitmask(-1);
land2_body->setLinearDamping(0.7f);
land2->setPhysicsBody(land2_body);
addChild(land2);

schedule(schedule_selector(Land::landMove), 1.0 / 60); // 启动计时器
return true;
}

void Land::landMove(float dt) {
land1->setPositionX(land1->getPositionX() - 2);
land2->setPositionX(land1->getPositionX() + land1->getContentSize().width - 2);
if (land2->getPositionX() == land2->getContentSize().width / 2) {
land1->setPositionX(land2->getContentSize().width / 2);
}
}

void Land::landStop() {
unschedule(schedule_selector(Land::landMove));
}

代码解释:

  • 构造和析构函数Land类的构造函数和析构函数,目前为空。
  • init方法:初始化Land层,创建两个Sprite对象land1land2,并为它们设置物理属性。同时,启动一个计时器,用于实现陆地层的滚动效果。
  • landMove方法:在每一帧中,将land1land2x坐标向左移动2个单位。当land2移动到特定位置时,将land1的位置重置。
  • landStop方法:停止计时器,停止陆地层的滚动。

通过以上步骤,我们成功实现了cocos2dx 3.2制作Flappy Bird游戏中的Land陆地层。希望这篇文章对你有所帮助!

作者信息

feifeila

feifeila

共发布了 3994 篇文章