![]() |
|---|
![]() |
![]() |
![]() |
Movimiento de imágenes en pantalla
El refrescamiento de la pantalla
Mover una figura implica realizar las siguientes operaciones:
| circle (x,y,radio); | se pinta la figura que queremos mover. |
| size =
imagesize(figura->radio,figura->radio, 3*figura->radio,3*figura->radio); |
imagesize() nos devuelve el tamaño de memoria necesario para almacenar la figura encerrada por el rectángulo comprendido entre los dos puntos que como parámetros se le pasan. |
| void *apuntador,*apuntador_old; | Los apuntadores al tipo de dato void permiten guardar las zonas de memoria donde se guarda la información sobre las imágenes. El tamaño de la zona de memoria que posteriormente le asignaremos a estos punteros estará siempre medida en bytes y proviene del cálculo hecho por la función imagesize(, , ,) |
| apuntador_old =
malloc(size); apuntador = malloc(size); |
Por medio de la función malloc() se reserva en memoria el espacio necesario para guardar la imagen que queremos desplazar. A malloc() se le transfiere como parametro size, variable que contiene en número de bytes que se necesitan. |
| getimage(XI,YI,XD,YD,apuntador); getimage(XI,YI,XD,YD,apuntador_old); |
getimage(,,,,) lleva a
"apuntador" los datos de la figura que está dentro del rectángulo que se le
pasa como parámetro. Los parámetro de getimage(,,,,) nos permiten fijar el área del rectangulo donde se inscribe la figura y depositar la información en la zona de memoria apuntado por apuntador. Si la figura es irregular, deberemos buscar el rectángulo más pequeño que la contenga. Se utiliza un primer getimage(,,,,) para captar la imagen pura que se deposita en apuntador, despues un segundo getimage para capturar el fondo donde se va a poner la imagen, ese fondo se guarda en apuntador_old. |
| putimage(posx,posy,apuntador,COPY_PUT); | Con putimage se pone la imagen que exista en el puntero que
se pasa como tercer parametro, en este caso apuntador. La imagen se pone de forma que la esquina superior izquierda del rectangulo que se guardo quede en posx, posy. El cuatro parámetro COPY_PUT es la forma en que se pone la imagen esto es si se suma con el fondo o simplemente se elimna el fondo. Para ello se utiliza la aritmética lógica sumando bit a bit del fondo y de imagen. |
| putimage(posx,posy,apuntador_old,COPY_PUT); | Una vez que se ha puesto la imagen a mover, se sustituye por el fundo, restableciendose así la situación que existia |
| getimage(XI,YI,XD,YD,apuntador_old); | Se vuelve a capturar la imagen de fondo solo que ahora los XI,YI,XD,YD, están incrementados con el paso con que queremos que se vaya movimiendo la imagen |
| putimage(posx,posy,apuntador,COPY_PUT); | de nuevo se pone la miagen que queremos mover y así continua el ciclo hasta el punto o el momento que querramos. |
| setvisualpage(1); | Esta
función establece qué página se ve. El parámetro que se le pasa establece la página
que se ve, en este caso la número 1. Para ello el driver y el modo deben ser tales que puedan contener más de una página. Vea la lista de modos en el Help de C++ |
Las memorias RAM no son más que circuitos electrónicos de muy alta integración, esto es, gran cantidad de transitores por cm2. El tamaño de esos dispositivos hace que la carga que pueden acumular es muy pequeña y es necesario cada cierto tiempo reponerles las pérdidas que tienen por las corrientes parásitas, que a pesar de su alta calidad tienen todos los dispositivos. Mientras que el micro central está atendiendo el refrescamiento de la memoria, no puede hacer nada más.
Como quiera que los movimientos en la pantalla deben ser continuos, si estamos cambiando una figura de posición, mientras que se va a refrescar la memoria, observaremos un flacheo desagradable en nuestro gráfico.
Para evitar esto debemos detener el programa cuando se va a atender las memorias.
El sistema operativo cuando se va a ejecutar uno de estos procesos pone en el bit 4 del puerto 3DA (hexadecimal) un cero, y cuando termina de refrescar pone un 1 en ese mismo bit. De esta manera podemos detectar cuándo está en cero o en uno el bit, y sabremos cuándo podemos realizar el movimiento y cuándo no.
Esto es lo que estamos haciendo en el ciclo:
| while (!(inportb(0x3da)&8)); |
Como estamos negando el resultado, tendremos que el while se realiza mientras que la memoria se está refrescando y, por el contrario no se ejecuta cuando se acaba de actualizar la información en la memoria.
Normalmente este ciclo se pone entre los putimage(,,,) que implican poner la imagen en movimiento y el fondo por donde se desplaza.
![]() |
![]() |