Claro, yo lo decía para evitar tanto el "flickering" (creo que se llama así) tanto al redibujar sprites como al volcar la pantalla. Obviamente si tienes mucha carga gráfica, el juego irá igual de lento, pero sin cosas raras en pantalla.thEpOpE escribió:Shadow no sirve para generar más rápido la pantalla, sino para mostrar en pantalla un 2° buffer mucho mas rápido (sin usar copias de un buffer en otro con ldir)
SYNCronizar velocidad juego (variable FRAMES)
Re: SYNCronizar velocidad juego (variable FRAMES)
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
Bueno.... añado enlace a Youtube: https://youtu.be/tE-La6izZtc
He puesto 32 tiles.... Y SE SIGUE "MOVIENDO" IGUAL QUE CUANDO HABIA SOLO 8!!!!!!!!!
He puesto 32 tiles.... Y SE SIGUE "MOVIENDO" IGUAL QUE CUANDO HABIA SOLO 8!!!!!!!!!
- Adjuntos
-
- 32_tiles_sync.png (19.26 KiB) Visto 6820 veces
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: SYNCronizar velocidad juego (variable FRAMES)
Mola!
Pero.. el personaje a veces parpadea
Pero.. el personaje a veces parpadea
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
No en mi demo... debe ser a la hora de capturar...yombo escribió:Mola!
Pero.. el personaje a veces parpadea
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: SYNCronizar velocidad juego (variable FRAMES)
Ah, bueno, bien pues.Hark0 escribió:No en mi demo... debe ser a la hora de capturar...yombo escribió:Mola!
Pero.. el personaje a veces parpadea
Re: SYNCronizar velocidad juego (variable FRAMES)
Justamente voy a necesitar usar la interrupción, podrías darme un trozo de código explicando cómo se hace? (En Z88DK)Haplo escribió:Las interrupciones no es complicado para nada, sólo es cortar/pegar código
Gracias.
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
Si te atreves "a pelearte" con toda la morralla del proyecto... ahi lo tienes....
(Perdón por tanto //.... no está limpio para nada )
(Perdón por tanto //.... no está limpio para nada )
Código: Seleccionar todo
#include <stdio.h> // break + printf
#include "librerias/esxdos.c"
#include "librerias/random.h"
#include "librerias/zxuno_system.h"
#include "librerias/zxuno_sprites.h"
#include "librerias/zxuno_plot.h"
#include "librerias/zxuno_paleta.h"
#include "librerias/zxuno_ascii.h"
#include "graficos_juego.h" // hrk
#include "teclado.c" // hrk
#include "heroe.c" // hrk
#include "zink.c" // hrk
#include "objetos.c" // hrk
#include "mundo.c" // hrk
#include "render.c" // hrk - sistema video doble buffer Modo Radastaniano
#include "juego.c" // hrk - control estado juego
// ---------------------------------------------------------------------------- DEFINE
#define PANTALLA_MENU 0
#define PANTALLA_JUEGO 1
#define EVENTO_NINGUNO 0
#define EVENTO_RENDER 1
#define EVENTO_A_MENU 2
#define EVENTO_SYNC_RELOJ 254
#define EVENTO_FIN_APP 255
#define JUEGO_NO_INICIADO 0
#define JUEGO_INICIADO 1
// ---------------------------------------------------------------------------- INICIO DECL. VARS
unsigned char *txt_app[1];
// ---------------------------------------------------------------------------- INICIO DECL. VARS JUEGO
unsigned char loop_juego;
// ---------------------------------------------------------------------------- TARJETA SD - YOMBO
int16_t drive;
// ---------------------------------------------------------------------------- FIN DECL. VARS
#pragma output STACKPTR=65000
// ---------------------------------------------------------------------------- MAIN
void main (void)
{
unsigned char x,y;
unsigned char evento_juego;
// unsigned int sync_reloj;
// unsigned char reloj_delta;
unsigned int dir_peek_FRAMES;
unsigned char reloj_A;
// unsigned char reloj_B;
unsigned char reloj_diff;
// ------------------------------------------------------------------------ INIT VARS
txt_app[0]="RADASTIAN FUNC. 4 ZX-UNO BY HRK";
loop_juego = 1;
evento_juego = EVENTO_NINGUNO; // 0 nada - 1 render
// ------------------------------------------------------------------------ Iniciamos el modo Radastaniano
inicia_render();
// ------------------------------------------------------------------------ INIT CONTROL EVENTOS
inicia_eventos_juego();
// ------------------------------------------------------------------------ INICIO VARIABLES JUEGO
asigna_pantalla_juego(PANTALLA_MENU); // 0 - menu / 1 - juego
// ------------------------------------------------------------------------ INIT SCREEN
dibuja_pantalla_juego(estado_juego);
// ------------------------------------------------------------------------ INIT RELOJ
dir_peek_FRAMES = 23672;
*dir_peek_FRAMES = 0;
print_char_zxuno_OK(*dir_peek_FRAMES,57,0);
//sync_reloj = 0;
//reloj_delta = 0;
// ------------------------------------------------------------------------ MAIN LOOP - WHILE
while (loop_juego == 1)
{
reloj_A = *dir_peek_FRAMES;
if (evento_juego == EVENTO_NINGUNO) // hay que hacer ALGO
{
evento_juego = control_evento_juego(); // ------------------------ GESTION EN FICHERO JUEGO.C
}
else//if (evento_juego != EVENTO_NINGUNO) // hay que hacer ALGO
{
if (evento_juego == EVENTO_FIN_APP) // CERRAMOS TODO Y SALIMOS AL ZX SPECTRUM OS
{
loop_juego = 0;
}
if (evento_juego == EVENTO_RENDER) // RENDER
{
dibuja_pantalla_juego(estado_juego);
dibuja_zink_pantalla_juego();
}
if (evento_juego == EVENTO_A_MENU) // pasamos de juego a menu + RENDER
{
dibuja_pantalla_juego(estado_juego);
pausa_juego();
pausa_juego();
}
if (evento_juego == EVENTO_SYNC_RELOJ) // RUTINA LOOP ANIM SYNC RELOJ
{
evento_juego = EVENTO_SYNC_RELOJ;
}
else
{
evento_juego = EVENTO_NINGUNO; // --------------------------------- OJO SYNC RELOJ!!!!!!!!!!!
}
}
dibuja_zink_pantalla_juego();
reloj_diff = *dir_peek_FRAMES - reloj_A;
while (reloj_diff < 3)
{
reloj_diff = *dir_peek_FRAMES - reloj_A;
wait_int();
}
*dir_peek_FRAMES = 0;
}
// ------------------------------------------------------------------------ Cerramos el modo Radastaniano
cierra_render();
// ------------------------------------------------------------------------ Salimos al Spectrum
printf(" 2016 Hark0 - www.zxuno.com \n");
drive = ESXDOS_getDefaultDrive();
iferror {
printf( "SD Card not inserted." );
}
else
{
printf( "SD Card Ready..." );
}
}
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: SYNCronizar velocidad juego (variable FRAMES)
Yo tiro de ZXBasic y ASM, en C no sabría decirte. Te paso el trozo de código que prepara la IM2:yombo escribió:Justamente voy a necesitar usar la interrupción, podrías darme un trozo de código explicando cómo se hace? (En Z88DK)Haplo escribió:Las interrupciones no es complicado para nada, sólo es cortar/pegar código
Gracias.
Código: Seleccionar todo
equ dir_rutina_IM2 32768
di
ld hl,$FE00 ; Llenamos en ($FE00-FE) la direccion del salto a la
ld a,$FD ; rutina que queremos que se ejecute en cada IM2
ld (hl),a
ld de,$FE01
ld bc,256
ldir
ld hl,$FDFD ; (65021)
ld (hl),195 ; código JP NN
inc l
ld bc,dir_rutina_IM2
ld (hl),c
inc l
ld (hl),b ; ahora donde salta IM2 hay un JP dir_rutina_IM2
ld a,$FE ;(253)
ld i,a
im 2
ei
reti
Con eso configuras la IM2 para que sea cual sea el valor de i, se apunte siempre a la dirección 65021, donde hay colocado una JP dir_rutina_IM2 y así saltará a esa rutina en 32768 (o la que indiques tú)
en 32768 deberías tener un código que empiece salvando los registros que necesites conservar inalterados, un ejemplo sería esto:
Código: Seleccionar todo
dir_rutina_IM2:
di
push af
push hl
push de
...
código a ejecutar (pintar sprites, volcar pantalla, tocar música...)
...
pop de
pop hl
pop af
ei
reti
Saludetes.
Re: SYNCronizar velocidad juego (variable FRAMES)
Muchas gracias, a ver si me sale implementarlo en asm empotrado en CHaplo escribió:
Yo tiro de ZXBasic y ASM, en C no sabría decirte. Te paso el trozo de código que prepara la IM2:
Saludetes.
Re: SYNCronizar velocidad juego (variable FRAMES)
Muchas gracias Hark0, pero como ves lo que necesitaba es lo que me ha pasado Haplo. En tu código no implementas un "manejador" de interrupciones propio, sino que usas el contador que es actualizado por el manejador de interrupciones por defecto.Hark0 escribió:Si te atreves "a pelearte" con toda la morralla del proyecto... ahi lo tienes....