• Lunes 23 de Diciembre de 2024, 08:15

Autor Tema:  Re: Evitar pantalleo en c bajo dos  (Leído 1121 veces)

sapeton

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Evitar pantalleo en c bajo dos
« en: Domingo 27 de Abril de 2003, 19:23 »
0
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

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Evitar pantalleo en c bajo dos
« Respuesta #1 en: Lunes 28 de Abril de 2003, 00:20 »
0
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
  1.  
  2.  
  3. void vsync_JK(void) //retrazado vertical
  4. {
  5.      while(!((inportb(0x3DA) & 8)==8));      // Se esta haciendo barrido
  6.      while(!((inportb(0x3DA) & 8)==0));      // No se esta haciendo barrido
  7. }
  8.  
  9.  

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..

http://juank-solocodigo.iespana.es

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
  1.  
  2. void vsync_JK(void) //retrazado vertical
  3. {
  4.   asm mov dx, 03DAh
  5.   espera1:  
  6.   asm
  7.   {
  8.      in al, dx
  9.      test al, 08h
  10.      jnz espera1
  11.   }
  12.   espera2:
  13.   asm
  14.   {
  15.      in al, dx
  16.      test al, 08h
  17.      jz espera2
  18.   }
  19. }
  20.  
  21.  

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.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

sapeton

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Evitar pantalleo en c bajo dos
« Respuesta #2 en: Lunes 28 de Abril de 2003, 23:04 »
0
eres una maquina, lo pondre en practica y ya te dire como sale
gracias