在游戏开发中,为了让用户有更好的体验和数值上的爽感或者策划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;
}
}
这个脚本引用到了另外的一些脚本,在这里截个图就好了。
接下来是使用的场景:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)