Como crear un delta time general? (RESUELTO)

Publicado por Alemar5, Abril 03, 2021, 03:54:12 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Alemar5

Hola amigos :D

Hace tiempo una persona probó uno de mis juegos y le iba super acelerado, por lo que me dedique a investigar y me tope con un video de guinxu donde explicaba que es el delta time, vi algunos videos de como implementarlo pero era un código que se implementa uno por uno, mi pregunta es si existe alguna forma de implementar el deltatime en un solo script y que todo el tiempo del juego se base en el mismo?
Es que el problema es que tengo un proyecto muy avanzado y tendría que rediseñar por completo todo para implementar el deltatime.

De antemano gracias por la ayuda :,3

OrleikertSoft

Orleikert B.

T789

¿Que tan veloz va tu juego? ¿En vez de un delta time no seria mejor cambiar el room_speed?

Alemar5

El tiempo de las tomo de mi juego son de 30fps (eso creo), pero el problema de solo cambiar el tiempo de las toons es que el juego puede ir muy acelerado en una PC potente o muy lento en una computadora de gama baja, por lo que sería muy inconcistente, lo que hace el delta time es compensar esos tiempos en los distintos dispositivos, pero quiero buscar una forma general de aplicarlo al juego.

Alemar5


0m@R

#5
No importa lo que te digan sobre la room_speed en este aspecto, esa variable se cambia es de acuerdo al tipo de juego y el peso de sus lógicas, como usuario de GMS por años nunca he usado una diferente a 30 y me va bien en todos los proyectos (aconsejan muchos usar 60).

Un juego con toque profesional, que quiera perdurar por la posteridad, moviéndose bien en las futuras máquinas más potentes y también en las lentas máquinas de antaño, tiene que tener un trabajo con el delta de tiempo en sus lógicas; y el cambio en tu código no es mucho, mira:

Crea una vez la variable global para guardar el delta de tiempo (le llamé dlt):
globalvar dlt;
dlt = 0;

En un objeto maestro (principal, único, perdurable, etc) pon el evento Begin Step con esto:
dlt = min(0.1, delta_time * 0.000001);

El 0.000001 es para que el resultado nos quede en segundos, así poder implementar todo más intuitivamente.
El 0.1 es porque cuando por ejemplo, arrastras la ventana del juego, este se congela y acumula más delta, entonces este numerito es como un freno para impedir un delta mayor a 0.1 segundos.

Y listo, ese dlt lo usas en todo el resto del código, usualmente se pone en dos lugares, para moverse:
var vel = velocidad * dlt;
x += lengthdir_x(vel, direction);
y += lengthdir_y(vel, direction);

Para mover contadores o temporizadores, pd: hace mucho no uso los alarm
  • , más que para disparar un evento inicial o que no importe la precisión; en vez de eso has esto:

evento Create:
reloj = 0;

evento Step:
reloj -= dlt;
if reloj <= 0 {
    reloj += 5;
    // hacer cosas
}

El teporizador se disparará cada 5 segundos, y hará algo, notar que lo inicializamos en 0 así que disparará empezando; también se puede hacer que cuando uno lo ponga en -1 quede desactivado, imitando el funcionamiento de las alarm
  • ; así:

if reloj != -1 {
    reloj -= dlt;
    if reloj <= 0 {
        reloj = -1;
        // hacer cosas
    }
}

Se detendría el temporizador inmediatamente dispare, note que puede cambiar esto como quiera, hacer conteo ascendente, apagar el temporizador, ponerlo en otro valor para que reinicie, etc; su imaginación y capacidad de programación es el límite.

Dejo otro tip, por ejemplo cuando un temporizador se usa como indicativo de algo, digamos que un ente tiene un poder especial que se activa por un tiempo, entonces podemos solo hacer esto:

reloj = max(0, reloj - dlt);

Así siempre estará disminuyendo hasta quedar en 0, luego solo es preguntar si reloj == 0 para ver el estado, usar esto con precaución en juegos de mucha lógica o muchos objetos, pues se está reescribiendo la variable siempre.

Otro tip es que se puede usar el dlt = 0; en su actualización, y pondría a todo el juego en pausa.

Alemar5

muchas gracias por la ayuda amigo, me funciono :3

Powered by EzPortal
SMF spam blocked by CleanTalk