Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Timers

Iniciado por BrianPr, 26 de Marzo de 2007, 05:59:31 PM

« anterior - próximo »

BrianPr

Hola de nuevo xD. Tengo un problemita.
Lo explico teóricamente:
Tengo un timer de la dx_lib32 que detecta las pulsaciones del teclado y si movemos para arriba cambia unas coordenas para que se mueva el personaje. Esto funciona, pero lo que no hace es renderizar, creo que se queda en eso solo.
Yo puse así en el form:
Cargo todo 'módulo
Timer ' el evento está en un módulo
Render 'módulo
________________
Timer:
With m_Input
   If .Key(Key_Left) Then
   PosXPj = PosXPj - 25

....
_______________

Render:
Do While Fin<> True
Call DibujarMapa(vX)
Call CargoGraficos
Call MuevoPersonaje
Call DibujarMouse
Call Texto
Call m_GFX.Frame
Loop

Con esto sólo se mueve el personaje, el dibujarmouse lo que hace es seleccionar un tile y poner las coordenadas en el form pero no lo hace.
Sin el timer funciona todo.

Espero que me puedan ayudar y que se entienda xD :$.
Saludos!.-
ww.lemuriaonline.com.ar
www.tech-pc.com.ar

[EX3]

Aqui hay algo que no me queda claro del todo:
CitarRender:
Do While Fin<> True
Call DibujarMapa(vX)
Call CargoGraficos
Call MuevoPersonaje
Call DibujarMouse
Call Texto
Call m_GFX.Frame
Loop
Cargas los graficos en mitad del bucle de dibujo? Los graficos se cargan solo una vez y antes de dibujarlos. Quizas sea esta la razon de por que dices que no se dibuja nada. Piensa que los graficos persisten en memoria una vez cargados y sigue asi hasta que los descargamos con el metodo Map_Unload().

Sobre los cronometros, ya que sacas el tema, un consejo os doy. Jamas useis un cronometro de la dx_lib32 (y por ende los de la API de Windows) para dibujar graficos via Direct3D (y esto al menos desde Visual Basic 6.0). Os arriesgais en ciertos casos (sobre todo en los que el intervalo sea menor a un milisegundo) a que el programa pete salvajemente con alguna excepcion de acceso no permitido de memoria, y esto lo digo por experiencia :P

Su uso lo recomiendo por ejemplo para hacer cargas de recursos en segundo plano y poder asi implementar en el hilo principal del programa pantallas de carga animadas y fluidas (que no haga pausas mientras carga un archivo).

Yo recomiendo como practica correcta, clara a nivel de codigo y optima a nivel de ejecucion, la tecnica de los bucles para casi todo lo que tenga que ser continuo y en ciclos, como dibujar la escena o la lectura de dispositivos de entrada (raton, teclado...) en vez de implementarlo en eventos paralelos mediante cronometros (que se de alguno que busca implementar programacion multihilo en practicamente todo con esto de los timers)

Ten en cuenta que si se desincroniza la lectura de entrada de dispositivos con la presentacion de graficos en pantalla puedes obtener que los controles no reaccionen adecuadamente con lo que se vea en pantalla. Por eso los tutoriales de dx_lib32 muestran un orden de llamadas que comienza por la lectura de dispositivos de entrada seguida de los calculos y la logica (fisica, IA...), la ejecucion de audio (efectos de sonido) y finalmente la presentacion de graficos en pantalla dado que esto ultimo suele ser junto a la logica y los calculos lo mas pesado de procesar dado la cantidad de datos a mover.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

BrianPr

No no, el cargograficos lo que hace es poner el fondo (el terreno digamos, no le puse el mejor nombre la verdad :P).
Mucho no enténdí, qué tengo que hacer para que funcione?
Hay alguna manera de que detecte las pulsaciones y siga el loop?
ww.lemuriaonline.com.ar
www.tech-pc.com.ar

[EX3]

Cita de: "BrianPr"Hay alguna manera de que detecte las pulsaciones y siga el loop?
Igual que lo hacias en el cronometro solo que haciendolo al principio del bucle principal:
Bucle
   Lectura Input()
   Logica()
   Audio()
   Graficos()
Fin Bucle

Piensa que programas de forma secuencial pero como lo que muestras no es mas el resultado de llegar al final de bucle, lo que seria la escena impresa en pantalla, la sensacion es de ser todo simultaneo, como si fuese programado todo mediante multihilo, igual que los fotogramas de una pelicula.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

BrianPr

Ya lo solucioné, gracias :D. Lo que me faltaria por optimizar es que al apretar una tecla el personaje se mueve de más, o sea, por cada vez que apreto por ejemplo vbkey_up la coordenada x resta 1 y al ejecutar el código se mueve más, creo que es porque el bucle va muy rápido :P.
Hasta luego, saludos!.-
ww.lemuriaonline.com.ar
www.tech-pc.com.ar

[EX3]

Cita de: "BrianPr"Lo que me faltaria por optimizar es que al apretar una tecla el personaje se mueve de más, o sea, por cada vez que apreto por ejemplo vbkey_up la coordenada x resta 1 y al ejecutar el código se mueve más, creo que es porque el bucle va muy rápido :P.
Configura el parametro MaxFrames de la funcion Frame() a 60 por ejemplo. Veras que la cosa ira fluida pero no tan freneticamente rapido. El numero ideal de cuadros por segundo esta entre 60 y 30 dependiendo de como lo programes.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

BrianPr

Muy bueno, ya está, gracias y felicitaciones nuevamente  :) .
Saludos!.-
ww.lemuriaonline.com.ar
www.tech-pc.com.ar






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.