//Bibliotecas #include #include #include #include #include #include #include #include #include #include //variables constantes #define RES_X 640 #define RES_Y 480 #define ERROR 1 #define OK 1 #define k (2*3.14159/360) #define RADIO 255 #define SALTOS_PROFUNDOS 8 #define SALTOS_ANCHOS 7 #define BLOQUEO_RADIO 1 #define INCREMENTAL 1 #define PROFUNDIDAD_TUNEL 35 #define FACTOR_SERPIENTE 0.015F //estructuras y tipos typedef struct { unsigned char R, G, B; } ColorValue; typedef ColorValue VGAPaletteType[256]; VGAPaletteType Pal; extern int far _Cdecl Svga256_fdriver[]; //funciones int MuestraImagen( char *file ); int CargaPaleta(char *file); void InicializaSVGA(void); void InicializaSVGA(void); void RellenaTablas(void); void Put( int x, int y, char c); void Circulo( int x, int y, int radio, int giro, int Color ); void CirculoB( int x, int y, int radio, int giro ); void TunelEstrellas(void); void ReadPal( VGAPaletteType K ); void WritePal( VGAPaletteType K ); void CreaPaleta(void); void letrasm(char texto[100]); void demo1(void); void demo2(void); void demo3(void); void demo4(void); void demo5(void); void demo6(void); //variables externas int huge DetectVGA256(){ return 2; } int MuestraImagen( char *file ); int CargaPaleta(char *file ); int PERFECCION_CIRCULO = 8; int qeu = 0; int Incremento = -1, contador = 0; int XSinMov[256], YSinMov[256]; int TSin[360+90]; int letras[29][56]={ //espacio en blanco 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, // la A 0,0,0,1,1,0,0,0, 0,0,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,1,1,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, // la B 1,1,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 1,1,1,1,1,1,0,0, // la C 0,0,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 1,1,0,0,0,0,0,0, 1,1,0,0,0,0,0,0, 1,1,0,0,0,0,0,0, 0,1,1,0,0,1,1,0, 0,0,1,1,1,1,0,0, // la D 1,1,1,1,1,0,0,0, 0,1,1,0,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,1,1,0,0, 1,1,1,1,1,0,0,0, // la E 1,1,1,1,1,1,1,0, 0,1,1,0,0,0,1,0, 0,1,1,0,1,0,0,0, 0,1,1,1,1,0,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,0,1,0, 1,1,1,1,1,1,1,0, // la F 1,1,1,1,1,1,1,0, 0,1,1,0,0,0,1,0, 0,1,1,0,1,0,0,0, 0,1,1,1,1,0,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,0,0,0, 1,1,1,1,0,0,0,0, // la G 0,0,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 1,1,0,0,0,0,0,0, 1,1,0,0,0,0,0,0, 1,1,0,0,1,1,1,0, 1,1,0,0,0,1,1,0, 0,1,1,1,1,1,1,0, // la H 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,1,1,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, // la I 0,1,1,1,1,1,1,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,1,1,1,1,1,1,0, // la J 0,0,0,1,1,1,1,0, 0,0,0,0,1,1,0,0, 0,0,0,0,1,1,0,0, 0,0,0,0,1,1,0,0, 1,1,0,0,1,1,0,0, 1,1,0,0,1,1,0,0, 0,1,1,1,1,0,0,0, // la K 1,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,1,1,0,0, 0,1,1,1,1,0,0,0, 0,1,1,0,1,1,0,0, 0,1,1,0,0,1,1,0, 1,1,1,0,0,1,1,0, // la L 1,1,1,1,0,0,0,0, 0,1,1,0,0,0,0,0, 0,1,1,0,0,0,0,0, 0,1,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,0,0,1,1,0, 1,1,1,1,1,1,1,0, // la M 1,1,0,0,0,1,1,0, 1,1,1,0,1,1,1,0, 1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,0, 1,1,0,1,0,1,1,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, // la N 1,1,0,0,0,1,1,0, 1,1,1,0,0,1,1,0, 1,1,1,1,0,1,1,0, 1,1,0,1,1,1,1,0, 1,1,0,0,1,1,1,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, // la ¥ 0,1,1,0,0,0,1,0, 1,0,0,1,1,1,0,0, 0,0,0,0,0,0,0,0, 1,1,1,0,0,1,1,0, 1,1,0,1,0,1,1,0, 1,1,0,0,1,1,1,0, 1,1,0,0,0,1,1,0, // la O 0,0,1,1,1,0,0,0, 0,1,1,0,1,1,0,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, 0,1,1,0,1,1,0,0, 0,0,1,1,1,0,0,0, // la P 1,1,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,1,1,1,0,0, 0,1,1,0,0,0,0,0, 0,1,1,0,0,0,0,0, 1,1,1,1,0,0,0,0, // la Q 0,0,1,1,1,0,0,0, 0,1,1,0,1,1,0,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, 1,1,0,1,1,0,1,0, 1,1,0,0,1,1,0,0, 0,1,1,1,0,1,1,0, // la R 1,1,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,1,1,1,0,0, 0,1,1,0,1,1,0,0, 0,1,1,0,0,1,1,0, 1,1,1,1,0,1,1,0, // la S 0,0,1,1,1,1,0,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,0,0,0, 0,0,1,1,1,1,0,0, 0,0,0,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,0,1,1,1,1,0,0, // la T 0,1,1,1,1,1,1,0, 0,1,0,1,1,0,1,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,1,1,1,1,0,0, // la U 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,0,1,1,1,1,0,0, // la V 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,0,1,1,1,1,0,0, 0,0,0,1,1,0,0,0, // la W 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, 1,1,0,1,0,1,1,0, 1,1,1,1,1,1,1,0, 1,1,1,0,1,1,1,0, 1,1,0,0,0,1,1,0, // la X 1,1,0,0,0,1,1,0, 0,1,1,0,1,1,0,0, 0,0,1,1,1,0,0,0, 0,0,1,1,1,0,0,0, 0,1,1,0,1,1,0,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0, // la Y 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,1,1,0,0,1,1,0, 0,0,1,1,1,1,0,0, 0,0,0,1,1,0,0,0, 0,0,0,1,1,0,0,0, 0,0,1,1,1,1,0,0, // la Z 0,1,1,1,1,1,1,0, 1,0,0,0,0,0,0,1, 1,0,1,0,0,1,0,1, 1,0,0,0,0,0,0,1, 1,0,1,1,1,1,0,1, 1,1,0,0,0,0,1,1, 0,1,1,1,1,1,1,0, }; //Funcion principal void main() { int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"c:\\program\\borlandc\\bgi"); clearviewport(); demo1(); letrasm(" GRAFICOS IMPRESIONANTEMENTE CUTRES PA LLORA"); demo2(); letrasm(" HAY VA UNA CAIDITA DE LINEAS ASEXUALES"); demo3(); letrasm(" VAMO A DADLE A LAS IMAGENES"); demo4(); letrasm(" Y QUE TAL UN TUNEL INCREIBLEBLE"); demo5(); demo6(); } //DEMO1 void demo1() { char texto1[100]={"OGA MUESTRA"}; int V; int a=0,ac1,color; int i=0; int n[100],l; int c=48,c1=0,x=0,y=250; delay(500); //Flan l=strlen(texto1); for(a=0;a170&&!kbhit()) { while(a0; contador--) { putpixel (ancho, alto, byte); ancho++; } } } } fclose(fp); } else return ERROR; return OK; } int CargaPaleta(char *file) { int index; FILE *fp; if ( (fp=fopen( file, "rb" ) ) == NULL ) return ERROR; if ( fseek( fp, -768L, SEEK_END ) == 0 ) { for (index=0; index<256; index++) { // get the red component // get the green component // get the blue component // set components setrgbpalette( index, (getc(fp) >> 2), (getc(fp) >> 2), (getc(fp) >> 2) ); } // end for index } fclose( fp ); return OK; } void InicializaSVGA(void) { int Gd = DETECT, Gm; int Drv, errorcode; installuserdriver("Svga256",DetectVGA256); // registerfarbgidriver(Svga256_fdriver); initgraph(&Gd,&Gm,"c:\\program\\borlandc\\bgi"); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { cprintf("Graphics error: %s\n", grapherrormsg(errorcode)); cprintf("Presione una tecla para finalizar:"); getch(); exit(1); /* return with error code */ } } //DEMO5 void demo5() { int ok=0; RellenaTablas(); // Cambiamos a modo grafico asm mov ax, 0x13 asm int 0x10 // ¨ Porque no mejoramos la paleta 16x2 ? CreaPaleta(); ReadPal(Pal); { auto int I, J; /* // (* Use this if you want to view the palette *) for( I=0; I<255; I++ ) { for( J=0; J<20; J++ ) Put(I,J,I); } getch(); */ } while( kbhit() ) getch(); ok = 0; //TUNEL while(ok<4000&&!kbhit()) { TunelEstrellas(); ok++; } // PERFECCION_CIRCULO = 360; /*while( !ok ) { if ( kbhit() ) switch( getch() ) { case 13: qeu = !qeu; Pal[0].R = qeu ? 255:0; Pal[0].G = qeu ? 255:0; Pal[0].B = qeu ? 255:0; WritePal(Pal); break; case 32: getch(); break; case 27: ok = 1; break; case '+': PERFECCION_CIRCULO++; _fmemset( MK_FP( 0xA000, 0 ), 0, 320*200 ); break; case '-': PERFECCION_CIRCULO--; if ( PERFECCION_CIRCULO < 1 ) PERFECCION_CIRCULO = 1; _fmemset( MK_FP( 0xA000, 0 ), 0, 320*200 ); break; } */ //} // Cambiamos a modo texto asm mov ax, 3 asm int 0x10 } //Funcion de DEMO5 void RellenaTablas(void) { float angle; angle = 0; while( angle < 256 ) { XSinMov[angle] = YSinMov[angle] = (int)( sin( (2*M_PI*angle*1.4)/360 ) * 360) / (2*M_PI); YSinMov[angle] = 0; angle+=1; }; angle = 0; while( angle < (360+90) ) { TSin[angle] = (int)(sin( (2*M_PI*angle)/360 ) * 360 / (2*M_PI) ); angle+=1; }; } //Funcion de DEMO5 void Put( int x, int y, char c) { if ( x < 0 || x >= 320 ) return; if ( y < 0 || y >= 200 ) return; // { Written by Matt Sottile } asm mov ax,y asm mov bx,ax asm shl ax,8 asm shl bx,6 asm add bx,ax asm add bx,x asm mov ax,0xa000 asm mov es,ax asm mov al,c asm mov es:[bx],al }; //Funcion de DEMO5 // Circulo con impresi¢n de giro ( MEJORA POR JD ) void Circulo( int x, int y, int radio, int giro, int Color ) { int angle; for ( angle = 0; angle < 360; angle+=PERFECCION_CIRCULO ) Put( x + (radio*FACTOR_SERPIENTE*TSin[ (giro + angle)%360 + 90 ]), y + (radio*FACTOR_SERPIENTE*TSin[ (giro+angle)%360 ]), angle >= 0 && angle <= 50 ? (Color-PROFUNDIDAD_TUNEL) : Color ); }; //Funcion de DEMO5 // Circulo con impresi¢n de giro ( MEJORA POR JD ) void CirculoB( int x, int y, int radio, int giro ) { int angle; for ( angle = 0; angle < 360; angle+=PERFECCION_CIRCULO ) Put( x + (radio*FACTOR_SERPIENTE*TSin[ (giro + angle)%360 + 90 ]), y + (radio*FACTOR_SERPIENTE*TSin[ (giro+angle)%360 ]), 0 ); }; //Funcion de DEMO5 void TunelEstrellas(void) { int depth, Color; static unsigned char ZMov = 0; static int GiroAngular = 0; unsigned char Movimiento = ZMov; static Subidon = 255; static Velocidad = 0; // Controles de giro por JD: // SUAVE ZMov // DURO Movimiento int OGiroAngular = GiroAngular = 60; // GiroAngular = ( GiroAngular++ ) % 360; ZMov ++; Movimiento = ZMov; Color = 255-PROFUNDIDAD_TUNEL; // Color = 255; Velocidad++; if ( Velocidad == 5 ) { Velocidad = 0; // Subidon --; if ( Subidon < 255-PROFUNDIDAD_TUNEL ) Subidon = 255; Subidon = (Subidon++)%PROFUNDIDAD_TUNEL; } for ( depth=0; depth=0; depth-=SALTOS_ANCHOS*INCREMENTAL, Movimiento+=SALTOS_PROFUNDOS, Color-- ) { /* OGiroAngular = GiroAngular; GiroAngular = ( GiroAngular++ ) % 360; */ // Borra el anterior CirculoB( XSinMov[(unsigned char)(Movimiento-1)] + 160, YSinMov[(unsigned char)(Movimiento-1)] + 100, RADIO - depth*BLOQUEO_RADIO, OGiroAngular + 0*Movimiento ); Subidon = (Subidon++)%PROFUNDIDAD_TUNEL; // Dibuja el nuevo circulo // Circulo( XSinMov[Movimiento] + 160, YSinMov[Movimiento] + 100, RADIO - depth*BLOQUEO_RADIO, GiroAngular + 0*Movimiento, (Subidon >= Color && Subidon <= Color + 2 ) ? 1: Color ); Circulo( XSinMov[Movimiento] + 160, YSinMov[Movimiento] + 100, RADIO - depth*BLOQUEO_RADIO, GiroAngular + 0*Movimiento, Subidon%6 == 0 || Subidon%6 == 1 ? 1+Subidon : Color); } // delay(10); } //Funcion de DEMO5 void ReadPal( VGAPaletteType K ) { struct REGPACK outR; outR.r_ax = 0x1017; outR.r_bx = 0; outR.r_cx = 256; outR.r_es = FP_SEG(K); outR.r_dx = FP_OFF(K); while( ( inport(0x03DA) & 0x08 ) == 0x08 ); // {Wait for rescan} intr( 0x10, &outR ); }; //Funcion de DEMO5 void WritePal( VGAPaletteType K ) { struct REGPACK outR; outR.r_ax = 0x1012; outR.r_bx = 0; outR.r_cx = 256; outR.r_es = FP_SEG(K); outR.r_dx = FP_OFF(K); while( ( inport(0x03DA) & 0x08 ) == 0x08 ); // {Wait for rescan} intr( 0x10, &outR ); }; //Funcion de DEMO5 void CreaPaleta(void) { unsigned char I; memset( Pal, 0, sizeof(Pal) ); Pal[1].R = 255; Pal[1].G = 255; Pal[1].B = 255; Pal[255].R = 20; Pal[255].G = 0; Pal[255].B = 0; for ( I=254/*MaxColor*/; I > 254-PROFUNDIDAD_TUNEL; I-- ) { Pal[I] = Pal[I+1]; { if ( Pal[I].R<63 ) Pal[I].R++; if ( Pal[I].R<63 ) Pal[I].R++; if ( (I % 2==0) && (Pal[I].G<53) ) Pal[I].G++; if ( (I % 2==0) && (Pal[I].B<63) ) Pal[I].B++; } } #ifdef TODO_GRIS Pal[5].R = 255; Pal[5].G = 255; Pal[5].B = 255; for ( I=5; I < 255; I++ ) { Pal[I] = Pal[I-1]; { Pal[I].R--; Pal[I].G--; Pal[I].B--; } } #endif Pal[255-PROFUNDIDAD_TUNEL+1].R = 0; Pal[255-PROFUNDIDAD_TUNEL+1].G = 0; Pal[255-PROFUNDIDAD_TUNEL+1].B = 20; for ( I=/*MaxColor*/255-PROFUNDIDAD_TUNEL; I > 255-2*PROFUNDIDAD_TUNEL; I-- ) { Pal[I] = Pal[I+1]; { if ( Pal[I].B<63 ) Pal[I].B++; if ( Pal[I].B<63 ) Pal[I].B++; if ( (I % 2==0) && (Pal[I].G<53) ) Pal[I].G++; if ( (I % 2==0) && (Pal[I].R<63) ) Pal[I].R++; } } #ifdef TODO_BLANCO memset( Pal, 255, sizeof(Pal) ); Pal[0].R = 0; Pal[0].G = 0; Pal[0].B = 0; #endif WritePal(Pal); } //DEMO6 void demo6() { int y; int gdriver=DETECT,gmode; char texto[5][100]={"Programador:Oscar","Musica:NO HAY", "Agradecimientos a:","Jose David(el tunel es de el)", "PROMETO MEJORAR"}; initgraph(&gdriver,&gmode,"c:\\program\\borlandc\\bgi"); clearviewport(); for(y=440;y>-70;y--) { setcolor(15); if(y>1) outtextxy(230,y,texto[0]); if(y>-20&&y<430) outtextxy(230,y+20,texto[1]); if(y>-40&&y<420) outtextxy(230,y+40,texto[2]); if(y>-60&&y<410) outtextxy(230,y+60,texto[3]); delay(20); setcolor(0); if(y>1) outtextxy(230,y,texto[0]); if(y>-20&&y<430) outtextxy(230,y+20,texto[1]); if(y>-40&&y<420) outtextxy(230,y+40,texto[2]); if(y>-60&&y<410) outtextxy(230,y+60,texto[3]); } clearviewport(); letrasm(" QUIERO LA REVANCHAAAAAA ZZZZZ "); closegraph(); } //LETRAS void letrasm(char texto[100]) { //Letras moviendose int V; int finali=8,i=0,c3=0; int r=0,i1=0,ac3=0,c4=0; int n[100],l; int c=0,c1=640,x=0,y=0; int a=0,ac1=c1,color; randomize(); color=rand()%14+1; l=strlen(texto); for(a=0;a=c1||c1<0) {i++;} if(i==finali) {i=finali-8;c3++;} x=x+10; if(x==640) { c1=ac1;x=0;y=y+10;c3=ac3;c=c+8;i=c+i1;finali=c+8;} } x=0;y=0; finali=8; i=0; c=0; delay(10); c1=c1-10; ac1=c1; if(c1<0) { i1=0; if(c1>-640) r=10; else r=abs(c1)-640; while(y