⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbshadow.cpp

📁 网页游戏赤壁
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////
//	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 + -