En mi aplicación de mensajería, tengo un sistema de niveles que rastrea la actividad de un usuario con XP. No almacena el nivel real, solo la cantidad de XP que tienen. Aquí está la función para calcular el nivel:
function calculateLevel(num) { var lv = 0; do { lv++; } while (num >= Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv))))); var x = num-Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv-1)))); var left = Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv))))-num; var thislv = x + left; return { level: lv, xp: x, left: left, next: Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv)))), prev: Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv-1)))), thislv: thislv+1 }; }La fórmula para calcular cuánto XP requiere cada nivel es 30 √(√(nivel)) . Sin embargo, no quiero usar un bucle while, porque la aplicación comienza a ralentizarse un poco después del nivel 60. ¿Hay alguna forma de obtener el nivel actual sin tener que usar bucles?
Puede reemplazar el bucle con
lv = Math.floor((Math.log(num)/Math.log(30))**4)toda la funcion
function calculateLevel(num) { var lv = Math.floor((Math.log(num)/Math.log(30))**4); var x = num-Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv-1)))); var left = Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv))))-num; var thislv = x + left; return { level: lv, xp: x, left: left, next: Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv)))), prev: Math.floor(Math.pow(30, Math.sqrt(Math.sqrt(lv-1)))), thislv: thislv+1 }; }Debe repensar cómo calcula el nivel y usar para ingresar algo como: cuánto tiempo ha estado activo el usuario. Aquí hay un código de ejemplo que usa una biblioteca llamada RxJS.
import { fromEvent, merge } from "rxjs"; import { debounceTime } from "rxjs/operators"; function listenForActivity() { let lastChecked = Date.now() const activities$ = merge( ...[ "mousemove", "mousedown", "touchstart", "keydown", "click", "scroll", ].map((ev) => fromEvent(document, ev)), fromEvent(window, "focus") ); return activities$.pipe(debounceTime(2000)).subscribe(() => { let timeActive = Date.now() - lastChecked calculateLevel(timeActive) }); }