在游戏开发中,为了让用户有更好的体验和数值上的爽感或者策划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;
- }
- }
这个脚本引用到了另外的一些脚本,在这里截个图就好了。


接下来是使用的场景:

