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

📄 graph.cpp

📁 大家好!这是一个网络游戏源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		rc1.top		= rcInter.top  - DrawY;
		rc1.right	= rc1.left + rcInter.right  - rcInter.left;
		rc1.bottom	= rc1.top  + rcInter.bottom - rcInter.top;
		
		rc1.left+=rcSrc.left;
		rc1.right+=rcSrc.left;
		rc1.top+=rcSrc.top;
		rc1.bottom+=rcSrc.top;
		//rcInter.left-=rcSrc.left;
		//rcInter.right-=rcSrc.left;
		//rcInter.top-=rcSrc.top;
		//rcInter.bottom-=rcSrc.top;

		if(boColorKey)	g_pddsRenderTarget->Blt(&rcInter , pdds , &rc1 , DDBLT_WAIT|DDBLT_KEYSRC , NULL);
		else            g_pddsRenderTarget->Blt(&rcInter , pdds , &rc1 , DDBLT_WAIT , NULL); 
	}
}

int SnapShot = 0;

VOID	DrawChaSurface(LPDIRECTDRAWSURFACE7 pdds , int iDrawX , int iDrawY , int Dire)
{
	RECT	rcSrc;

    rcSrc.left      = SnapShot / 4 * 64;
	rcSrc.right     = rcSrc.left + 64;
	rcSrc.top       = Dire * 96;
	rcSrc.bottom    = rcSrc.top  + 96;

    RECT rcView; 
    rcView.left	  = 0;
    rcView.right  = g_iViewWidth;
    rcView.top    = 0;
    rcView.bottom = g_iViewHeight;

    RECT rc1 , rc2;
    Blit_GetValidRect(&rc1 , &rc2 ,
 					 iDrawX ,	iDrawY ,
				  	 rcView , rcSrc);
    
	g_pddsRenderTarget->Blt(&rc1 , pdds , &rc2 , DDBLT_WAIT|DDBLT_KEYSRC , NULL);
				  	
	//BltSurfaceRect(DrawX , DrawY , pdds , rcSrc , TRUE);
	
	
	SnapShot++;
	if(SnapShot==32) SnapShot = 0;
}

VOID	SetSurfaceColorKey(LPDIRECTDRAWSURFACE7 pdds , DWORD color)
{
	if(pdds==NULL) return;
	DDCOLORKEY color_key;
	color_key.dwColorSpaceLowValue  = color;	
	color_key.dwColorSpaceHighValue = color;
	pdds->SetColorKey(DDCKEY_SRCBLT, &color_key);	
}

#define IMG_HEADER_SIZE 9

VOID ImageFileToRleFile(char *strSrcFileName , char *strObjFileName , DWORD dwColorKey)
{
	LPDIRECTDRAWSURFACE7 pdds;
	pdds = GetSurfaceFromBmpFile24(strSrcFileName);
	if(pdds==NULL) return ;
	int w , h;	GetSurfaceSize(pdds , (LPDWORD)&w , (LPDWORD)&h);
	DDSURFACEDESC2   ddsd;
    INIT_STRUCT(ddsd);
    pdds->Lock(NULL , &ddsd , DDLOCK_READONLY , NULL);		
	LPWORD pwSurfaceData = (LPWORD)ddsd.lpSurface;
	int iPitch		     =  (int)(ddsd.lPitch / 2);
	
	LPWORD pwRleData = GetRleDataFromSurfaceData(pwSurfaceData , 
		                                         w , h , 
												 iPitch , dwColorKey);
	pdds->Unlock(0);
	if(pwRleData==NULL) 
	{
	   Out("ERR : %s\n" , "GetRleDataFromSurfaceData Failed!");
	   return ;
	}
	RLE_HEADER RleHeader; 
	GetRleHeader(pwRleData , &RleHeader);
	FILE *fp = fopen(strObjFileName , "wb");
	fwrite(pwRleData , RleHeader.dwSize , 1 , fp);
    fclose(fp);
	FreeMemory(pwRleData);
}


VOID ProcessCoverImage(char *strFileName , DWORD color_key)
{
	LPDIRECTDRAWSURFACE7 pdds;
	pdds = GetSurfaceFromBmpFile24(strFileName);
	if(pdds==NULL) return ;
	SINT16 w , h; 
	GetSurfaceSize(pdds , (LPDWORD)&w , (LPDWORD)&h);
	DDSURFACEDESC2          ddsd;
    INIT_STRUCT(ddsd);
    pdds->Lock(NULL , &ddsd , DDLOCK_READONLY , NULL);		
	
	LPWORD pwSurfaceData = (LPWORD)ddsd.lpSurface;
	UINT16 pitch		 = (int)ddsd.lPitch / 2 ;
	
	int FullRectCount = 0;
	int NullRectCount = 0;
	FILE *fp = fopen("yizhan.cov" , "wb");
	for(int y = 0 ; y < 36 ; y++)
	{
		for(int x = 0 ; x < 25 ; x++)
		{
			int rect_w = 32;
			int rect_h = 16;
			RLE_INFO RleInfo; RleInfo.boFull = FALSE; RleInfo.boNull = FALSE;
			LPWORD pwCurrentData = pwSurfaceData + y * rect_h * pitch + x * rect_w;
			UINT16 *buffer = GetRleBufferFromSurfaceData(pwCurrentData , rect_w , rect_h , pitch , color_key , &RleInfo);
			if(RleInfo.boFull) FullRectCount++;
			if(RleInfo.boNull) NullRectCount++;
			fwrite(buffer , RleInfo.lSize , 1 , fp);
			FreeMemory(buffer);
		}
	}
	pdds->Unlock(0);
	fclose(fp);

	Out("Full Rect : %d\n" , FullRectCount);
	Out("Null Rect : %d\n" , NullRectCount);
}

UINT16 *GetRleBufferFromSurfaceData(UINT16 *pwSurfaceData , int w , int h , int pitch , DWORD c_key , RLE_INFO *pRleInfo)
{
	UINT16 *src_ptr  = pwSurfaceData;
	UINT16 *line_ptr = src_ptr;
	SINT32 data_size = w * h;
	UINT32 color;
	UINT16 *buffer;GetMemory(buffer , UINT16 ,  data_size  + 4096); //预计的buffer大小
	UINT16 count     = 0;
	
	UINT32 valid_color_count = 0;
	UINT32 buf_byte  = 0;
	UINT32 color_start_byte;
	
	//开始对整个表面进行扫描
	
	SINT16 left    =  w;
	SINT16 right   =  0;
	SINT16 top     = -1;
	SINT16 bottom  =  0;
	
	SINT16 sx = 0;
	
	buf_byte+=IMG_HEADER_SIZE;	//留出18个字节的头信息
	
	SINT32 all_valid_color = 0;
	UINT32 line_start_byte = 0;
	
	SINT16 valid_piece_count = 0;
	SINT16 first_x = 0;
	
	for(SINT16 y = 0 ; y < h ; y++)
	{
		line_ptr = src_ptr;
	    count    = 0;
		*(buffer + buf_byte) = 0;
		line_start_byte = buf_byte;
		buf_byte++;
		valid_color_count = 0;
		valid_piece_count = 0;
		for(SINT16 x = 0 ; x < w ; x++)
		{
			color = *line_ptr;
			
			if(color!=c_key)
			{
				if(count==0) //有效颜色开始
				{
					if(x < left) left = x; 
					sx = x;
					*(buffer + buf_byte) = x; //记住起点
					buf_byte++;
					*(buffer + buf_byte) = 0; //预留出来用来存储颜色个数
					color_start_byte     = buf_byte;
					buf_byte++;
					
					*(buffer + buf_byte) = color;
					buf_byte++;
					count                = 1;
				    if(valid_color_count==0) first_x = x;
					//fprintf(fp1 , "^");
					valid_color_count++;
					valid_piece_count++;
				}
			    else
				{
					*(buffer + buf_byte) = color;
					buf_byte++;  
					count++;
					//fprintf(fp1 , "^");
				}
			}
			else
			{	
				if(count)
				{
					*(buffer + color_start_byte)   = count;
				    valid_color_count+= (count - 1);
					if((sx + count) > right) right = sx + count;
					count                          = 0;
				}
			    //fprintf(fp1 , "-");
			}
			
			line_ptr++;
		}
	    
	    if(count)
		{
			*(buffer + color_start_byte) = count;
		    valid_color_count+= (count - 1);
			if( ( sx + count - 1) > right) right = sx + count - 1;
			count                        = 0;
		}
		
		if(valid_color_count!=0) //记录最上和最下
		{
			if(top < 0 ) top = y;
		    bottom = y;
		}
		*(buffer + line_start_byte) = (valid_color_count + valid_piece_count * 2 );
        all_valid_color+=valid_color_count;
		//fprintf(fp1 , "(%2d , %2d)\n" , first_x , valid_color_count);
		src_ptr+=pitch;
	}

	//fprintf(fp1 , "all_valid_color = %d\n" , all_valid_color);
	//存储头信息
	UINT32 size   = buf_byte  * 2;
	
	*(buffer + 0) = (size>>16);
	*(buffer + 1) = (size & 0x0000FFFF);
	*(buffer + 2) = w;
	*(buffer + 3) = h;
	
	*(buffer + 4) = left;
	*(buffer + 5) = right;
	*(buffer + 6) = top;
	*(buffer + 7) = bottom;

	if(all_valid_color==data_size) 
	{
		*(buffer + 8) = 1;
		pRleInfo->boFull = TRUE;
	}
	else
	{
		*(buffer + 8) = 0;
	}
    if(all_valid_color==0)
	{
		pRleInfo->boNull = TRUE;
	}
	pRleInfo->lSize = size;
	UINT16 *pwBuffer; GetMemory(pwBuffer , UINT16 , buf_byte);
	memcpy(pwBuffer , buffer , size);
	FreeMemory(buffer);
	return pwBuffer;
}




LPWORD pwCoverData;

/*
BLIT 一段BUFFER
参数 : 
表面指针 
BUFFER
BUFFER的尺寸
起点 SX , SY
CLIPPER SX , EX , SY , EY
*/

#define BLIT_IMAGE_BUFFER(SURFACE_PTR , BUF , SIZE , SX , SY  , CLIPPER_SX , CLIPPER_EX , CLIPPER_SY , CLIPPER_EY , EDGE_COLOR)	\
	SINT16 line_count = 0  , line_data_count , x , ori_x , count , ori_count , line_valid;   \
    UINT32 n = 0;               \
    while(n < SIZE) {							\
	line_valid = *BUF ; BUF++;			 \
	if( (SY + line_count) >= CLIPPER_SY ) {			\
	 if( (line_count + SY) >= CLIPPER_EY ) break;	\
		 if(line_valid)  { \
	      line_data_count = 0; \
	      while(1)    \
		  { \
			  x = *BUF; BUF++; \
			  count = *BUF; BUF++; \
			  x+=SX;  \
			  ori_count = count; \
			  ori_x     = x; \
			  if( x < CLIPPER_SX )			  { count = x + count - CLIPPER_SX; x = CLIPPER_SX; } \
			  if( (x + count) >= CLIPPER_EX ) { count = CLIPPER_EX - x; } \
			  if( count>0 ) \
				{ \
				memcpy(SURFACE_PTR + x , BUF + x - ori_x , count * 2); \
				if(EDGE_COLOR!=0)	{	*(SURFACE_PTR + x) = EDGE_COLOR; *(SURFACE_PTR + x + count - 1) = EDGE_COLOR ;} \
				}\
				BUF+=ori_count; \
			  line_data_count+=(ori_count + 2); \
			  if(line_data_count==line_valid) break; \
		  } \
	  } \
	  } \
	  else { \
	      BUF+=line_valid; \
	  } \
	  n+=line_valid; \
	  n++;  \
	  SURFACE_PTR+=pitch; \
	  line_count++;   \
	}

VOID	DrawCover(int DrawX , int DrawY)
{
	SINT16 clipper_sx = 0;
	SINT16 clipper_ex = 800;
	SINT16 clipper_sy = 0;
	SINT16 clipper_ey = 600;
	
	LPDIRECTDRAWSURFACE7 pdds = g_pddsRenderTarget;
	SINT16 w , h; GetSurfaceSize(pdds , (LPDWORD)&w , (LPDWORD)&h);
	DDSURFACEDESC2  ddsd;
	INIT_STRUCT(ddsd);
	pdds->Lock(NULL , &ddsd , DDLOCK_WRITEONLY , NULL);		
	
	LPWORD pwSurfaceData = (LPWORD)ddsd.lpSurface;
	UINT16 pitch		 = (int)ddsd.lPitch / 2 ;

	LPWORD pwCurSurfaceData = pwSurfaceData;
	int Rect = 0;
	LPWORD pwCurrentCoverData = pwCoverData;
	int FullRectCount = 0;
	while(Rect < 1) 
	{
		UINT16 size1 = *(pwCurrentCoverData + 0);
		UINT16 size2 = *(pwCurrentCoverData + 1);
		UINT32 size  = size1;
		size<<=16;
		size|=size2;  
		size>>=1;
		//Out("size = %d\n" , size);
		pwCurrentCoverData+=IMG_HEADER_SIZE;
		size-=IMG_HEADER_SIZE;
		UINT32 s = size;
		LPWORD pwTemp	= pwCurSurfaceData;
		LPWORD pwTemp1  = pwCurrentCoverData; 
		BLIT_IMAGE_BUFFER(pwTemp , pwTemp1 , s , 
					DrawX , DrawY , 
					clipper_sx , clipper_ex , clipper_sy , clipper_ey , 
					0);
		//if(*(pwCurrentCoverData + 8)) FullRectCount++;
		pwCurrentCoverData+=size;
		pwCurSurfaceData+=32;
		Rect++;
		if(Rect % 25==0) 
		{
			pwSurfaceData+=(16 * pitch);
			pwCurSurfaceData = pwSurfaceData;
		}
	}
	pdds->Unlock(0);
	//Out("DrawCover FullRectCount = %d\n" , FullRectCount);
	//FreeMemory(pwCoverData);
}

	

LPDIRECTDRAWSURFACE7	GetSurfaceFromRleFile16(char *strFileName)
{
	long lFileSize = GetFileSize(strFileName);
	FILE *fp = fopen(strFileName , "rb");
	if(fp==NULL)
	{
		Out("ERR : Rle File not Found <%s>\n" , strFileName); 
	    return NULL;
	}
	LPWORD pwRleData;GetMemory(pwRleData , WORD , lFileSize / 2);
    fread(pwRleData , lFileSize , 1 , fp);
    fclose(fp);
	RLE_HEADER RleHeader;
	GetRleHeader(pwRleData , &RleHeader);
	int w = RleHeader.wWidth;
	int h = RleHeader.wHeight;
	LPDIRECTDRAWSURFACE7 pdds = CreateSurface(w , h , SURFACE_TYPE_NORMAL);
	if(pdds==NULL) 
	{
		FreeMemory(pwRleData);
		return NULL;
	}
    DDSURFACEDESC2  ddsd;
	INIT_STRUCT(ddsd);
	pdds->Lock(NULL , &ddsd , DDLOCK_WRITEONLY , NULL);		
	LPWORD pwSurfaceData = (LPWORD)ddsd.lpSurface;
	
	GetSurfaceDataFromRleData(pwSurfaceData , pwRleData , ddsd.lPitch / 2);
	
	pdds->Unlock(0);
	SetSurfaceColorKey(pdds , RleHeader.dwColorKey);
	FreeMemory(pwRleData);
	return 	pdds;
}

LPRECT	WorldRectToViewRect(LPRECT prcWorld)
{
	prcWorld->left-=g_iViewAtWorldX;	
	prcWorld->right-=g_iViewAtWorldX;	
	prcWorld->top-=g_iViewAtWorldY;	
	prcWorld->bottom-=g_iViewAtWorldY;
	return prcWorld;
}

VOID DrawRect(RECT rc , DWORD dwColor)
{
	HDC hDC;
	if( SUCCEEDED( g_pddsRenderTarget->GetDC(&hDC) ) )
	{
		HPEN hPen = CreatePen(PS_SOLID , 1 , dwColor);
		SelectObject(hDC , hPen);
		
		POINT pt;
		MoveToEx(hDC , rc.left , rc.top , &pt);
		LineTo(hDC , rc.right , rc.top);
		LineTo(hDC , rc.right , rc.bottom);
		LineTo(hDC , rc.left  , rc.bottom);
		LineTo(hDC , rc.left  , rc.top);

		DeleteObject(hPen);
		g_pddsRenderTarget->ReleaseDC(hDC);
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -