简单易用的跑马灯-Cocos Creator

本文概要

本次我要分享的是,在游戏中非常常用的一个功能-跑马灯。可能在游戏中的通知公告、弹幕消息中用到。

 

效果图

 

 

实现思路

这里用到了遮罩Mask组件,Mask 用于规定子节点可渲染的范围,带有 Mask 组件的节点会使用该节点的约束框(也就是 属性检查器 中 Node 组件的 Size 规定的范围)创建一个渲染遮罩,该节点的所有子节点都会依据这个遮罩进行裁剪,遮罩范围外的将不会渲染。

 

创建一个带有遮罩Mask的Node,然后再创建一个带有Sprite组件的Node作为跑马灯的背景,再就是创建带有一个RichText(或者Label)组件的Node。

然后把Label的锚点设置为(0,0.5),最好是将锚点X设置为0,这样的话,Label节点的水平位置会以节点的左边界为基准。便于后面的位置计算。

 

在这里主要是处理Label节点的位置的变化,一直以某个速度往某个方向偏移,比如一直往右偏移,那么就在update中,每帧将x坐标加一个定值,刷新后,节点的位置自然就会往右偏移。往左偏移,处理方式也是一样的。每帧将x坐标减一个定值。

 

要考虑的是边界情况,一旦Label偏移到了Mask的边界,例如到了Mask右边界,那我们就把Label的位置设置为Mask的左边界x坐标 - Label的宽度width,防止Label直接出现在Mask中,显得十分突兀。那如果是往左偏移,到了Mask左边界 - Label的宽度width,那就直接将Label的x坐标设置为Mask的右边界x坐标,即可实现效果。

 

上代码

 

const { ccclass, property } = cc._decorator;

enum Direction {
    LEFT_TO_RIGHT = 1,
    RIGHT_TO_LEFT,
}

@ccclass
export default class HorseReceLamp extends cc.Component {

    @property(cc.RichText)
    label: cc.RichText = null;

    @property(cc.Mask)
    maskNode: cc.Mask = null;

    @property({
        tooltip:"每秒移动多少像素",
    })
    m_speed: number = 100;

    @property
    text: string = 'hello';

    m_xLeftEnd: number = 0;
    m_xRightEnd: number = 0;

    m_yPos: number = 0;

    @property({
        tooltip:"文字滚动的方向,1是从左到右,2是从右到左",
    })
    m_direction: number = Direction.LEFT_TO_RIGHT;



    start() {
        // init logic

        this.label.string = this.text;
        this.m_xRightEnd = this.node.x + this.maskNode.node.width * this.maskNode.node.anchorX;
        this.m_xLeftEnd = this.node.x - this.maskNode.node.width * this.maskNode.node.anchorX;

        let contentSize = this.label.node.getContentSize();
        
        let xPos:number = 0;
        if(this.m_direction === Direction.LEFT_TO_RIGHT){
            xPos = this.m_xLeftEnd - contentSize.width;
        }else{
            xPos = this.m_xRightEnd;
        }

        this.label.node.x = xPos;
        this.label.node.y = this.m_yPos;
    }

    update(dt) {
        if (this.m_direction === Direction.LEFT_TO_RIGHT) {
            let contentSize = this.label.node.getContentSize();
            if (this.label.node.x >= this.m_xRightEnd) { 
                this.label.node.x = this.m_xLeftEnd - contentSize.width;
            }

            this.label.node.x += this.m_speed * dt;
            
        }else{
            let contentSize = this.label.node.getContentSize();
            if (this.label.node.x <= this.m_xLeftEnd - contentSize.width) { 
                this.label.node.x = this.m_xRightEnd;
            }

            this.label.node.x -= this.m_speed * dt;
        }
    }
}

 

实用功能集锦,尽在https://github.com/CoderXZ/CocosCreatorDemo

结束语

我是小周,一名移动开发程序员。每天学习一点点,从小白到大牛,并非遥不可及。加油!

以上都是小周的个人观点,与大家一起分享学习,如有错误,还请指出,一起学习,一起进步!感谢你的关注!

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值