个人初做小游戏RunRunMagic(二) 背景循环和分数

总觉得自己游戏名起错了。。。。算啦反正也没人看(你)

来一首real Emotion继续打字打字,干完活奖励自己去打打FFV(开心脸)

咳咳。。干活干活恩。。。

这次想要实现的是最基础(?)的一个部分,背景的循环移动

人物不动,背景向后移动,这样给人一种人物在向前跑动的感觉。本来对于如何实现这样的功能我有点懵逼。。于是开始在网上查资料,看别的大神是如何实现的。后来找到了一个理解起来比较简单的方法。大致思想就是:

首先背景图片的首尾是要能拼接起来的,如果只有一张那就创建两张拼接起来,一起向左移动。(如果有两张同理)在事件调度器内设置每帧(或者自定义时间)移动x,根据x大小设定背景(简介理解为人物)移动的速度。同时做个判断,当两张背景图片中有任意一张的右边要离开屏幕的左边时,将其的位置改为另一张图片的右边,以此形成循环。

嘛差不多就是这样一个感觉吧

感觉自己的小游戏素材还是自己画比较好所以自己画了一个。。是用的这个网站http://www.pixvi.net/piskel/(百度直接像素绘也可以找到)

我知道画得好渣能用就行了orz

总之素材准备就绪,开始编程吧!


首先创建两个背景图片的精灵(两个精灵图片是一样的)

    auto bg1 = Sprite::create("background.png");
    bg1->setTag(100);
    bg1->setAnchorPoint(Point(0,0.5));
    bg1->setPosition(Vec2(0,100));
    this->addChild(bg1,1);
    auto bg2 = Sprite::create("background.png");
    bg2->setTag(101);
    bg2->setAnchorPoint(Point(0,0.5));
    bg2->setPosition(Vec2(300,100));
    this->addChild(bg2,1);
值得一提的是因为素材画的太小(因为大的不会画啊!),因此我改变了一下屏幕适配。图片的大小是300x200的,屏幕适配就改为240x160吧!

屏幕适配的修改:在AppDelegate.cpp中添加

    glview->setDesignResolutionSize(240,160,ResolutionPolicy::EXACT_FIT);
好的然后我们继续吧!

现在两张图片已经准备完毕,现在就要想办法让他们动起来。首先总结一下时间调度器的开启方法吧:

    //方法1 (需要重写update方法)
    scheduleUpdate();
    //方法2 (需要自己编写myUpdate方法)
    this->schedule(CC_CALLBACK_1(HelloWorld::myUpdate, this),"myUpdate");
    //方法3 (与上面类似,但是添加了时间)
    this->schedule(CC_CALLBACK_1(HelloWorld::myUpdate, this),5.0f,"myUpdate");
    //方法4 (延迟5秒后调用,只调用一次)
    this->scheduleOnce(CC_CALLBACK_1(HelloWorld::myUpdate, this),5.0f,"delaySchedule");
    //取消相应时间调度器
    this->unscheduleUpdate();
    this->unschedule("myUpdate");
对于这样的背景图片的移动,用第一种就足够了。于是在init()中先这样开启一个时间调度

    scheduleUpdate();
重写update:

    void PlayLayer::update(float t){
    //创建循环背景
    auto bg1 = this->getChildByTag(100);
    bg1->setPosition(Vec2(bg1->getPosition().x-5,bg1->getPosition().y));
    auto bg2 = this->getChildByTag(101);
    bg2->setPosition(Vec2(bg2->getPosition().x-5,bg2->getPosition().y));
    
    if (bg1->getPosition().x <= -bg1->getContentSize().width) {
        bg1->setPosition(300, 100);
    }
    if (bg2->getPosition().x <= -bg2->getContentSize().width) {
        bg2->setPosition(300, 100);
    }
}
这样的话,背景就可以动起来啦!为了让人物有一种”疾走“的感觉,我把每帧移动的像素设为5个点,这样就真的有RunRun的感觉了吧!(可能要起飞了。。)

当然同时我们也可能设置计分器了。首先在init()中声明两个Label,用来显示”SCORE“这个字母,另一个用来显示分数

    scoreLabel = Label::createWithTTF("fonts/pixel3.ttf", "SCORE");
    scoreLabel->setPosition(Vec2(30,150));
    this->addChild(scoreLabel,3);
    char number[20];
    sprintf(number, "%d",playerScore);
    scoreNumberLabel = Label::createWithTTF("fonts/pixel3.ttf", number);
    scoreNumberLabel->setPosition(Vec2(75,150));
    this->addChild(scoreNumberLabel,3);

分数的增加写在update()里就ok:

    playerScore++;
    char number[20] ;
    sprintf(number, "%d",playerScore);
    scoreNumberLabel->setString(number);

这里再。。就算是给自己记录一下一些技巧吧。把游戏中用得到的数据统一写在一个.h的文件中(比如上面的playerScore)方便管理。当然要注意的是这类文件的包含要写在其他.cpp文件中,否则会出现连接错误的!

这样就大功告成啦!各位辛苦了大笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值