【cocos2dx 3.3】口袋空战1 背景层

2015年03月16日 13:06 0 点赞 0 评论 更新于 2017-05-06 00:26

分析

在游戏中,为了实现背景不断向左滚动的效果,我们可以使用两个背景图片交替向左移动。这种方法利用了视觉暂留原理,让玩家感觉背景在持续滚动。

背景素材

我们需要两张相同的背景图片,这里假设图片名为 bg.png

代码实现

1. 头文件 BackGround.h

#include "cocos2d.h"
USING_NS_CC;

class BackGround : public Layer {
public:
// 初始化函数,用于初始化背景层
virtual bool init();
// 自动生成创建对象的静态函数
CREATE_FUNC(BackGround);

// 定义两个背景精灵,用于实现滚动效果
Sprite *land1;
Sprite *land2;

// 背景移动函数,会在计时器触发时调用
void landMove(float dt);
};

2. 实现文件 BackGround.cpp

#include "BackGround.h"
USING_NS_CC;

bool BackGround::init() {
// 获取可见区域的原点坐标
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// 获取可见区域的大小
Size visibleSize = Director::getInstance()->getVisibleSize();

// 创建第一个背景精灵
land1 = Sprite::create("bg.png");
// 设置第一个背景精灵的位置,将其放置在可见区域的左下角
land1->setPosition(Point(origin.x + land1->getContentSize().width / 2, origin.y + land1->getContentSize().height / 2));
// 设置纹理的抗锯齿参数,这里设置为不抗锯齿
land1->getTexture()->setAliasTexParameters();
// 将第一个背景精灵添加到当前层
addChild(land1);

// 创建第二个背景精灵
land2 = Sprite::create("bg.png");
// 设置第二个背景精灵的位置,使其紧挨着第一个背景精灵
land2->setPosition(Point(origin.x + land1->getPositionX() + land1->getContentSize().width - 2, land1->getPositionY()));
// 设置纹理的抗锯齿参数,这里设置为不抗锯齿
land2->getTexture()->setAliasTexParameters();
// 将第二个背景精灵添加到当前层
addChild(land2);

// 开启计时器,每隔 1/60 秒调用一次 landMove 函数,实现背景的持续滚动
schedule(schedule_selector(BackGround::landMove), 1 / 60);

return true;
}

void BackGround::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);
}
}

通过以上代码,我们实现了一个简单的背景滚动效果。在 init 函数中,我们创建并初始化了两个背景精灵,并设置了它们的初始位置。然后,通过 schedule 函数开启了一个计时器,每隔 1/60 秒调用一次 landMove 函数。在 landMove 函数中,我们不断向左移动两个背景精灵,并在特定条件下重置第一个背景精灵的位置,从而实现了背景的循环滚动。

作者信息

menghao

menghao

共发布了 332 篇文章