home *** CD-ROM | disk | FTP | other *** search
/ CD/PC Actual 4 / CD_ACTUAL_4.iso / share / lectores / gfp / example.pak / SPRITEV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-20  |  8.1 KB  |  266 lines

  1. /*-----------------------------------------------------------------------*/
  2. /*        Mostrar un fichero .SPR de Sprite Maker             */
  3. /*                               by                                      */
  4. /*                      Pedro Antonio Martinez                           */
  5. /*-----------------------------------------------------------------------*/
  6.  
  7. #include <io.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <mem.h>
  11. #include <fcntl.h>
  12. #include <alloc.h>
  13. #include <dos.h>
  14. #include <dir.h>
  15.  
  16. void RutErr ( int cod ) ;
  17. int MostrarFichero (char *FSpec) ;
  18.  
  19. typedef unsigned char BYTE ;
  20.  
  21. typedef struct Sprite_s
  22. { int    LonX ;
  23.   int    LonY ;
  24.   BYTE    *pImagen ;
  25. } SPRITE ;
  26.  
  27.  int xAct = 1, yAct = 1 ;
  28.  int xIni = 1, yIni = 1, xInc = 5, yInc = 0 ;
  29.  int Ciclo = 0 ;
  30.  int Bkg = 0, Dly = 100 ;
  31.  int EspTec = 0 ;
  32.  
  33. int main ( int argc, char *argv[] )
  34. {
  35.  union REGS Regs ;
  36.  struct SREGS sRegs ;
  37.  int i ;
  38.  char fPal[30] = "" ;
  39.  char Pal[768] ;
  40.  int hfPal ;
  41.  
  42.  if ( argc < 2 ) RutErr ( 2 ) ;
  43.  
  44.  /*------------------------------------------------------------------------
  45.    Poner modo de video 13H (320x200, 256 colores)
  46.    ------------------------------------------------------------------------*/
  47.  Regs.x.ax = 0x13 ;
  48.  int86( 0x10, &Regs, &Regs ) ;
  49.  
  50.  for ( i = 1; i < argc; i++ )
  51.    if (*argv[i] == '/' || *argv[i] == '-' )
  52.      switch ( *(argv[i]+1) ) {
  53.     case 'x':
  54.     case 'X':
  55.       switch (*(argv[i]+2)) {
  56.             case 'i':
  57.             case 'I':
  58.                xIni = atoi ( argv[i]+3 ) ;
  59.                xAct = xIni ;
  60.                break ;
  61.             case 'd':
  62.             case 'D':
  63.                xInc = atoi ( argv[i]+3 ) ;
  64.                break ;
  65.            }
  66.          break ;
  67.     case 'y':
  68.     case 'Y':
  69.       switch (*(argv[i]+2)) {
  70.             case 'i':
  71.             case 'I':
  72.                yIni = atoi ( argv[i]+3 ) ;
  73.                yAct = yIni ;
  74.                break ;
  75.             case 'd':
  76.             case 'D':
  77.                yInc = atoi ( argv[i]+3 ) ;
  78.                break ;
  79.            }
  80.          break ;
  81.     case 'd':
  82.     case 'D': /* D=Demora */
  83.       Dly = atoi ( argv[i]+2 ) ;
  84.       break ;
  85.     case 'f':
  86.     case 'F': /* F=Color de fondo */
  87.       Bkg = atoi ( argv[i]+2 ) ;
  88.           Regs.h.ah = 0x0b ;
  89.       Regs.h.bh = 0 ;
  90.       Regs.h.bl = Bkg ;
  91.       int86 ( 0x10, &Regs, &Regs ) ;
  92.       break ;
  93.     case 'p':
  94.     case 'P': /* P=Paleta (nombre de fichero) */
  95.       strcpy(fPal, argv[i]+2 ) ;
  96.           if( (hfPal = open( fPal, O_BINARY | O_RDONLY )) == - 1 )
  97.          RutErr (4) ;  /* Error. No existe el fichero */
  98.           if( read( hfPal, Pal, 768 ) != 768 )
  99.              RutErr( 5 );
  100.           close (hfPal ) ;
  101.           Regs.x.ax = 0x1012 ;
  102.           Regs.x.bx = 0 ;
  103.           Regs.x.cx = 256 ;
  104.           sRegs.es = FP_SEG( Pal ) ;
  105.           Regs.x.dx = FP_OFF( Pal ) ;
  106.           int86x ( 0x10, &Regs, &Regs, &sRegs ) ;
  107.       break ;
  108.     case 't':
  109.     case 'T': /* T=Esperar a pulsación de tecla para cambiar el dibujo */
  110.       EspTec = 1 ;
  111.       Dly = 0 ;
  112.       break ;
  113.      }  /* switch */
  114.     else
  115.     MostrarFichero( argv[i] ) ;
  116.  
  117.  getch() ;
  118.  
  119.  /*------------------------------------------------------------------------
  120.    Volver a poner la pantalla en modo texto
  121.    ------------------------------------------------------------------------*/
  122.  Regs.x.ax = 0x03 ;
  123.  int86( 0x10, &Regs, &Regs ) ;
  124.  
  125.  exit ( 0 ) ;
  126. } /* main */
  127.  
  128.  
  129. int MostrarFichero (char *FSpec)
  130. {
  131.  int hfspr ;
  132.  SPRITE Spr ;
  133.  struct ffblk Info ;
  134.  BYTE far *ptr ;
  135.  BYTE *pFondo, *pFnd, *pImg ;
  136.  int y ;
  137.  
  138.  /*------------------------------------------------------------------------
  139.    Leer los ficheros a mostrar en pantalla (el programa admite comodines)
  140.    ------------------------------------------------------------------------*/
  141. if ( ! findfirst( FSpec, &Info, 0xffff ) )
  142. do {
  143.  if( (hfspr = open( Info.ff_name, O_BINARY | O_RDONLY )) == - 1 )
  144.     RutErr (4) ;  /* Error. No existe el fichero */
  145.  
  146.  /*------------------------------------------------------------------------
  147.    Leer las dimensiones de cada fichero .SPR y conseguir memoria para el resto
  148.    del fichero.
  149.    ------------------------------------------------------------------------*/
  150.  if( read( hfspr, &Spr, 4 ) != 4 )
  151.         RutErr( 5 );
  152.  Spr.LonX++ ;
  153.  Spr.LonY++ ;
  154.  
  155.  xAct = min( xAct, 320 - Spr.LonX ) ;
  156.  yAct = min( yAct, 200 - Spr.LonY ) ;
  157.  
  158.  Spr.pImagen = ( BYTE * ) malloc ( Spr.LonX * Spr.LonY + 4 ) ;
  159.  if ( Spr.pImagen == NULL ) RutErr ( 3 ) ; /* Error. No hay memoria */
  160.  
  161.  /*------------------------------------------------------------------------
  162.    Conseguir asimismo memoria para reservar el fondo anterior de la pantalla
  163.    ------------------------------------------------------------------------*/
  164.  pFondo = ( BYTE * ) malloc ( Spr.LonX * Spr.LonY ) ;
  165.  if ( pFondo == NULL ) RutErr ( 3 ) ; /* Error. No hay memoria */
  166.  
  167.  ptr = (BYTE far*) MK_FP( 0xA000, 0x0000 ) ;
  168.  ptr += 320 * ( yAct - 1 ) + xAct - 1 ;
  169.  for ( y = 0, pFnd = pFondo; y < Spr.LonY; y++ ) {
  170.     movedata( FP_SEG(ptr), FP_OFF(ptr), FP_SEG(pFnd), FP_OFF(pFnd), Spr.LonX ) ;
  171.     ptr += 320 ;
  172.     pFnd += Spr.LonX ;
  173.  }
  174.  
  175.  /*------------------------------------------------------------------------
  176.    Leer los datos del sprite (resto del fichero)
  177.    ------------------------------------------------------------------------*/
  178.  if( read( hfspr, Spr.pImagen + 4, Spr.LonX * Spr.LonY ) != Spr.LonX * Spr.LonY )
  179.         RutErr( 5 );
  180.  
  181.  /*------------------------------------------------------------------------
  182.    Mostrar el sprite en pantalla
  183.    ------------------------------------------------------------------------*/
  184.  *( (int*) Spr.pImagen) = Spr.LonX ;
  185.  *( (int*) (Spr.pImagen+2)) = Spr.LonY ;
  186.  
  187.  ptr = (BYTE far*) MK_FP( 0xA000, 0x0000 ) ;
  188.  ptr += 320 * ( yAct - 1 ) + xAct - 1 ;
  189.  for ( y = 0, pImg = Spr.pImagen + 4; y < Spr.LonY; y++ ) {
  190.     movedata( FP_SEG(pImg), FP_OFF(pImg), FP_SEG(ptr), FP_OFF(ptr), Spr.LonX ) ;
  191.     ptr += 320 ;
  192.     pImg += Spr.LonX ;
  193.  }
  194.  
  195.  /*------------------------------------------------------------------------
  196.    Liberar la memoria y cerrar el fichero
  197.    ------------------------------------------------------------------------*/
  198.  close( hfspr ) ;
  199.  free ( Spr.pImagen ) ;
  200.  
  201.  /*------------------------------------------------------------------------
  202.    Esperar a que se pulse una tecla para mostrar el siguiente
  203.    ------------------------------------------------------------------------*/
  204.  if ( EspTec )
  205.     if ( getch() == 27 ) break ;
  206.  delay ( Dly ) ;
  207.  
  208.  ptr = (BYTE far*) MK_FP( 0xA000, 0x0000 ) ;
  209.  ptr += 320 * ( yAct - 1 ) + xAct - 1 ;
  210.  for ( y = 0, pFnd = pFondo; y < Spr.LonY; y++ ) {
  211.     movedata( FP_SEG(pFnd), FP_OFF(pFnd), FP_SEG(ptr), FP_OFF(ptr), Spr.LonX ) ;
  212.     ptr += 320 ;
  213.     pFnd += Spr.LonX ;
  214.  }
  215.  free ( pFondo ) ;
  216.  
  217.  xAct += xInc ;
  218.  yAct += yInc ;
  219. } while ( ! findnext( &Info ) ) ;
  220.  
  221. } /* MostrarFichero */
  222.  
  223.  /*------------------------------------------------------------------------
  224.    Función para terminación anormal
  225.    ------------------------------------------------------------------------*/
  226. void RutErr ( int cod )
  227. {
  228. union REGS Regs ;
  229.  
  230. switch ( cod ) {
  231.   case 2:
  232.         printf(" Sintaxis: SPRITEV [opciones] fichero(s) [fichero(s)] ...\n" ) ;
  233.         printf(" Opciones: -XInnn: X Inicial nnn\n" ) ;
  234.         printf("           -YInnn: Y Inicial nnn\n" ) ;
  235.         printf("           -XDnnn: Incremto. X nnn\n" ) ;
  236.         printf("           -YDnnn: Incremto. Y nnn\n" ) ;
  237.         printf("           -Dnnn : Demora nnn milisegundos\n" ) ;
  238.         printf("           -Fnnn : Color de Fondo nnn\n" ) ;
  239.         printf("           -T    : Esperar pulsación de tecla\n" ) ;
  240.         printf("           -Pfichero: Fichero de paleta\n" ) ;
  241.         printf(" Fichero(s): Admite comodines\n" ) ;
  242.     break ;
  243.   case 3:
  244.         printf(" Error: no hay memoria" ) ;
  245.     break ;
  246.   case 4:
  247.         printf(" Error al abrir fichero de origen" ) ;
  248.     break ;
  249.   case 5:
  250.         printf(" Error leyendo fichero de origen" ) ;
  251.     break ;
  252.   case 6:
  253.         printf(" Error al poner modo de video " ) ;
  254.     break ;
  255.   default:
  256.         printf(" Error de ejecución número: %d.", cod) ;
  257.     break ;
  258.  }
  259.  printf("\nPulsar cualquier tecla") ;
  260.  getch() ;
  261.  
  262.  Regs.x.ax = 0x03 ;
  263.  int86( 0x10, &Regs, &Regs ) ;
  264.  
  265.  exit ( cod ) ;
  266. }