Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Hola on May 02, 2014, 07:26:38 PM

Title: re:juego de lucha
Post by: Hola on May 02, 2014, 07:26:38 PM
hola como andan, estoy haciendo un juego de lucha y tengo mas experiencia k antes en programacion en esta clase de juegos pero me pasa k los graficos de mi fichero son entre medianos y chicos de los luchadores y pasa k por ejemplo cuando kiero ejecutar 4 ficheros por ejemplo en 2 vs 2 los graficos y la velocidad salen todo bien, pero en algun momento del programa se alentiza un cachito y despues vuelve a la velocidad normal por ahi pokitas veces pasa, keria saber si hay algo k yo pueda poner un programa una sentencia o algo para que por mas k pase mucho tiempo funcione a la misma velocidad, no se si es problema de memoria en el fichero, pero probe grabar grafdicos con otro formato al fichero y ocupan la misma memoria, son como 160 grtaficos por fichero no son tan grandes ni tan chicos los graficos, no kiero reducirlos pork son obligatorios pero kisiera k siempre funcione a la misma velocidad, sea por la computadora el programa o el fichero k sea, si alguien me puede ayudar desde ya le agradezco
Title: Re:re:juego de lucha
Post by: laghengar on May 03, 2014, 11:32:23 AM
Pues es que está la función set_fps() que imagino que conoces de sobra. Esa función se encarga precisamente de eso, realizar todas las sentencias que le colocas, y cuando llegue su hora, lo plasma en pantalla, haciendo que cada impresión en pantalla se haga en el mismo tiempo que el anterior. Habría que redactar más para explicarse mejor, pero supongo que ya sabes de qué hablo.
Title: Re:juego de lucha
Post by: Hola on May 03, 2014, 10:04:40 PM
hola laghengar gracias por el mensaje, de hecho no conozco la funcion set_fps();, creo k me exprese mal tengo mas experiencia en los juegos de lucha pero me referia a lo basico, es decir, puedo hacer todo tipo de cosas manejando en vez de lo complejo la parte basica, uso ese metodo k se usaba en un juego de div2, el platafor, no se si viste alguna vez el ejemplo, estoy desarrollando eso y me equivoque muchas veces y he aprendido ya varias cosas,con: pri cuad=, ult cuad=, igual en el metodo no esta el problema ya lo he comprobado, pero volviendo al tema no conozco la funcion set_fps por lo que te comentaba, me la podrias explicar como se usa y si hay algun otro metodo para agilizar como esa funcion el juego?
Title: Re:re:juego de lucha
Post by: SplinterGU on May 03, 2014, 10:36:49 PM
set_fps sirve para decirle a bennugd a cuantos fps queres que corra tu programa... recibe 2 parametros, el primero es numero de fps y el segundo cantidad de fps que puede saltar el motor para llegar a los fps deseados (cuando decimos saltar, es no dibujarlos, pero si se ejecutan)
Title: Re:re:juego de lucha
Post by: laghengar on May 04, 2014, 10:30:09 AM
Para terminar con lo de splinter, añado una recomendación. Para juegos de lucha emplea set_fps ( 60 , 0 ) ;

60 como mínimo o 75 para apurar más. Este tipo de juegos necesita la máxima eficacia de volcado de pantalla, y según los expertos lo mínimo deberían ser 60 frames por segundo. Y de segundo parámetro pones 0, para que no existan tirones.

Colócate en pantalla un write_var(.......fps); para que puedas vigilar  en tiempo real como van los frames. Toma nota de cuando baja mucho de los 60 (si baja a 59 no lo tomes en cuenta), y realiza las tareas oportunas para llegar a 60.

Un saludo, ánimo y suerte.
Title: Re:re:juego de lucha
Post by: Hola on May 04, 2014, 05:34:13 PM
he leido un poco del set_fps(); hay algun otro metodo para agilizar el juego o ese es el unico?, esto es para saber nada mas, he leido de un lado k no hace falta en el primer parametro mas de 24 imagenes por segundo para un juego, y k punto a punto en cuanto a frame son 18 imagenes por defecto, me podrian dar un ejemplo basico del uso del set_fps?, se podria poner una sola vez para hacerlo mas general en vez de ponerlo en cada atake o proceso o se pone solo una vez?  por ejemplo asi estaria bien?:
ejemplo:
////proceso...
process ...();
begin
loop
if(key(_right));
from graph=21 to 27;
frame(300);
end
break;
end
set_fps(24,4);
frame;
end
end


de esa forma seria la velocidad normal, digo por defecto, k creen ustedes?
Title: Re:re:juego de lucha
Post by: laghengar on May 04, 2014, 09:27:05 PM
Así sirve pero es contraproducente. La función set_fps la puedes usar una sola vez y ese valor queda para toda la ejecución. Normalmente se coloca en las primera líneas de código, después de set_mode(). Algo como:
Title: Re:re:juego de lucha
Post by: SplinterGU on May 04, 2014, 10:00:56 PM
no, no, la funcion set_fps se puede usar tantas veces quieras dentro del juego... lo unico que no debes hacer es usarla en cada frame, porque carece de validez, ya que no tiene estadisticas para calcular el tiempo de delay del siguiente frame.
Title: Re:re:juego de lucha
Post by: laghengar on May 05, 2014, 09:18:21 AM
He visto en tu código el

frame(300);

Ojo con eso :)
Title: Re:re:juego de lucha
Post by: Hola on May 05, 2014, 07:09:04 PM
gracias ya la entendi, y por ultimo este es el unico metodo para agilizar el juego o hay otros mas complejos y este es el mejorcito?
Title: Re:re:juego de lucha
Post by: laghengar on May 05, 2014, 10:33:17 PM
Ahora no se que decirte en eso. Tendrías que ir mirando que funciones usas y cuantas veces las usas. Sería inventar un algoritmo para reducir la cantidad de veces que las utilizas. Que se ralentice una ejecución no solo depende del tamaño de los gráficos, si no de la carga que llevan todas las líneas que le marcas, y de la carga que ya lleva tu pc con otros programas. Todo pasa por ver cuando te falta de verdad emplear una función, y cuando puedes permitirte el cuando no usarla.

Creo que el mejor método para agilizar es usar la menor carga en variables. Declarando las menos posibles y que sean lo más chicas posibles, minimizando la ejecución de la menor cantidad de procesos posibles a la vez, etc, etc, etc...
Title: Re:re:juego de lucha
Post by: gecko on May 05, 2014, 11:42:52 PM
hay algun proceso o funcion que esta haciendo que el juego ande lento en esos determinados momentos... deberias tratar de identificar cuando es que suceden los ralentizamientos, y tratar de averiguar que es lo que esta haciendo tu programa en esos momentos... y despues intentar hacer eso mismo pero de una forma mas eficiente.

Es una pregunta demasiado demasiado amplia para que la podamos contestar de una forma simple. Cada programa o cada juego es completamente distinto
Title: Re:re:juego de lucha
Post by: Hola on May 06, 2014, 02:59:51 PM
hola, como andan, asi como decian, aunque por ahi alguna vez pasa no me ha pasado todavia con el fps, la velocidad de los procesos en realidad son normales no es k siempre en alguno se realentiza por ahi algunas pocas veces pasa, a veces si a veces no,, pero si es asi, k igual se realentizara con la funcion set_fps, seria un problema de la computadora, un virus o algo asi?, y otra pregunta un programa de 2340 kb, ocupa mas memoria y podria hacer k se realentizara en alguna vez con mas facilidad k uno de por ejemplo 120 kb?, en el sentido de todo lo k esta escrito digo
Title: Re:re:juego de lucha
Post by: gecko on May 06, 2014, 04:02:06 PM
Cada programa es distinto, podes tener un programa de 2mb que hace operaciones simples y no se va a poner lento nunca, y podes tener un programa de 10 lineas que hace la misma operacion continuamente hasta que la computadora se congele.

No existen reglas o formulas magicas del tipo "usa x cosa y el programa va a andar mas rapido".
Title: Re:re:juego de lucha
Post by: Hola on May 06, 2014, 06:39:59 PM
ok, oye laghengar dijiste k para juegos de lucha el minimo de set_fps es de (60,0), yo no tengo pero en makinas viejas funciona a la velocidad original ? pork he leido k el segundo parametro en 0 en makinas viejas reduce la velocidad a la de la computadora, no se si sera asi o si uno kisiera poner el juego en cualquier makina en esa por ejemplo, con el 60 funciona de la manera original, vos k pensas de cualquier modo asi va a andar bien en cualquier compu, o sea de manera original?
Title: Re:re:juego de lucha
Post by: laghengar on May 07, 2014, 10:05:15 PM
mmmmmmmmmmmm , lo de 60 fps es por la rapidez de respuesta del juego respecto al jugador, en ese tipo de juegos los gamers lo notan mucho cuando uno va a 60 o a 30. El segundo parámetro que dices de ponerle 0 es para indicar a bennu cuantos frames por segundo le permites que no muestre los gráficos. Mostrar gráficos usa bastantes recursos, y con ese segundo parámetros le liberas de la carga para que en caso de que no le de tiempo en ese frame, poder compensar llegando al siguiente. En los juegos de lucha este tipo de cosas no gustan nada, cada frame del personaje se cuenta, y si algo no sale como espera, el jugador lo nota y le deja una sensación extraña. Poner un 0 en el segundo parámetro no quiere decir que cargas más al juego, lo que pasa es que no le permites liberarse de la carga de sacar los gráficos. Si tienes un juego que va bien sin problemas, ese segundo parámetro da igual, no va a saltarse ningún frame. Pero ponle 0 porque si no le da tiempo a procesar algún frame, lo vas a notar, y eso es lo que tienes que depurar.

Lo de que el juego vaya a andar bien en cualquier compu ya depende de los recursos que emplees en el juego. Si quieres que funcione en cualquier emplea pocos sprites, con pocos pixeles, pocos efectos, pocos sonidos, pocos colores, poco de todo XD. Cuanto más pongas y más engorroso sea tu código, más máquina va a necesitar.
Title: Re:re:juego de lucha
Post by: Hola on May 08, 2014, 04:40:43 PM
ok gracias laghengar, voy a intentarlo cualquier cosa les aviso
Title: Re:re:juego de lucha
Post by: Drumpi on May 10, 2014, 08:04:26 PM
Bueno, sólo decir que acabas de descubrir el por qué es tan fascinante y a la vez frustrante crear videojuegos.

Sólo porque te veo algo perdido: los fps son imágenes por segundo. En cualquier lenguaje es sólo un parámetro estético, pero en Bennu es fundamental, ya que todo se basa en eso, en las imágenes por segundo: determinan cuándo los procesos se comunican, cuándo muestran cosas en pantalla, y lo más importante, CUÁNTAS OPERACIONES PUEDES REALIZAR ENTRE FRAMES.
¿Cómo se sabe eso? bien, espero que entiendas de ordenadores, porque no es lo mismo un 486, que un Pentium3 o que un AMD de doble núcleo. Un factor que determina esto es la velocidad del procesador, expresado en herzios (KHz, MHz o GHz), pero hay muchos más. Si en un momento dado tu juego se ralentiza se debe a que:
- Debe realizar demasiados frames en un segundo.
- Tu CPU no puede ejecutar todo lo que has programado entre frames.

Para que no se ralentice, ya sabes: o haces código que haga lo mismo pero más rápido, o usas una CPU más rápida, pero me extraña muchísimo que se te ralentice un juego con la potencia de los ordenadores desde hace 10 años.

Respecto a cuantos FPS son los ideales: de nuevo, bienvenido al fabuloso mundo de la programación.
Según los estudios fisiológicos, el ojo percibe movimiento con 24 imágenes por segundo, que es la velocidad de las antiguas cámaras de cine. Sin embargo, el formato de televisión PAL usa 50Hz/50FPS, por o que es lo que la gente está acostumbrada... salvo que usen el sistema NTSC o el moderno PAL, que va a 60Hz y se nota que todo va mucho más suave.
Pero a mas FPS, mejor debe ser tu código. Rara vez tengo animaciones que requieran de más de 15FPS, pero el movimiento se ve tosco. Al final uso siempre 50FPS porque me permite calcular tiempos más fácilmente (1 frame dura exactamente 0'02 segundos). Pero como te dicen por ahí arriba, en juegos de lucha se suelen usar velocidades altas, de 60FPS para arriba, porque la gente machaca los botones a toda velocidad, y en Bennu los botones sólo responden a cada frame, así que tener muchos frames por segundo evita que ambos jugadores coincidan al pulsar un botón y hace que haya menos retardo entre la pulsación y la ejecucuón del frame.

Pero claro, si quieres tener unos FPS muy altos, tiene que haber muy poco código entre frame y frame, deben ser órdenes o muy sencillas o en poca cantidad.

Una solución, poco elegante, pero muy utilizada es el segundo parámetro de SET_FPS: lo que se conoce como Frame Skip. Básicamente le dice a Bennu que no ejecute las órdenes de dibujado de las imágenes, pero sí el resto. Así consigues más tiempo para ejecutar el código, con el coste de que algunas imágenes no se van a ver, y el juego parecerá que va "a saltos".

así, que, como ya te han dicho, localiza esas partes donde se ralentiza, averigua qué es lo que hace que vaya tan lento, y mejora el código para que no lo haga más. No es lo mismo recorrer 20 posiciones de un array para obtener el 5º dato, que recorrer sólo las 5 primeras posiciones y luego salir del bucle.