Dibujando un pinito con nieve en C manejando la memoria de video en modo texto
August 13, 2007 – 10:05 pmEn uno de los articulos anteriores vimos como manejar las interrupciones de video y del mouse para lograr dibujar sobre una resolución de 640×480 píxeles.
Lo que hoy les traigo, es un algoritmo que permite, mediante el uso de punteros y de la memoria de video en modo texto, realizar en pino en el centro de la pantalla y simular la caida de nieve.
Captura del Pinito
Talvez se pregunten ¿Qué beneficio tiene esar punteros a la memoria de video? Bueno, en realidad muchos, ya que los punteros nos permiten posicionarnos y escribir dentro de la misma con total libertad, y si ustedes quisieran hacer esto de otra manera, por ejemplo utilizando printf(char *) o el famoso gotoxy(int, int), tendrían una pérdida de rendimiento de su algorítmo además de un dolor de cabeza terrible tratando de hacer que esto funcione.
Este es uno de los primeros temas que se tratan cuando a uno le enseñan punteros. Repitan conmigo “los punteros son TODO en c”. Más adelante vamos a ver los lugares más raros de la pc donde nos podemos meter, que de cualquier otra manera no estaríamos ni por asomo llegando.
Ahora, una pequeña intrucción a punteros.
Un puntero es una variable, pero una variable particular que puede almacenar direcciones de memoria.
Como ustedes saben, si yo hago:
int ivar;
Estoy declarando una variable de tipo entero llamada ivar.
Osea, la sintaxis es TIPO nomb_var;
Para declarar un puntero hago:
int * pvar;
En la línea anterior estoy declarando un puntero de tipo entero;
Aca les dejo el código fuente de pinito con nieve para que lo descarguen.
sino miralo acá
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define RETARDO 50
#define VIDEO (unsigned char far *)0XB8000000
void main()
{
unsigned char far * p ;
int I , J ;
clrscr();
p = VIDEO ;
/* Dibuja el pino */
/* Dibuja la copa */
for(I=3;I<19;I++)
for(J=40-I+3;J<=40+I-3;J++) {
// *(p+160*I+2*J)=42;
*(p+160*I+2*J+1)=0X20;
}
/* Dibuja el tronco */
for(I=19;I<25;I++)
for(J=38;J<43;J++) {
*(p+160*I+2*J)=42;
*(p+160*I+2*J+1)=0X06;
}
/* Comienza la nevada */
while ( !kbhit() ) {
/* Cayendo nieve */
/* Hace bajar los copos de nieve */
for(I=24;I>0;I–)
for(J=0;J<80;J++)
if( *(p+160*(I-1)+2*J)==94 ) {
*(p+160*I+2*J)=94;
*(p+160*I+2*J+1)=0X0F;
*(p+160*(I-1)+2*J)=0X20;
}
/* Generando nieve en la fila 0 */
for(J=0;J<80;J++)
if(random(10)>8) {
*(p+2*J)=94;
*(p+2*J+1)=0X0F;
}
/* Restaura el pino en los huecos dejados por los copos */
/* En la copa del pino */
for(I=3;I<19;I++)
for(J=40-I+3;J<=40+I-3;J++)
if ( *(p+160*I+2*J)==0X20) {
*(p+160*I+2*J)=42;
*(p+160*I+2*J+1)=0X02;
}
/* En el tronco del pino */
for(I=19;I<25;I++)
for(J=38;J<43;J++)
if ( *(p+160*I+2*J)==0X20) {
*(p+160*I+2*J)=42;
*(p+160*I+2*J+1)=0X06;
}
delay(RETARDO);
}
getch();
}
2 Responses to “Dibujando un pinito con nieve en C manejando la memoria de video en modo texto”
hola, me parece una aplicacion interesante y mas por que da una buena introduccion a los punteros! lo estoy probando ya mismo haciendo modificaciones con una funcion de tiempo para que caigas mas rapido o mas lento edpendeindo el tiempo que lleve en ejecucion el porgrama =)
By Enrique on Nov 21, 2007
Gracias, hace mucho que buscaba los punteos lejanos, y ahora los retomo para una clase… bye…
By Jacob on Apr 29, 2008