热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cocos2d-x滚动数字label

游戏中有时候需要滚动计数显示,比如添加金币从100滚动显示到9999,这里封装一个动作,直接传入label即可,方便使用。使用时调用UtilsLabel里面的方法即可。Ut

游戏中有时候需要滚动计数显示,比如添加金币从100滚动显示到9999,这里封装一个动作,直接传入label即可,方便使用。
使用时调用UtilsLabel里面的方法即可。

//
// UtilsLabel.hpp
// ActionLabel
//
// Created by xujw on 16/3/7.
//
//

#ifndef UtilsLabel_h
#define UtilsLabel_h

#include 
#include "cocos2d.h"
USING_NS_CC;

typedef enum labelFormat
{
    kNormal = 0,
    kSeparator = 1  //有逗号分隔,比如100,200,300
}kLabelFormat;

class UtilsLabel
{
public:
    //maxWidth=0表示不对label进行缩放
    static void setLabelValueWithFormat(Label*label,long long value,float maxhljs-number">0,kLabelFormat format =kNormal);

    static void runLabelValueTo(Label*label,long long toValue,float duration,float hljs-number">0,kLabelFormat format=kNormal);

    static void runLabelValueToValue(Label*label,long long startValue,long long toValue,float duration,float hljs-number">0,kLabelFormat format=kNormal);

};
#endif /* UtilsLabel_h */
//
// UtilsLabel.cpp
// ActionLabel
//
// Created by xujw on 16/3/7.
//
//

#include "UtilsLabel.h"
#include "ActionLabelValueTo.h"

void UtilsLabel::setLabelValueWithFormat(cocos2d::Label *label, long long value, float maxWidth,kLabelFormat format)
{
    std::string strValue = StringUtils::format("%lld",value);
    if (format == kSeparator)
    {
        //需要千位分隔符
        if (strValue.length() > 3)
        {
            int count = strValue.length() / 3;
            if (strValue.length() % 3 == 0)
            {
                count = count - 1;
            }
            for (int i=0; i1)*3+i), ",");
            }
        }
        label->setString(strValue);
    }
    else
    {
        label->setString(StringUtils::format("%lld",value));
    }

    //需要缩放
    if (maxWidth > 0)
    {
        float s = maxWidth/label->getContentSize().width;
        if (s<1.0)
        {
            label->setScale(s);
        }
    }
    else
    {
        label->setScale(1.0f);
    }
}

void UtilsLabel::runLabelValueTo(cocos2d::Label *label, long long toValue, float duration, float width, kLabelFormat format)
{
    label -> stopAllActions();
    long long startValue = 0;
    if (format == kSeparator)
    {
        //当前值可能是有逗号分隔的,将233.233.233转为233233233
        std::string str = label->getString();
        int len = str.length();
        std::string strVlaue = "";
        for (int i=0; iif (str.at(i) != ',')
            {
                strVlaue += str.at(i);
            }
        }
        startValue = atoll(strVlaue.c_str());
    }
    else
    {
        startValue = atoll(label->getString().c_str());
    }

    if (duration <= 0)
    {
        setLabelValueWithFormat(label, toValue,width,format);
    }
    else
    {
        label->runAction(ActionLabelValueTo::create(duration, startValue, toValue,width,format));
    }
}

void UtilsLabel::runLabelValueToValue(Label*label,long long startValue,long long toValue,float duration,float width,kLabelFormat format)
{
    if (duration <= 0)
    {
        setLabelValueWithFormat(label, toValue,width,format);
    }
    else
    {
        label->runAction(ActionLabelValueTo::create(duration, startValue, toValue,width,format));
    }
}

//
// ActionLabel.hpp
// ActionLabel
//
// Created by xujw on 16/3/7.
//
// 当label数值是数字时进行滚动效果,比如从1滚动到100

#ifndef ActionLabel_h
#define ActionLabel_h

#include 
#include "cocos2d.h"
#include "UtilsLabel.h"
USING_NS_CC;

class ActionLabelValueTo:public ActionInterval
{
public:
    ActionLabelValueTo();
    ~ActionLabelValueTo();
    static ActionLabelValueTo* create(float duration,long long startValue,long long endValue,float hljs-number">0,kLabelFormat format=kNormal);
    bool initWithDuration(float duration,long long startValue,long long endValue,float width,kLabelFormat format);
    virtual void startWithTarget(Node *target) override;
    virtual void update(float time) override;

private:
    long long _startValue;
    long long _endValue;
    long long _delayValue;
    float _maxWidth;
    kLabelFormat _labelFormat;
};

#endif /* ActionLabel_h */
//
// ActionLabel.cpp
// ActionLabel
//
// Created by xujw on 16/3/7.
//
//

#include "ActionLabelValueTo.h"

ActionLabelValueTo::ActionLabelValueTo()
:_startValue(0)
,_endValue(0)
,_delayValue(0)
,_maxWidth(0)
,_labelFormat(kNormal)
{}
ActionLabelValueTo::~ActionLabelValueTo()
{}

ActionLabelValueTo* ActionLabelValueTo::create(float duration, long long startValue, long long endValue,float maxValue,kLabelFormat format)
{
    auto lvt = new(std::nothrow) ActionLabelValueTo();
    if (lvt && lvt->initWithDuration(duration, startValue, endValue,maxValue,format ))
    {
        lvt->autorelease();
        return lvt;
    }
    CC_SAFE_DELETE(lvt);
    return nullptr;
}

bool ActionLabelValueTo::initWithDuration(float duration, long long startValue, long long endValue,float maxWidth,kLabelFormat format)
{
    if (!ActionInterval::initWithDuration(duration))
    {
        return false;
    }

    _startValue = startValue;
    _endValue = endValue;
    _labelFormat = format;
    _maxWidth = maxWidth;

    return true;
}
void ActionLabelValueTo::startWithTarget(cocos2d::Node *target)
{
    ActionInterval::startWithTarget(target);
    _delayValue = _endValue - _startValue;
}
//time is 0 to 1
void ActionLabelValueTo::update(float time)
{
    if (getTarget())
    {
        Label *label = dynamic_cast(getTarget());
        CCASSERT(label, "target must be a Label!");
        long long v = (long long)(_delayValue * (double)time);
        long long curValue = _startValue + v;

        //简易单独使用动作可以用下面代码
// std::string strValue = StringUtils::format("%lld",curValue);
// label->setString(strValue);

        UtilsLabel::setLabelValueWithFormat(label, curValue,_maxWidth,_labelFormat);
    }
}

推荐阅读
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
aiminilee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有