cocos2d-x实现背景无限循环

    横版卷轴游戏一般把角色放在屏幕特定位置,通过移动背景,造成人物往反方向移动的错觉。cocos2d-x中可以用同一张背景图生成2个精灵,让他们首尾相连,一起移动。每一帧检查前者位置,一旦超出屏幕范围(不可视),重新设置坐标紧跟后者。形象的比喻就是2个人在排队办业务,排在前面的人办好了又回到队伍后面。
代码如下:

class SprBg :public cocos2d::CCLayer
{

public:
//初始化
bool initBackground();
//每一帧调用一次,更新位置
void update(float dt);
//静态方法来产生对象
static SprBg* createBackground();
private:
    //显示背景的两个精灵
    cocos2d::CCSprite *m_pFar;
    cocos2d::CCSprite *m_pFarRe;
    //移动背景的速度
    float fFarVelocity;

};


bool SprBg::initBackground()
{
CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage(
"F:\\cocos2d-x-2.2\\projects\\flyshow\\Resources\\HelloWorld.png");


CCSprite *bg = CCSprite::createWithTexture(texture);
CCSprite *bg_re = CCSprite::createWithTexture(texture);

if(bg && bg_re)
{
bg->setAnchorPoint(CCPointZero);
bg_re->setAnchorPoint(CCPointZero);

this->m_pFar = bg;
this->m_pFarRe = bg_re;

//增加标签方便以后调用
this->addChild(bg,-10,TAG_BG_FAR_LAYER);
this->addChild(bg_re,-9,TAG_BG_FAR_LAYER);

bg->setPosition(ccp(0,0));
bg_re->setPosition(ccp(BG_WIDTH ,0));

this->fFarVelocity = 150;
//变为智能对象
this->autorelease();
this->scheduleUpdate();
return true;
}
return false;
}
调用autorelease()后对象变成智能对象。
调用scheduleUpdate()后启动update定时器,每一帧调用一次重载的update函数。

void SprBg::update(float dt)
{
m_pFar->setPositionX(m_pFar->getPositionX() - fFarVelocity*dt);
if (m_pFar->getPositionX() < -1*BG_WIDTH)
{
            m_pFar->setPositionX(m_pFar->getPositionX() + BG_WIDTH * 2 );
}

m_pFarRe->setPositionX(m_pFarRe->getPositionX() - fFarVelocity*dt);
if (m_pFarRe->getPositionX() < -1*BG_WIDTH)
{
            m_pFarRe->setPositionX(m_pFarRe->getPositionX() + BG_WIDTH * 2 );
}
}
这里是滚动背景的主要逻辑。取出当前位置,计算下一帧应该出现的位置后更新。如果超出了可视范围就往后调整。其中dt是上一次update函数调用到这一次update函数调用的间隔时间。

SprBg* SprBg::createBackground()
{
SprBg* pBg = new SprBg();
if(pBg && pBg->initBackground())
return pBg;
}
为了统一cocos2d-x生成对象的风格,这里把声明对象和 cocos2d-x实现背景无限循环初始化封装在静态函数里面。
cocos2d-x实现背景无限循环
效果如下
cocos2d-x实现背景无限循环

cocos2d-x实现背景无限循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值