• (转)CocosCreator零基础制作游戏《极限跳跃》五、制作游戏主场景背景滚动


    CocosCreator零基础制作游戏《极限跳跃》五、制作游戏主场景背景滚动

     

    刚刚我们实现了玩家的一些功能,测试了下发现我们的玩家跳跃几次后,就会超出屏幕,这样体验很差,那下面我们来实现场景背景的滚动作为参照物来实现玩家移动。也就是说玩家只需要小范围的移动就行了,剩下的交给背景的移动来给用户带来玩家在移动的错觉,游戏都是这样实现的。

     

    新建脚本BgMove,并实现移动方法,参数为移动的距离。实现代码:

    01 //BgMove.js
    02 cc.Class({
    03     extends: cc.Component,
    04     properties: {
    05         // foo: {
    06         //    default: null,
    07         //    url: cc.Texture2D,  // optional, default is typeof default
    08         //    serializable: true, // optional, default is true
    09         //    visible: true,      // optional, default is true
    10         //    displayName: 'Foo', // optional
    11         //    readonly: false,    // optional, default is false
    12         // },
    13         // ...
    14     },
    15     //背景移动
    16     setMoveAction: function(height){
    17         // 移动距离
    18         var moveHeight = height;
    19         var moveAction = cc.moveBy(this.jumpTimes, cc.p(0, - moveHeight));
    20         return moveAction;
    21     },
    22     // use this for initialization
    23     onLoad: function () {
    24     },
    25     // called every frame, uncomment this function to activate update callback
    26     // update: function (dt) {
    27     // },
    28 });

    创建好脚本后,我们在场景中给节点bg1、bg2绑定此脚本。

    QQ20160529-15@2x.png

     

    绑定后,我们在打开GAME.js脚本,在顶部引用此脚本。

    QQ20160529-16@2x.png

    然后在事件监听方法,触摸结束的方法里添加背景移动的监听。

    01  //事件监听
    02     setEventControl: function(){
    03         var self = this;
    04         var hero = self.player.getComponent(HeroPlayer);//角色绑定控件
    05         var bg1 = self.bgsprite1.getComponent(MoveBg);//绑定背景控件
    06         var bg2 = self.bgsprite2.getComponent(MoveBg);//绑定背景控件
    07 //.....
    08 //...省略部分代码.
    09 //.....
    10 onTouchEnded: function (touch, event) {            // 点击事件结束处理
    11                 if(self.player.getPositionY() > 0){
    12                      
    13                     var height = self.player.getPositionY();//背景需要移动的高度
    14                     self.player.setPositionY(height/2);//设置精灵的高度位置
    15                      
    16                     bg1.node.runAction(bg1.setMoveAction(height));//背景实现向下滚动
    17                     bg2.node.runAction(bg2.setMoveAction(height));//背景实现向下滚动
    18                      
    19                 }
    20  //...省略部分代码.

    这里分析下代码部分,首先我们创建场景时候,场景Canvas的锚点为(0.5,0.5),也就是屏幕的中心点坐标为0,0。其所有子节点的坐标都是相对于场景来布局,所以说我们的主角布局时候放在屏幕的中下方位置,一开始的Y坐标为负数。每次移动Y坐标会增加,当Y坐标增加超过中心点坐标我们需要进行背景移动,而背景移动的距离则是我们的主角Y坐标值减去中心点的Y坐标0,也就是主角Y坐标值本身。

    所以每次触摸结束,我们对主角的Y坐标进行判断,如果大于0,说明背景需要移动,移动距离为主角Y坐标值,然后我门调用背景1和背景2的移动方法,参数为主角的Y坐标。

    背景移动时候,我们同时需要修正主角的坐标,设置主角的坐标为超过中心点的一半,这样主角不论怎么移动都只能在屏幕内移动。

    下面我门来运行预览,测试下。。

    beijingyidong.gif

    是不是可以实现背景滚动了,大家最后发现了一个问题,背景移动完毕了,没有背景会出现黑色的区域。。

    下面我们要实现一个方法,来对背景进行计算。我们现在是两个背景进行拼接的。我们需要来判断哪个背景已经移除屏幕,移除屏幕后改变其位置,让它Y坐标变成正在移动的那个背景的上边,这样来实现无缝拼接。这样才是无限滚动的背景。

    下面我们继续在GAME脚本添加新的方法来实现计算,下面贴代码。

    01 //GAME.js
    02 //...省略代码
    03  //如果背景1的坐标移出屏幕开始设置新的坐标
    04     setBgMoveCreate: function(){
    05         //如果背景1的坐标移出屏幕开始设置新的坐标
    06         if(this.bgsprite1.getPositionY()  < -500 ){
    07             this.bgsprite2.setPositionY(this.bgsprite1.getPositionY()+this.bgsprite1.getContentSize().height);
    08         }
    09         //如果背景2的坐标移出屏幕开始设置新的坐标
    10         if(this.bgsprite2.getPositionY() < -500 ){
    11             this.bgsprite1.setPositionY(this.bgsprite2.getPositionY()+this.bgsprite2.getContentSize().height);
    12         }
    13     },
    14     //实现update方法
    15    update: function (dt) {
    16              
    17         this.setBgMoveCreate();//检测背景
    18          
    19         },

    我们在update里不停的检测背景移动事件来解决黑色问题。下面来再次测试下。

    beijingyidong22.gif

     

    到此我们已经实现了 玩家角色的移动,背景的滚动了。。游戏完成了三分之一了。。感觉还可以吧。继续。。

     

    原文地址:https://www.byjth.com/jixiantiaoyue/70.html

  • 相关阅读:
    linux下C语言实现写日志 linux下C语言实现写日志功能(转)
    打开支付宝扫一扫,每天都可以领早餐钱,长期活动真实有效!
    谈谈程序员 35 岁危机,太真实了……
    ELK 搭建 TB 级海量日志监控系统,这个太强了!
    面试官:如果保证数据库和缓存数据的一致性?面试必问……
    Spring Boot 并行任务,这才是优雅的实现方式!
    公司新入职一个中级 Java 开发,4 行代码写出了 3 个异常,我真的服了。。
    IDEA 一键生成 Maven 依赖关系图,太强大了。。
    自从用了灰度发布,睡觉真香!
    牛逼!“京东热” 框架 JDhotkey 开源了...单机 QPS 可达 37 万!!
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/9122825.html
Copyright © 2020-2023  润新知