10.10.- Otros procedimientos -ClearDevice : Borra el dispositivo de salida. Equivalente a borrar la pantalla. -GraphDefaults : Borra la pantalla y pone el puntero actual en la esquina superior izquierda. Inicializa todo a las condiciones por defecto. -SetWriteMode(x): Establece alguno de los modos de escritura discutidos en putimage (bitblts). -SetGraphBufSize(x): Establece un buffer especificado en el parametro para los dibujos que deben rellenarse cuando estos son muy complicados. -InstallUserDriver(x,y): Permite instalar un controlador bgi que no sea de Borland. Estos generalmente los dan cuando se venden las tarjetas de video (el formato debe ser bgi). En "x" hay que decirle como se llama el controlador, opcionalmente puede darsele un puntero a una funcion para la autodeteccion, nos devuelve un codigo de error negativo. -InstallUserFont(x,y): Igual que el anterior pero permite instalar tipos de letra que no sean de Borland. -Registerbgidriver(x): Permite cargar un archivo de controlador bgi y registrarlo en el sistema grafico. "x" es un puntero sin tipo que apunta al controlador en el heap, si existe error sera un valor negativo. -Registerbgifont(x): Funciona de la misma forma que registerbgidriver pero lo hace con ficheros de tipo de letra (fonts), si hay error el numero sera negativo. Veamos un programa completo mostrando al bgi en casi toda su capacidad. PROGRAM MORKLY; USES CRT,GRAPH; VAR A,B,C,M : INTEGER; PMORKLY,PMORKLYNA,SALVAR : POINTER; ARCHIVO : FILE; PROCEDURE NUBES (X,Y : INTEGER); VAR A,B,C,D : INTEGER; BEGIN SETFILLSTYLE (INTERLEAVEFILL,WHITE); FOR A := 1 TO 20 DO BEGIN B := RANDOM (50)-25; D:= RANDOM (25) -12; C := RANDOM (30)-15; FILLELLIPSE (X+B,Y+C,20+C,10+D); END; END; PROCEDURE TRAER_GENTE; BEGIN GETMEM (PMORKLY,IMAGESIZE (0,0,39,60)); { TRAE A MORKLY } ASSIGN (ARCHIVO,'D:\MORKLY.DAT'); { DESDE EL DISCO } RESET (ARCHIVO,IMAGESIZE (0,0,39,60)); BLOCKREAD (ARCHIVO,PMORKLY^,1); GETMEM (PMORKLYNA,IMAGESIZE (0,0,39,60)); { TRAE A MORKLYNA } ASSIGN (ARCHIVO,'D:\MORKLYNA.DAT'); { ESTA VEZ. } RESET (ARCHIVO,IMAGESIZE (0,0,39,60)); BLOCKREAD (ARCHIVO,PMORKLYNA^,1); CLOSE (ARCHIVO); END; PROCEDURE PRESENTACION; VAR A,B,C,D : INTEGER; BEGIN RECTANGLE (100,80,540,420); { MARCO DEL TITULO } SETCOLOR (LIGHTBLUE); FOR A := 1 TO 30 DO BEGIN B := A*2; RECTANGLE (100+B,80+B,540-B,420-B); END; SETCOLOR (LIGHTGRAY); FOR A := 61 TO 70 DO { MARCO EXTERIOR } BEGIN B := A*1; RECTANGLE (100+B,80+B,540-B,420-B); END; SETFILLSTYLE (WIDEDOTFILL,RED); { MARCO INTERIOR } SETCOLOR (DARKGRAY); BAR (170,150,470,350); SETTEXTSTYLE (GOTHICFONT,HORIZDIR,9); { LETRA GOTICA } SETCOLOR (YELLOW); OUTTEXTXY (175,130,'MORKLY.'); PUTIMAGE (195,260,PMORKLY^,COPYPUT); { DIBUJA A MORKLY } SETTEXTSTYLE (SANSSERIFFONT,HORIZDIR,3); { AUTOR } SETCOLOR (WHITE); OUTTEXTXY (260,300,'POR ANDRES BERGER'); SETFILLSTYLE (INTERLEAVEFILL,LIGHTGRAY); BAR (0,0,639,79); BAR (0,0,99,480); { RESTO DEL FONDO } BAR (539,0,639,479); BAR (0,419,639,479); FOR D := 1 TO 3 DO FOR C := 1 TO 20 DO FOR B := 1 TO 50 DO { SONIDO } FOR A := 1 TO 3 DO BEGIN SOUND (A*B*C*D); DELAY (1); END; NOSOUND; END; PROCEDURE CASTILLO; { PATRON DE LOS LADRILLOS DEL CASTILLO } CONST CAST : FILLPATTERNTYPE = ($FE,$FE,$00,$FE,$FE,$FE,$00,$FE); PUERTA : ARRAY [0..4] OF POINTTYPE = ((X:471 ; Y:400), (X:450 ; Y:440), (X:508 ; Y:440), { PUERTA EN EL PISO } (X:527 ; Y:400), (X:471 ; Y:400)); VAR A,B,C,D : INTEGER; BEGIN CLEARVIEWPORT; { BORRA PANTALLA GRAFICA } SETBKCOLOR (LIGHTBLUE); NUBES (130,120); NUBES (240,70); NUBES (340,90); NUBES (450,40); NUBES (40,40); SETCOLOR (YELLOW); { DIBUJA SOL } FOR A := 30 DOWNTO 1 DO CIRCLE (600,65,A); FOR B := 1 TO 100 DO FOR A := 1 TO 640 DO { DIBUJA PASTO } IF RANDOM (2) = 0 THEN PUTPIXEL (A,400 + RANDOM (100),LIGHTGREEN) ELSE PUTPIXEL (A,400 + RANDOM (100),GREEN); SETFILLPATTERN (CAST,LIGHTGRAY); SETCOLOR (DARKGRAY); FOR A := 1 TO 100 DO { DIBUJA TORRES DEL CASTILLO } BEGIN FILLELLIPSE (600,410-(A*2),30,10); FILLELLIPSE (400,410-(A*2),30,10); END; BAR (430,220,570,400); { DIBUJA LADRILLOS } SETFILLSTYLE (SOLIDFILL,DARKGRAY); BAR (471,320,527,400);FILLELLIPSE (499,330,28,28); { PUERTA } SETFILLSTYLE (SOLIDFILL,RED); FILLELLIPSE (480,440,28,28); { LENGUA DE LA PUERTA } FILLPOLY (5,PUERTA); LINE (471,320,450,440); LINE (529,320,508,440); { TIRANTES } GETMEM (SALVAR,IMAGESIZE (0,0,39,59)); FOR A := 5 TO 49 DO { MORKLY SE } BEGIN { MUEVE. } GETIMAGE (A*10,350,A*10+40,350+60,SALVAR^); PUTIMAGE (A*10,350,PMORKLY^,COPYPUT); DELAY (200); PUTIMAGE (A*10,350,SALVAR^,COPYPUT); DELAY (5); END; END; PROCEDURE INTERIOR_CASTILLO; CONST ESPADA : ARRAY [1..18] OF POINTTYPE = ((X:350;Y:200), (X:365;Y:200), (X:365;Y:170), (X:375;Y:170), (X:395;Y:160), { SE DEBEN ESPECIFICAR LAS } (X:385;Y:150), { COORDENADAS DE TODOS LOS } (X:375;Y:160), { PUNTOS FINALES. } (X:365;Y:160), { PARA REALIZAR UN DIBUJO } (X:365;Y:100), { QUE, CIERRE EL PRIMER } (X:358;Y:90), { PUNTO DEBE SER IGUAL AL } (X:350;Y:100), { ULTIMO. } (X:350;Y:160), (X:340;Y:160), (X:330;Y:150), (X:320;Y:140), (X:340;Y:170), (X:350;Y:170), (X:350;Y:200)); VAR A,B: INTEGER; BEGIN SETBKCOLOR (BLACK); CLEARVIEWPORT; SETCOLOR (LIGHTGRAY); LINE (0,479,150,350); { LINEA TRANVERSAL } LINE (150,350,639,350); { LINEA PARALELA } SETFILLSTYLE (SLASHFILL,WHITE); { DIBUJA ESPADA } FILLPOLY (18,ESPADA); SETFILLSTYLE (CLOSEDOTFILL,LIGHTBLUE); FLOODFILL (450,200,LIGHTGRAY); LINE (150,350,150,0); { LINEA AL TECHO } SETFILLSTYLE (CLOSEDOTFILL,LIGHTRED); FLOODFILL (450,450,LIGHTGRAY); { EL PISO } SETFILLSTYLE (SOLIDFILL,BROWN); SETCOLOR (YELLOW); FOR A := 20 TO 50 DO BEGIN B := A * 2; FILLELLIPSE (230,420-B,A,10); { MESA 1} FILLELLIPSE (470,420-B,A,10); { MESA 2} END; FOR A := 8 TO 20 DO BEGIN B := A * 2; FILLELLIPSE (160,390-B,A,7); { MESA1, SILLA 1} FILLELLIPSE (290,390-B,A,7); { MESA1, SILLA 2} FILLELLIPSE (410,390-B,A,7); { MESA2, SILLA 1} FILLELLIPSE (540,390-B,A,7); { MESA2, SILLA 2} END; FOR A := 20 TO 60 DO { ENCUENTRO DE MORKLY Y MORKLYNA } BEGIN PUTIMAGE (A*5,350,PMORKLY^,XORPUT); PUTIMAGE (640-A*5,350,PMORKLYNA^,XORPUT); DELAY (100); PUTIMAGE (A*5,350,PMORKLY^,XORPUT); PUTIMAGE (640-A*5,350,PMORKLYNA^,XORPUT); DELAY (5); END; PUTIMAGE (300,350,PMORKLY^,XORPUT); PUTIMAGE (640-300,350,PMORKLYNA^,XORPUT); DELAY (100); SETFILLSTYLE (SOLIDFILL,DARKGRAY); BAR (500,50,600,100); SETTEXTSTYLE (GOTHICFONT,HORIZDIR,5); SETCOLOR (YELLOW); OUTTEXTXY (510,50,'FIN'); FOR A:= 1 TO 10000 DO FOR B := 1 TO 10 DO SOUND (A*B); NOSOUND; END; BEGIN RANDOMIZE; { SOLO FUNCIONA PARA VGA !!! } DETECTGRAPH (C,M); INITGRAPH (C,M,'D:\PASCAL\BGI'); TRAER_GENTE; { TRAE DIBJOS DEL DISCO } PRESENTACION; { TITULO } CASTILLO; { CASTILLO DESDE FUERA } INTERIOR_CASTILLO; FREEMEM (PMORKLY,IMAGESIZE (0,0,39,59)); FREEMEM (PMORKLYNA,IMAGESIZE (0,0,39,59)); FREEMEM (SALVAR,IMAGESIZE (0,0,39,59)); DELAY (5000); END. Lo primero que se debe haber fijado el lector es en el parpadeo de la imagen. Esto sucede por la modificacion del dibujo mientras se hace el barrido del mismo. Suponga que se han dibujado las primeras 9 lineas de morkly y en ese momento su posicion se cambia, entonces las lineas se dibujaran en la posicion nueva, y se mantendra asi hasta que suceda el siguiente barrido vertical y aunque esto sucede rapido, no es tan rapido para que la vista no pueda captarlo, por lo cual se vislumbra un molesto parpadeo. La solucion a lo anterior es escribir solo en los periodos muertos del haz, pero turbo pascal no es capaz de hacerlo con suficiente rapidez, por lo cual si no quiere enredarse con el control del complicado vga a nivel maquina tendra que acostumbrarse a este guinio de imagen. Es necesario hacer notar que en el desplazamiento de morkly usamos dos metodos. El que se usa antes de entrar al castillo es el posicionado de imagen con el metodo mov que produce una copia del rectangulo definido en el lugar indicado. Su defecto es que se ven las partes no pintadas de morkly. El otro metodo es el los dos xorputs, este es el que se usa al interior del castillo y su defecto es que morkly aparece como un fantasma pues aunque el no llega a molestar al fondo, este se mezcla con el, en suma es dificil producir imagenes que se muevan sin perturbaciones con el bgi. Por ultimo aunque morkly como dibujo aparece pequenio este fue dibujado punto por punto (con putpixel) y fueron necesarios mas de 2600 lineas de programa para el solo, lo que se hizo fue crearlo, guardarlo en un archivo sin tipo y luego borrar todas esas lineas, por lo cual el programa necesita esos archivos (morkly.dat y morklyna.dat) para correr con propiedad. .