PLANE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *  Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved.
  5.  *
  6.  *  File:       plane.c
  7.  *  Content:    plane manipulation functions
  8.  *
  9.  ***************************************************************************/
  10. #include "foxbear.h"
  11. /*
  12.  * CreatePlane
  13.  */
  14. HPLANE *CreatePlane ( USHORT width, USHORT height, USHORT denom )
  15. {
  16.     HPLANE      *hPlane;
  17.     USHORT      num_elems;
  18.     USHORT      elem_size;
  19.     num_elems = width * height;
  20.     elem_size = sizeof (GFX_HBM);
  21.     hPlane = MemAlloc( sizeof (HPLANE) );
  22.     if( hPlane == NULL )
  23.     {
  24. ErrorMessage( "hPlane in CreatePlane" );
  25.     }
  26.     hPlane->hBM  = CMemAlloc( num_elems, elem_size );
  27.     hPlane->surface = CMemAlloc( num_elems, sizeof hPlane->surface );
  28.     hPlane->x = 0;
  29.     hPlane->y = 0;
  30.     hPlane->width = width;
  31.     hPlane->height = height;
  32.     hPlane->denom = denom;
  33.     hPlane->xslide = 0;
  34.     hPlane->xincrem = 0;
  35.     hPlane->xv = 0;
  36.     if( hPlane->hBM == NULL )
  37.     {
  38. MemFree( hPlane );
  39. ErrorMessage( "hPlane->hBM in CreatePlane" );
  40.     }
  41.     return hPlane;
  42. } /* CreatePlane */
  43. /*
  44.  * TilePlane
  45.  */
  46. BOOL TilePlane( HPLANE *hPlane, HBITMAPLIST *hTileList, HPOSLIST *posList )
  47. {
  48.     USHORT i;
  49.     for( i = 0; i < hPlane->width * hPlane->height; ++i )
  50.     {
  51. hPlane->surface[i] = FALSE;
  52. if( posList[i] >= 0 )
  53. {
  54.     hPlane->hBM[i] = hTileList[ posList[i] ].hBM;
  55. }
  56. else
  57. {
  58.     hPlane->hBM[i] = NULL;
  59. }
  60.     }
  61.     return TRUE;
  62. } /* TilePlane */
  63. /*
  64.  * SurfacePlane
  65.  */
  66. BOOL SurfacePlane( HPLANE *hPlane, HSURFACELIST *hSurfaceList )
  67. {
  68.     USHORT i;
  69.     for( i = 0; i < hPlane->width * hPlane->height; ++i )
  70.     {
  71. if( hSurfaceList[i] == FALSE )
  72. {
  73.     hPlane->surface[i] = FALSE;
  74. }
  75. else
  76. {
  77.     hPlane->surface[i] = TRUE;
  78. }
  79.     }
  80.     return TRUE;
  81. } /* SurfacePlane */
  82. /*
  83.  * SetSurface
  84.  */
  85. BOOL SetSurface( HPLANE  *hPlane, HSPRITE *hSprite )
  86. {
  87.     SHORT c;
  88.     SHORT n;
  89.     SHORT x;
  90.     SHORT y;
  91.     c = hSprite->currentBitmap;
  92.     x = (hSprite->x >> 16) / C_TILE_W;
  93.     y = (SHORT) hSprite->y >> 16;
  94.     y += hSprite->hSBM[c].y + hSprite->hSBM[c].height;
  95.     y /= C_TILE_H;
  96.     n = (x % hPlane->width) + y * hPlane->width;
  97.     if( hPlane->surface[n] == FALSE )
  98.     {
  99. if( !hPlane->surface[n + hPlane->width] == FALSE )
  100. {
  101.     y += 1;
  102. }
  103. if( !hPlane->surface[n - hPlane->width] == FALSE )
  104. {
  105.     y -= 1;
  106. }
  107.     }
  108.     
  109.     y *= C_TILE_H;
  110.     y -= hSprite->hSBM[c].y + hSprite->hSBM[c].height;
  111.     SetSpriteY( hSprite, y << 16, P_ABSOLUTE );
  112.     return TRUE;
  113. } /* SetSurface */
  114. /*
  115.  * GetSurface
  116.  */
  117. BOOL GetSurface( HPLANE *hPlane, HSPRITE *hSprite )
  118. {   
  119.     SHORT  c;
  120.     SHORT  x;
  121.     SHORT  y;
  122.     c = hSprite->currentBitmap;
  123.     x = ((hSprite->x >> 16) + hSprite->width / 2) / C_TILE_H;
  124.     y = ((hSprite->y >> 16) + hSprite->hSBM[c].y + hSprite->hSBM[c].height) / C_TILE_W;
  125.     return hPlane->surface[(x % hPlane->width) + y * hPlane->width];
  126. } /* GetSurface */
  127. /*
  128.  * SetPlaneX
  129.  */
  130. BOOL SetPlaneX( HPLANE *hPlane, LONG x, POSITION position )
  131. {
  132.     LONG xincrem;    
  133.     if( position == P_ABSOLUTE )
  134.     {
  135. hPlane->x = x;
  136.     }
  137.     else if( position == P_RELATIVE )
  138.     {
  139. hPlane->x += x;
  140.     }
  141.     else if( position == P_AUTOMATIC )
  142.     {
  143. if( hPlane->xslide > 0 )
  144. {
  145.     xincrem = hPlane->xincrem;
  146. }
  147. else if( hPlane->xslide < 0 )
  148. {
  149.     xincrem = -hPlane->xincrem;
  150. }
  151. else
  152. {
  153.     xincrem = 0;
  154. }
  155. hPlane->x += (hPlane->xv + xincrem) / hPlane->denom;
  156. hPlane->xslide -= xincrem;
  157. hPlane->xv = 0;
  158. if( abs(hPlane->xslide) < hPlane->xincrem )
  159. {
  160.     hPlane->x += hPlane->xslide / hPlane->denom;
  161.     hPlane->xslide = 0;
  162.     hPlane->xincrem = 0;
  163. }
  164.     }
  165.     if( hPlane->x < 0 )
  166.     {
  167. hPlane->x += (hPlane->width * C_TILE_W) << 16;
  168.     }
  169.     else if( hPlane->x >= (hPlane->width * C_TILE_W) << 16 )
  170.     {
  171. hPlane->x -= (hPlane->width * C_TILE_W) << 16;
  172.     }
  173.     return TRUE;
  174. } /* SetPlaneX */
  175. /*
  176.  * GetPlaneX
  177.  */
  178. LONG GetPlaneX( HPLANE *hPlane )
  179. {
  180.     return hPlane->x;
  181. } /* GetPlaneX */
  182. /*
  183.  * SetPlaneY
  184.  */
  185. BOOL SetPlaneY( HPLANE *hPlane, LONG y, POSITION position )
  186. {
  187.     if( position == P_ABSOLUTE )
  188.     {
  189. hPlane->y = y;
  190.     }
  191.     else
  192.     {
  193. hPlane->y += y;
  194.     }
  195.     if( hPlane->y < 0 )
  196.     {
  197. hPlane->y += (hPlane->height * C_TILE_H) << 16;
  198.     }
  199.     else if( hPlane->y >= (hPlane->height * C_TILE_H) << 16 )
  200.     {
  201. hPlane->y -= (hPlane->height * C_TILE_H) << 16;
  202.     }
  203.     return TRUE;
  204. } /* SetPlaneY */
  205. /*
  206.  * GetPlaneY
  207.  */
  208. LONG GetPlaneY( HPLANE *hPlane )
  209. {
  210.     return hPlane->y;
  211. } /* GetPlaneY */
  212. /*
  213.  * SetPlaneSlideX
  214.  */
  215. BOOL SetPlaneSlideX( HPLANE *hPlane, LONG xslide, POSITION position )
  216. {
  217.     if( position == P_ABSOLUTE )
  218.     {
  219. hPlane->xslide = xslide;
  220.     }
  221.     else if( position == P_RELATIVE )
  222.     {
  223. hPlane->xslide += xslide;
  224.     }
  225.     return TRUE;
  226. } /* SetPlaneSlideX */
  227. /*
  228.  * SetPlaneVelX
  229.  */
  230. BOOL SetPlaneVelX( HPLANE *hPlane, LONG xv, POSITION position )
  231. {
  232.     if( position == P_ABSOLUTE )
  233.     {
  234. hPlane->xv = xv;
  235.     }
  236.     else if( position == P_RELATIVE )
  237.     {
  238. hPlane->xv += xv;
  239.     }
  240.     return TRUE;
  241. } /* SetPlaneVelX */
  242. /*
  243.  * SetPlaneIncremX
  244.  */
  245. BOOL SetPlaneIncremX( HPLANE *hPlane, LONG xincrem, POSITION position )
  246. {
  247.     if( position == P_ABSOLUTE )
  248.     {
  249. hPlane->xincrem = xincrem;
  250.     }
  251.     else if( position == P_RELATIVE )
  252.     {
  253. hPlane->xincrem += xincrem;
  254.     }
  255.     return TRUE;
  256. } /* SetPlaneIncremX */
  257. /*
  258.  * ScrollPlane
  259.  */
  260. BOOL ScrollPlane( HSPRITE *hSprite )
  261. {
  262.     if( (GetSpriteX(hSprite) <= C_FOX_STARTX) && (GetSpriteVelX(hSprite) < 0) )
  263.     {
  264. return TRUE;
  265.     }
  266.     if( (GetSpriteX(hSprite) >= C_FOX_STARTX) && (GetSpriteVelX(hSprite) > 0) )
  267.     {
  268. return TRUE;
  269.     }
  270.     return FALSE;
  271. } /* ScrollPlane */
  272. /*
  273.  * DisplayPlane
  274.  */
  275. BOOL DisplayPlane ( GFX_HBM  hBuffer, HPLANE *hPlane )
  276. {
  277.     USHORT      n;
  278.     USHORT      i;
  279.     USHORT      j;
  280.     USHORT      x1;
  281.     USHORT      y1;
  282.     USHORT      x2;
  283.     USHORT      y2;
  284.     USHORT      xmod;
  285.     USHORT      ymod;
  286.     POINT       src;
  287.     RECT        dst;
  288.     x1 = (hPlane->x >> 16) / C_TILE_W;          
  289.     y1 = (hPlane->y >> 16) / C_TILE_H;
  290.     x2 = x1 + C_SCREEN_W / C_TILE_W;
  291.     y2 = y1 + C_SCREEN_H / C_TILE_H;
  292.     xmod = (hPlane->x >> 16) % C_TILE_W;
  293.     ymod = (hPlane->y >> 16) % C_TILE_H;
  294.     for( j = y1; j < y2; ++j )
  295.     {
  296. for( i = x1; i <= x2; ++i )
  297. {
  298.     n = (i % hPlane->width) + j * hPlane->width;
  299.     if( hPlane->hBM[n] != NULL )
  300.     {
  301. if( i == x1 )
  302. {
  303.     dst.left  = 0;
  304.     dst.right = dst.left + C_TILE_W - xmod;
  305.     src.x     = xmod;
  306. }
  307. else if( i == x2 )
  308. {
  309.     dst.left  = (i - x1) * C_TILE_W - xmod;
  310.     dst.right = dst.left + xmod;
  311.     src.x     = 0;
  312. } else {
  313.     dst.left  = (i - x1) * C_TILE_W - xmod;
  314.     dst.right = dst.left + C_TILE_W;
  315.     src.x     = 0;
  316. }
  317.     
  318. if( j == y1 )
  319. {
  320.     dst.top    = 0;
  321.     dst.bottom = dst.top + C_TILE_H - ymod;
  322.     src.y      = ymod;
  323. }
  324. else if( j == y2 )
  325. {
  326.     dst.top    = (j - y1) * C_TILE_H - ymod;
  327.     dst.bottom = dst.top + ymod;
  328.     src.y      = 0;
  329. } else {
  330.     dst.top    = (j - y1) * C_TILE_H - ymod;
  331.     dst.bottom = dst.top + C_TILE_H;
  332.     src.y      = 0;
  333. }
  334.  
  335. gfxBlt(&dst,hPlane->hBM[n],&src);
  336.     }
  337. }
  338.     }
  339.     return TRUE;
  340. } /* DisplayPlane */
  341. /*
  342.  * DestroyPlane
  343.  */
  344. BOOL DestroyPlane ( HPLANE *hPlane )
  345. {
  346.     if( hPlane == NULL )
  347.     {
  348. ErrorMessage( "hPlane in DestroyPlane" );
  349.     }
  350.     if( hPlane->hBM == NULL )
  351.     {
  352. ErrorMessage( "hPlane->hBM in DestroyPlane" );
  353.     }
  354.     MemFree( hPlane->hBM );
  355.     MemFree( hPlane );
  356.     return TRUE;
  357. } /* DestroyPlane */