Programación General => C/C++ => Mensaje iniciado por: sapeton en Domingo 27 de Abril de 2003, 19:23
Título: Re: Evitar pantalleo en c bajo dos
Publicado por: sapeton en Domingo 27 de Abril de 2003, 19:23
Estoy terminando el juego de la serpiente en c bajo dos, mi problema es que cada vez que muevo la serpiente mi programa pinta una nueva pantalla, el problema de esto es que muestra pantallazos molestos y que le quitan vistosidad al juego. Alguien me comento que se puede eliminar esto introduciendo un trozo de código en ensamblador dentro del codigo en c que lo que hace es utilizar el tiempo que tarda en desplazarse el tubo de rayos catodicos una vez terminada la impresión por pantalla hasta la siguiente para enviar la siguiente instrucción a la pantalla y evitar asi los pantallazas. Me puede ayudar alguien??? Please
Título: Re: Evitar pantalleo en c bajo dos
Publicado por: JuanK en Lunes 28 de Abril de 2003, 00:20
esta pregunta era mas conveniente que la hicieras en el foro de videojuegos.
Lo que te han dicho es cierto, ersulta que cuando estas dibujando en la pantalla, no estas dibujando directamente sobre ella, ya que la pantalla actualiza su contenido cada x cantidad de tiempo, este tiempo por lo general 60 veces por segundo, asi que si estas dibujando en la pantalla en el preciso instante que se esta haciendo el barrido de rayos, el resultado sera un parpadeo, puesto que adicional al refresco que ella hace, le estas obligando a dibujar en otra locacion.
Solucion: Debes esperar a que pase el barrido de la pantalla, y luego si dibujar lo tuyo..como? elaborar una funcion en assembler es una buena alternativa, o utilizar una rutina de c.
Por lo general no paso este codigo, puestio que me gusta motivar la investigacion, sin embargo lo voy a hacer esta vez:
código en C
Código: Text
void vsync_JK(void) //retrazado vertical
{
while(!((inportb(0x3DA) & 8)==8)); // Se esta haciendo barrido
while(!((inportb(0x3DA) & 8)==0)); // No se esta haciendo barrido
}
consulta que hace inportb en la documentaion libc, en este link hay una copia de libc si la quieres bajar, para que revices en este manual quie hace inportb..
Para el caso de turbo C puedes usar esto..aunque ahorita que probe no lo pude hacer en djgpp, asi que si alguien sabe...porfa.
esto es assembler en turbo C superior al 2.0, hace lo mismo pero es que assembler es mucho más optimizado:
Código: Text
void vsync_JK(void) //retrazado vertical
{
asm mov dx, 03DAh
espera1:
asm
{
in al, dx
test al, 08h
jnz espera1
}
espera2:
asm
{
in al, dx
test al, 08h
jz espera2
}
}
Justo antes de que vuelvas a dibujar en pantalla llamas a la funcion y listo... claro que hay algo muy importante y es que esta es una tecnica basica, ai quieres algo más afectivo indaga acerca de la tecnica del doble buffer, page flipping o dirty rectangles, o incluso triple buffer.
Sin embargo esto que te pase en codigo ya no se usa porque hay librerias que ya las traen hechas como por ejemplo allegro..echale una ojeada al foro de videojuegos aca en solocodigo.
Es probable que tengas que configurar el compilador para que te compile assembler: en compilador borland entra al menu Options> Compiler> Advanced Code Generation > Instruction Set y activa el soporte de instrucciones para 80286.
Suerte.
Título: Evitar pantalleo en c bajo dos
Publicado por: sapeton en Lunes 28 de Abril de 2003, 23:04
eres una maquina, lo pondre en practica y ya te dire como sale gracias