?? cbshadow.cpp
字號:
/////////////////////
// CBShadow.cpp : v0012
// Written by : Liu Gang
// Compiler : Microsoft Visual C++ 4.0 & DirectX
// Library : DDraw.Lib
// Copyright : WayAhead Software Co.Ltd. 1996-1997
// v0010 : Feb.10.1997
// v0011 : Mar.28.1997, changed SHADOW_sItem to SHADOW_psItem
// v0012 : May.2.1997, make Drawall() faster if need not to draw the whole screen
/////////////////////
// implementation file
// shadow functions
// 包括對陰影和雨雪等特殊效果的操作
/////////////////////
//
/////////////////////
#include "stdafx.h"
#include "assert.h"
#include "DDCompo.h"
#include "CBShadow.h"
#include "CBDraw.h"
#include "CBMap.h"
#include "CBMini.h" // 與縮略圖有關
/////////////////////
// from CBDraw.cpp
extern RECT DRAW_rcClient;
extern POINT DRAW_ptScreenOffset;
extern RECT DRAW_rcScreen;
// from CBMap.cpp
extern POINT MAP_ptSenser[2][MAP_SENSER_MAX][8*MAP_SENSER_MAX];
extern int MAP_nLocationNum[4];
extern int MAP_nDrawNum[4];
// other map surfaces, in CBDraw.cpp
extern class CDDSurface DRAW_sOtherMap[MAP_OTHER_NUM];
/////////////////////
/////////////////////
// global control
// 雖然Disable,SHADOW_sBack和SHADOW_psItem都是要申請的
BOOL SHADOW_bEnable = TRUE;
// array for second layer of shadow
char cMap_shadowEx [MAP_DATA_WIDTH][MAP_DATA_HEIGHT]; //lwc計錄是否貼陰影;
// shadow surface
class CDDSurface SHADOW_sBack, *SHADOW_psItem;
BOOL SHADOW_bCreated = FALSE;
/////////////////////
/////////////////////
// local functions
inline RECT SHADOW_GetShadowRect( int nCol, int nRow );
inline void SHADOW_DrawItem( int nX, int nY, int nDraw, CONST RECT *prcCut );
/////////////////////
/////////////////////
// load shadow surfaces
// return : TRUE if successful
BOOL SHADOW_Load()
{
#ifdef _DEBUG
if( SHADOW_bCreated )
{
ErrorMessage( hwndGame, SHADOW_ERROR_ID+0, "Shadow surfaces have been created!" );
return FALSE;
}
#endif
// load shadow background surface
// same size as client area
// do not has color key , in video memory
if( !SHADOW_sBack.Create( DRAW_rcClient.right-DRAW_rcClient.left,
DRAW_rcClient.bottom-DRAW_rcClient.top, FALSE, TRUE ) )
{
OutputDebugString( "SHADOW_Load: Cannot create back surface in video memory!\n" );
if( !SHADOW_sBack.Create( DRAW_rcClient.right-DRAW_rcClient.left,
DRAW_rcClient.bottom-DRAW_rcClient.top, FALSE, FALSE ) )
{
ErrorMessage( hwndGame, SHADOW_ERROR_ID+1, "Cannot create shadow background surface!" );
return FALSE;
}
}
// set color key seperately
SHADOW_sBack.SetColorKeyPAL( 83 ); // red is color key
SHADOW_sBack.Erase( 0 );// BLACK, RGB(0,0,0)//lwc
// load shadow source image file
// color key, system memory
//if( !SHADOW_sItem.LoadBitmap( filename, TRUE, FALSE ) )
SHADOW_psItem = &DRAW_sOtherMap[6];
if( SHADOW_psItem == NULL || SHADOW_psItem->GetSurface() == NULL )
{
ErrorMessage( hwndGame, SHADOW_ERROR_ID+2, "Cannot create shadow item surface!" );
return FALSE;
}
SHADOW_psItem->SetColorKeyDEF();
SHADOW_bCreated = TRUE;
return TRUE;
}
// release shadow surfaces
void SHADOW_Release()
{
#ifdef _DEBUG
if( !SHADOW_bCreated )
{
ErrorMessage( hwndGame, SHADOW_ERROR_ID+10, "Try to release shadow surfaces before load them!" );
return;
}
#endif
SHADOW_sBack.Release();
// SHADOW_sItem.Release();
SHADOW_bCreated = FALSE;
}
void SHADOW_Clear()
{
memset( cMap_shadowEx, 0, sizeof( char )*MAP_DATA_WIDTH*MAP_DATA_HEIGHT ); //清空
}
/////////////////////
/////////////////////
RECT SHADOW_GetShadowRect( int nCol, int nRow )
{
int left, top;
RECT rect;
top = nRow*(MAP_Lib.szItem.cy>>1);
if( (nRow&1) == 0 )
{
left = nCol*MAP_Lib.szItem.cx;
}
else
{
left = nCol*MAP_Lib.szItem.cx+(MAP_Lib.szItem.cx>>1);
}
// re-adjust coords
left -= DRAW_ptScreenOffset.x;
top -= DRAW_ptScreenOffset.y;
rect.left = left, rect.top = top,
rect.right = left+MAP_Lib.szItem.cx,
rect.bottom = top + MAP_Lib.szItem.cy;
return rect;
}
void SHADOW_DrawItem( int nX, int nY, int nDraw, CONST RECT *prcCut )
{
if (nDraw ==2) return; //lwc
if( SHADOW_bEnable == FALSE ) return; // if disable shadow, do nothing
#ifdef _DEBUG
if( nDraw > 9 || nDraw < 0 )
OutputDebugString( "SHADOW_DrawItem Error: Input index error, out of range!\n" );
#endif
RECT rect;
RECT rcCutS, rcCutSOld;
rcCutSOld = SHADOW_GetShadowRect( nX, nY );
if( IntersectRect( &rcCutS, &rcCutSOld, prcCut ) )
{
POINT ptTLOff, ptRBOff;
ptTLOff.x = rcCutSOld.left - rcCutS.left;
ptTLOff.y = rcCutSOld.top - rcCutS.top;
ptRBOff.x = rcCutSOld.right - rcCutS.right;
ptRBOff.y = rcCutSOld.bottom - rcCutS.bottom;
// calc source position and size
rect.left = 0-ptTLOff.x;
rect.right = (rcCutSOld.right - rcCutSOld.left) - ptRBOff.x;
rect.top = nDraw*(rcCutSOld.bottom - rcCutSOld.top) - ptTLOff.y;
rect.bottom = (nDraw+1)*(rcCutSOld.bottom - rcCutSOld.top) - ptRBOff.y;
// draw
POINT ptDest;
ptDest.x = rcCutS.left-DRAW_rcClient.left, ptDest.y = rcCutS.top-DRAW_rcClient.top;
LPDIRECTDRAWSURFACE2 psurSrc = SHADOW_psItem->GetSurface();
LPDIRECTDRAWSURFACE2 psurDest = SHADOW_sBack.GetSurface();
DD_BltSurface( ptDest, psurDest, &rect, psurSrc, DDBLTFAST_SRCCOLORKEY );
}
}
//存在
void SHADOW_existent(int nX,int nY,int nRange)
{
int i,j;
WORD codeR;
struct MAP_REGION_CODE_STRUCT stctR;
int bOdd;
int nDrawX, nDrawY;
// draw current position
nDrawX = nX, nDrawY = nY;
if (cMap_shadowEx[nDrawX][nDrawY]==0)
{
codeR = MAP_GetRegionData( nDrawX, nDrawY );
MAP_RegionDeCode( codeR, &stctR );
stctR.nShadowEx = 0 ;///nVal;//lwc
SHADOW_DrawItem( nDrawX, nDrawY, 0, &DRAW_rcClient );//lwc
// 縮略圖
MINI_SetGroundData( nDrawX, nDrawY, 0 );
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( nDrawX, nDrawY, codeR ); //lwc
}
Assert( cMap_shadowEx[nDrawX][nDrawY]>=0 );
cMap_shadowEx[nDrawX][nDrawY]++;//
bOdd = nY&1;
for( i=0; i< nRange; i++ )//lwc < 改==
for( j=0; j< ((i+1)<<3); j++ )
{
nDrawX = nX + MAP_ptSenser[bOdd][i][j].x;
nDrawY = nY + MAP_ptSenser[bOdd][i][j].y;
if( nDrawX < 0 || nDrawX >= MAP_Lib.szNum.cx) continue;
if( nDrawY < 0 || nDrawY >= MAP_Lib.szNum.cy) continue;
////////////////////////////////////////////////////////
//lwc新的透明陰影
if( i != nRange-1)
{//貼透明陰影
if (cMap_shadowEx[nDrawX][nDrawY]==0)
{
codeR = MAP_GetRegionData( nDrawX, nDrawY );
MAP_RegionDeCode( codeR, &stctR );
stctR.nShadowEx = 0 ;///nVal;//lwc
SHADOW_DrawItem( nDrawX, nDrawY, 0, &DRAW_rcClient );//lwc
// 縮略圖
MINI_SetGroundData( nDrawX, nDrawY, 0 );
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( nDrawX, nDrawY, codeR ); //lwc
}
Assert( cMap_shadowEx[nDrawX][nDrawY]>=0 );
cMap_shadowEx[nDrawX][nDrawY]++;//
}
else
{
if (cMap_shadowEx[nDrawX][nDrawY]==0)
{
codeR = MAP_GetRegionData( nDrawX, nDrawY );
MAP_RegionDeCode( codeR, &stctR );
stctR.nShadowEx=1;//lwc
SHADOW_DrawItem( nDrawX, nDrawY, stctR.nShadowEx, &DRAW_rcClient ); //lwc
// 縮略圖
MINI_SetGroundData( nDrawX, nDrawY, 0 );
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( nDrawX, nDrawY, codeR ); //lwc
}
}
//lwc新的透明陰影
////////////////////////////////////////////////////////
}// End of for(i)
}
//死亡
void SHADOW_death (int nX,int nY,int nRange)
{
int i,j;
WORD codeR;
struct MAP_REGION_CODE_STRUCT stctR;
int bOdd;
int nDrawX, nDrawY;
// draw current position
nDrawX = nX, nDrawY = nY;
cMap_shadowEx[nDrawX][nDrawY]--;//
Assert( cMap_shadowEx[nDrawX][nDrawY]>=0 );
if (cMap_shadowEx[nDrawX][nDrawY]==0)
{
codeR = MAP_GetRegionData( nDrawX, nDrawY );
MAP_RegionDeCode( codeR, &stctR );
stctR.nShadowEx = 1 ;///nVal;//lwc
SHADOW_DrawItem( nDrawX, nDrawY, 1, &DRAW_rcClient );//lwc
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( nDrawX, nDrawY, codeR ); //lwc
}
bOdd = nY&1;
for( i=0; i< nRange; i++ )
for( j=0; j< ((i+1)<<3); j++ )
{
nDrawX = nX + MAP_ptSenser[bOdd][i][j].x;//相對于
nDrawY = nY + MAP_ptSenser[bOdd][i][j].y;
if( nDrawX < 0 || nDrawX >= MAP_Lib.szNum.cx) continue;
if( nDrawY < 0 || nDrawY >= MAP_Lib.szNum.cy) continue;
////////////////////////////////////////////////////////
//lwc舊的透明陰影
if( i != nRange-1)
{
cMap_shadowEx[nDrawX][nDrawY]--;
Assert( cMap_shadowEx[nDrawX][nDrawY]>=0 );
if (cMap_shadowEx[nDrawX][nDrawY]==0)
{
codeR = MAP_GetRegionData( nDrawX, nDrawY );
MAP_RegionDeCode( codeR, &stctR );
stctR.nShadowEx = 1;//lwc
SHADOW_DrawItem( nDrawX, nDrawY, 1, &DRAW_rcClient ); //lwc
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( nDrawX, nDrawY, codeR ); //lwc
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -