Carlos Escobar wrote:
Hola,
Me estaba acordando del concurso que se propuso alguna vez en la lista
sobre programación de juegos de 4K para MSX, y recuerdo el jueguito
que yo estaba haciendo... era bastante malo. : (
Bueno, eso no importa, era para el concurso, habria que ver tambien los
demas, no? :)
Sobre el concurso, Daniel Zorita, creo que era el que mas sabia del mismo.
El principal problema que me encuentro siempre que quiero hacer un
juego es el de cómo hacer para balancear las velocidades de los
objetos, rutinas de músicas, etc. etc. etc.
Sincronizarte y temporizarte.
Hago un llamado a la solidaridad para que alguien con buena
predisposición ( que sé que hay varios! ) me dé algunos consejos y
trucos para resolver el tema. Además me imagino que habrá otros a los
que les pueda interesar el tema.
Depende de que sistema de programación uses, aunque 4 ks, imagino que sera
ensamblador.
Si es asi, lo suyo es que te sincronices con las interrupciones.
Por ejemplo, para que tu juego SIEMPRE vaya a igual velocidad seal cual
sea el micro, lo suyo es despues de tu bucle principal, hacer un retardo
esperando x interrupciones, donde x dependerá del juego.
Para esto existen varias formas de hacerlo.
Lo mas simple :
bucle principal
ei
halt
jp bucleprincipal.
Y poner tantos halt como interrupciones quieras esperar.
Pero esto tiene un pequeño problema. Imaginate que debido a una sobre
carga en alguna de tus rutinas, te "has pasado" de vueltas. Imaginate que
quieres esperar 2 interrupciones, y una ya ha pasado.
Si haces
ei
halt
halt
... ralentizarás de mas, pues ya ha pasado 1 (siempre contando que tienes
las interrupciones activadas), mas 2 que haces.
Por lo que el segundo método mucho más eficaz, es que te hagas tu un
contador de las mismas. ¿Como? Pues parcheando tu mismo la interrupcion
del sistema (hablando siempre del IM1), la que se genera 50 o 60 veces por
segundo, y que llama a la direccion 038h.
¿Como parchearla? Para ello, te recomiendo alguna SD Mesxes, donde se
explica en varias, en concreto recuerdo un artículo mio que habla del IM2,
donde explica como hacer esto tambien ... no me preguntes el número que no
me acuerdo.
Y una vez en la rutina de interrupcion que sera algo como esto :
interrupt :
di
in a,(099h)
add a,a
jr c,noint
salvotodosregistros
ld hl,micontadordeints
inc (hl)
recuperotodosregistros
noint : pop af
ei
ret
Ya tienes tu contador de ints.
Luego en vez de hacer los halts en el bucle principal, hazte una subrutina
como esta :
wait :
ei
ld a,(micontadordeints)
cp lasquequieras
jr c,wait ; no han pasado todavia
xor a
ld (micontadordeints),a
ret
Bueno. Espero que te sirva de algo.
--
Un saludo,
Armando Pérez Abad
HELIO YAGO, S.L.
http://www.g2k.es
Tlf: (96) 363 43 17
Fax: (96) 390 27 17