游戏开发框架之数量级管理(TS脚本)

游戏开发框架之数量级管理(TS脚本),第1张

游戏开发中,为了让用户有更好的体验和数值上的爽感或者策划hold不住数值,经常可能会使用到较大的数量级,大到系统的int或float类型都存储不下这样大的数值,比如:100万亿。

接下来只用一个脚本就可以处理这种情况:


import { GameMagnitude } from '../data/Enum';
import { Utils } from './Utils';

export class MagnitudeCtrl {
    /**
     * 将数量级显示为字符串
     * @param magnitude 
     * @param num 
     * @returns 
     */
    static showString(num: number, magnitude: GameMagnitude): string {
        switch (magnitude) {
            case GameMagnitude.None:
                return Math.floor(num) + "";
            case GameMagnitude.Kilo:
                return Utils.numFixed(num, 3) + "K";
            case GameMagnitude.Mill:
                return Utils.numFixed(num, 3) + "M";
            case GameMagnitude.Bill:
                return Utils.numFixed(num, 3) + "B";
            case GameMagnitude.TRIL:
                return Utils.numFixed(num, 3) + "T";
            default:
                return Utils.numFixed(num, 3) + "";
        }
    }

    static showTopMagniString(num: number, magnitude: GameMagnitude) {
        let magnitudeData = this.converToTopMagnitude(num, magnitude);
        return this.showString(magnitudeData.num, magnitudeData.magnitude);
    }

    /**
     * 转换至目标数量级
     * @param magnitude 
     * @param num 
     */
    static converToTargetMagn(targetMagnitude: GameMagnitude, num: number, magnitude: GameMagnitude) {
        if (magnitude > targetMagnitude) {
            for (let i = 0; i < magnitude - targetMagnitude; i++) {
                num = num * 1000;
            }
        } else if (magnitude < targetMagnitude) {
            for (let i = 0; i < targetMagnitude - magnitude; i++) {
                num = num / 1000;
            }
        }

        return {
            magnitude: targetMagnitude,
            num: num
        }
    }

    /**
     * 上行转换
     * @param magnitude 
     * @param num 
     */
    static upConver(num: number, magnitude: GameMagnitude) {
        if (magnitude > 0) {
            magnitude -= 1;
            num = num / 1000;
        }

        return {
            magnitude: magnitude,
            num: num
        }
    }

    /**
     * 下行转换
     * @param magnitude 
     * @param num 
     */
    static donwConver(num: number, magnitude: GameMagnitude) {
        if (magnitude < 4) {
            magnitude += 1;
            num = num * 1000;
        }
        return {
            magnitude: magnitude,
            num: num
        }
    }

    /**
     * 将数量级显示为字符串
     * @param magnitude 
     * @param num 
     * @returns 
     */
    static showNormalNumString(num: number): string {
        let magnObj = this.numConverMagn(num);
        return this.showString(magnObj.num, magnObj.magnitude);
    }

    /**
     * 转到能转的最高级
     * @param num 
     * @param magnitude 
     * @returns 
     */
    static converToTopMagnitude(num: number, magnitude: GameMagnitude = GameMagnitude.None): any {
        if (num >= 1000 && magnitude < GameMagnitude.TRIL) {
            return this.converToTopMagnitude(num / 1000, magnitude + 1);
        }

        if (num < 1 && magnitude > GameMagnitude.None) {
            return this.converToTopMagnitude(num * 1000, magnitude - 1);
        }

        return {
            magnitude: magnitude,
            num: num
        }
    }

    /**
     * 普通数值转数量级
     */
    static numConverMagn(num: number) {
        return this.converToTopMagnitude(num, GameMagnitude.None);
    }

    static compareTwoMag(magObj1: { num: number, magnitude: GameMagnitude }, magObj2: { num: number, magnitude: GameMagnitude }) {
        magObj1 = this.converToTargetMagn(magObj2.magnitude, magObj1.num, magObj1.magnitude);
        return magObj2.num >= magObj1.num;
    }
}

这个脚本引用到了另外的一些脚本,在这里截个图就好了。

 

接下来是使用的场景:

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/2989877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存