XGravity/Public/ecma/Views/FpsOverlayView.ecma.js

78 lines
2.3 KiB
JavaScript

"use strict";
const FpsOverlayView = (function(){
const FpsOverlayView = function(xgravity){
const self = this;
let view_element = null;
let label_element = null;
let frame_count = 0;
let accumulated_time = 0;
let last_fps = 60;
this.close = () => {
if(view_element && view_element.parentNode){
view_element.parentNode.removeChild(view_element);
view_element = null;
label_element = null;
}
};
this.tick = (delta_time) => {
const enabled = xgravity.settings.get("show_fps", null, false);
const is_game_active = xgravity.views.game
&& typeof xgravity.views.game.is_active === "function"
&& xgravity.views.game.is_active()
&& !xgravity.views.game.is_paused();
// Solo se muestra si está activado en ajustes Y hay partida activa no pausada
if(!enabled || !is_game_active){
if(view_element) self.close();
return;
}
if(!view_element){
self.go();
}
frame_count++;
accumulated_time += delta_time;
if(accumulated_time >= 0.25){
last_fps = Math.round(frame_count / accumulated_time);
frame_count = 0;
accumulated_time = 0;
if(label_element){
label_element.textContent = `${last_fps} FPS`;
if(last_fps >= 50){
label_element.style.color = "#38bdf8";
} else if(last_fps >= 30){
label_element.style.color = "#facc15";
} else {
label_element.style.color = "#f43f5e";
}
}
}
};
this.go = () => {
if(view_element && view_element.parentNode) return;
const nodes = xgravity.html(xgravity.item_self, [
"div", { class : "xg-fps-overlay" }, [
["span", { id : "xg_fps_counter" }, "60 FPS"]
]
]);
view_element = nodes[0];
label_element = view_element.querySelector("#xg_fps_counter");
};
};
return FpsOverlayView;
})();