www.pudn.com > bmbrsrc > BomberSprites.c


//Load the sprites 
void LoadSprites () 
{ 
  FILE          *SSFFile; 
  unsigned char RGBPal [256][3]; 
  int           DAC; 
 
  //Assign memory to sprite buffer 
  SpriteBuf = (char *)malloc (64000); 
 
  //Load graphics data from file 
  SSFFile = fopen ("BOMBER0.SSF", "rb"); 
  fread (SpriteBuf, 7, 1, SSFFile); 
  fread (SpriteBuf, 320, 200, SSFFile); 
  fread (RGBPal, 3, 256, SSFFile); 
  fclose (SSFFile); 
 
  //Convert palette 
  for (DAC = 0; DAC < 256; DAC++) { 
    RGBPal [DAC][0] <<= 2; 
    RGBPal [DAC][1] <<= 2; 
    RGBPal [DAC][2] <<= 2; 
    Palette [DAC] = (RGBPal [DAC][0]) + 
                    (RGBPal [DAC][1] << 8) + 
                    (RGBPal [DAC][2] << 16); 
  } 
} 
 
//Load the sprites 
void LoadBlocks () 
{ 
  FILE          *SSFFile; 
  unsigned char Pixel; 
  unsigned char RGBPal [256][3]; 
  int           DAC, o1, o2; 
  char          *RawBuf; 
 
  //Assign memory to sprite buffer 
  RawBuf = (char *)malloc (64000); 
  BlocksBuf = (char *)malloc (192000); 
 
  //Load graphics data from file 
  SSFFile = fopen ("BOMBER1.SSF", "rb"); 
  fread (RawBuf, 7, 1, SSFFile); 
  fread (RawBuf, 320, 200, SSFFile); 
  fread (RGBPal, 3, 256, SSFFile); 
  fclose (SSFFile); 
 
  //Convert palette 
  for (DAC = 0; DAC < 256; DAC++) { 
    RGBPal [DAC][0] <<= 2; 
    RGBPal [DAC][1] <<= 2; 
    RGBPal [DAC][2] <<= 2; 
    Palette [DAC] = (RGBPal [DAC][0]) + 
                    (RGBPal [DAC][1] << 8) + 
                    (RGBPal [DAC][2] << 16); 
  } 
 
  //Save as 24bit data 
  o2 = 0; 
  for (o1 = 0; o1 < 64000; o1++) { 
    Pixel = RawBuf [o1]; 
    BlocksBuf [o2++] = RGBPal [Pixel][2]; 
    BlocksBuf [o2++] = RGBPal [Pixel][1]; 
    BlocksBuf [o2++] = RGBPal [Pixel][0]; 
  } 
} 
 
//This reads a pixel from the sprite buffer 
unsigned char ReadPixel (int x, int y) 
{ 
  return SpriteBuf [(y << 8) + (y << 6) + x]; 
} 
 
void Blit (int x, int y, int x1, int y1, int w, int h) 
{ 
  int   yt; 
 
  x *= 3; 
  x1 *= 3; 
  w *= 3; 
  //Do blits 
  for (yt = 0; yt < h; yt++) 
    memcpy ((char *)TargetData + 221136 - (y + yt) * 816 + x, 
            (char *)BlocksBuf + (y1 + yt) * 960 + x1, 
            w); 
 
} 
 
//This draws a sprite onto the device context 
void DrawBlock (int x, int y, int x1, int y1) 
{ 
  int   yt; 
 
  //Convert coordinates 
  x *= 48; 
  y <<= 4; 
  x1 *= 48; 
  y1 <<= 4; 
 
  //Draw each pixel 
  for (yt = 0; yt < 16; yt++) 
    memcpy ((char *)TargetData + 221136 - (y + yt) * 816 + x, 
            (char *)BlocksBuf + (y1 + yt) * 960 + x1, 
            48); 
} 
 
//This draws a transparent sprite onto the device context 
void DrawTSprite (int x, int y, int x1, int y1, int xs, int ys) 
{ 
  int           xt, yt; 
  unsigned char c; 
 
  for (xt = 0; xt < xs; xt++) for (yt = 0; yt < ys; yt++) { 
    c = ReadPixel (x1 + xt, y1 + yt); 
    if (c) SetPixel (MainDC, x + xt, y + yt, Palette [c]); 
  } 
}