cocos2dx:update方法实现游戏场景瀑布流滚动效果

40 篇文章 0 订阅
36 篇文章 0 订阅

cocos2dx:update方法实现游戏场景瀑布流滚动效果

设备/引擎:Mac(11.6)/cocos

开发工具:Xcode(13.0)

开发语言:Objective-c/c++

开发需求:让界面元素自下而上呈瀑布流运动,同时用户可以通过上下滑动来控制流动的快慢,从而进行选择

项目中有一个玩法的场景数过多,若采用用户自行左右滑动或上下滑动来选择场景,则会造成部分用户的流失,部分用户缺乏自我探索游戏内容的能力,他们更希望能一次性呈现尽可能多的场景,只负责玩即可。

介于此种情况,最后决定使用瀑布流的形态来进行场景展示,用户不做操作即可对所有场景有所了解,同时添加了滑动操作,以便用户可以更快的浏览所有场景,或更快的找到想玩的场景。

cocos中有一个自带的update函数,可以通过scheduleUpdate时间计时器来调用该函数,从而达到所有场景上移的效果,形成瀑布流。
update函数有一个时间的参数,可以通过这个参数来刷新位置,人的肉眼是看不出中间的停顿的,所以不必担心不连贯的问题。
部分代码如下:

scheduleUpdate();

void SelectAnimalScene::update(float date){
    for (int i=1; i<36; i++) {
        CCSprite* aniButton = (CCSprite*)this->getChildByTag(i);
        aniButton->setPositionY(aniButton->getPosition().y+1);
        CCLog("containHeight ====> %f",aniButton->getPosition().y);
        if (aniButton->getPosition().y>700) {
                aniButton->setPositionY(-1820);
        ColorManager::shared()->aniPosArr[i-1][1]=aniButton->getPosition().y;
}

内容其实不复杂,如上代码部分,在函数每次被刷新的时候,对项目中的所有场景的Y轴坐标进行+1,同时需要计算一下整个屏幕最上、最下的Y轴坐标,用来让场景首尾相接,不出现断层的情况,来达到更加连贯的效果。

手动滑动操作,这部分比较复杂的是需要考虑滑动的时候,停止刷新场景的位置,滑动的距离需要同步到所有场景的位置,滑动结束后,自动刷新的位置需要与最后滑动的位置一致等等……

停止刷新可以直接调用unscheduleUpdate()函数,与启动刷新的scheduleUpdate()函数对应,在用户触摸屏幕开始滑动时调用即可。

重置场景位置部分比较复杂,需要考虑的因素也比较多,本次项目中的代码如下:

void SelectAnimalScene::resetAniPos(){
    for (int i=1; i<36; i++) {
        CCSprite* aniButton = (CCSprite*)this->getChildByTag(i);
        CCLog("containHeight ====> %d",ColorManager::shared()->aniPosArr[i-1][1]);
        CCLog("containHeight ====> %f",aniButton->getPosition().y);
        if (aniButton->getPosition().y>700) {   
            int index = aniButton->getPosition().y-700;+index;
                aniButton->setPositionY(-1820+index1);
        }else if(aniButton->getPosition().y<-1820){    
            int index = -1820-aniButton->getPosition().y;
            int index1 = moveDisY-index;
            aniButton->setPositionY(700+index1);
        }else if(aniButton->getPosition().y>=-1820 && aniButton->getPosition().y<=700){
            aniButton->setPositionY(aniButton->getPosition().y+moveDisY);
        }
        ColorManager::shared()->aniPosArr[i-1][1]=aniButton->getPosition().y;
    }
}

重点是计算好上滑下滑的距离,同时修改移动场景的Y坐标,且保证用户上滑下滑不会出现断层的现象,即实现无缝衔接的瀑布流效果。

除此之外,还有一个要点就是用户选择好一个场景进去玩之后,再出来的时候,所有场景的位置需要与点进去的时候一致,这个就需要将所有场景的位置进行实时的存储,存储方式看自己习惯,上述代码中的最后一行

ColorManager::shared()->aniPosArr[i-1][1]=aniButton->getPosition().y;

即是对场景的坐标进行实时的存储。

整体而言瀑布流原理比较简单好理解,重点是其中的一些坐标细节需要根据项目进行细致的规划设计,保证效果的流畅性!!!

关于瀑布流的部分大体就是上述这些,希望能给大家提供到帮助!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GameTomato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值