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

📄 hong_sprite.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		mov		cx,[esi+2];	//load data num
		add		esi,4;
		shr		ecx,1;
		
loop_TR:
		mov		ax,[esi];
		and		eax,111001110011100b;
		mov		tmpclr,eax;
		
		mov		ax,[edi];
		and		eax,111001110011100b;
		add		eax,tmpclr;
		
		shr		eax,2;
		mov		[edi],ax;
		add		esi,2;
		add		edi,2;
		loop	loop_TR;
		
		jmp		loop_2;
exit_2:
		add		esi,2;
		
		add		edx,dDxSize;
		dec		bx;
		jmp		loop_1;
exit_1:
		pop		es;
	};
}



void PutCompressedImageTrans(int x, int y, Spr *sp, WORD MSK)
{
	int		lx, rx, ty, by , IsC=0;
	
	
	if( sp == NULL ) return;
	if( sp->img == NULL ) return;
	
	
	int xl = sp->xl;
	int yl = sp->yl;
	
	if( xl == 0 ) return;
	if( yl == 0 ) return;
	
	
	x -= sp->ox;
	y -= sp->oy;
	
	
	if( x >= SCREEN_WIDTH  ) return; 
	else if( x + xl < 0 ) return; 
	
	if( y >= SCREEN_HEIGHT ) return; 
	else if( y + yl < 0  ) return;
	
	rx = xl;
	lx = 0;
	ty = 0;
	by = yl;
	
	
	
	if( x + xl >= SCREEN_WIDTH )
	{
		rx -= x + xl - SCREEN_WIDTH;
		IsC = 1;
	}
	if( x < 0 )
	{
		lx  = 0 - x;
		x   = 0;
		rx -= lx;
		IsC = 1;
	}
	
	if( y + yl >= SCREEN_HEIGHT )
	{
		by -= y + yl - SCREEN_HEIGHT;
		IsC = 1;
	}
	if( y < 0 )
	{
		ty  = 0 - y;
		y   = 0;
		by -= ty;
		IsC = 1;
	}	
	
	
	if( _PixelInfo.BitMaskR == 0x7C00)		
	{
		if( IsC )
			PutCmprsImgClipingTrans555( x, y, sp->img, g_DestBackBuf, lx, rx, ty, by, MSK);
		else
			PutCmprsImgNOTClipingTrans555( x, y, yl, sp->img, g_DestBackBuf, MSK);
	}
	else
	{
		if( IsC )
			PutCmprsImgClipingTrans565( x, y, sp->img, g_DestBackBuf, lx, rx, ty, by, MSK);
		else
			PutCmprsImgNOTClipingTrans565( x, y, yl, sp->img, g_DestBackBuf, MSK);
	}
	
	return;
}
/////////////////////////////////////////////////////////////////////////// Put Sprite Transperensy..
//////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//			Put Sprite Normally...
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

void	PutCmprsImgCliping(int x, int y, LPVOID Stmp, LPVOID dest, int lx, int rx, int ty, int by)
{
	int		l;
	LPVOID Dtmp = (LPVOID)((char*)dest + y * dDxSize + (x * 2));
	
	_asm{
		mov		ecx,rx;
		shl		ecx,1;
		mov		rx,ecx;
		
		mov		ecx,lx;
		shl		ecx,1;
		mov		lx,ecx;
	}
	
	_asm{
		push	es;
		
		push	ds;
		pop		es;
		
		xor		eax,eax;
		
		mov		esi,Stmp;
		
		mov		ecx,ty;
		or		ecx,ecx;
		jz		exit_1;
loop_1:
		cmp		word ptr[esi],0xffff;
		jz		exit_xxxx;
		mov		ax,[esi+2]
			add		esi,4;
		add		esi,eax;
		jmp		loop_1;
exit_xxxx:
		add		esi,2;
		loop	loop_1;
exit_1:
	}
	_asm{
		mov		ebx, by;		//
		or		ebx,ebx;
		jz		exit_for1;
loop_for1:
		xor		edx,edx;
		mov		edi,Dtmp;
		test	lx,0xffff;			//if(lx)
		jz		exit_if1;
loop_while1:
		cmp		word ptr[esi],0xffff;	//while(*stmp != 0xffff)
		jz		exit_while1;			//
		add		dx,[esi];
		cmp		edx,lx;		//if(j>lx)
		jle		jmp_if1;			//
		sub		edx,lx;		//j-=lx
		add		edi,edx;			//dtmp+=j
		jmp		jmp_0416;//****************************************************
		
jmp_if1:///////////////////////////////////////
		mov		ax,[esi + 2];
		add		esi,4;
		add		edx,eax;
		add		esi,eax;	//
		cmp		edx,lx;		//
		jle		loop_while1;
		sub		edx,lx;
		sub		esi,edx;
		mov		eax,edx;
		xor		edx,edx;
		jmp		jmp_0429;		//4.29
exit_while1:	//end while(*stmp != 0xffff)*/
exit_if1:	//end if(lx)
		
loop_while2:	
		cmp		word ptr[esi],0xffff;
		jz		exit_while2;
		
		movzx	eax,word ptr[esi];
		add		edi,eax;	//dtmp+=*stmp
		add		dx,ax;		//j+=*stmp
jmp_0416:
		mov		ax,[esi + 2];
		add		esi,4;
jmp_0429:
		mov		ecx,eax;		//l=k=*stmp
		mov		l,eax;
		
		add		eax,edx;
		cmp		eax, rx;
		jle		exit_if0;
		cmp		edx, rx;
		jg		exit_if0;
		mov		ecx, rx;
		sub		ecx,edx;
exit_if0:
		cmp		edx, rx;
		jg		else_if;
		
		add		edx, l;			//j+=l;
		sub		l,ecx;			//l-k;
		
		shr		ecx,2;		//move DATA
		jnc		Next2_1;	//
		movsw;				//
Next2_1:				//
		rep		movsd;		//
		
		add		esi,l;
		jmp		loop_while2;
		
else_if:
		add		esi,l;
ext_loop:
		cmp		word ptr[esi],0xffff;
		jz		ext;
		mov		ax,[esi+2];
		add		esi,4;
		add		esi,eax;
		jmp		ext_loop;
ext:
		
exit_while2:
		mov		eax, dDxSize;
		add		esi,2;
		add		dword ptr Dtmp,eax;
		dec		ebx;	//for(i=0;i<by;i++)
		jnz		loop_for1;	//
exit_for1:
		
		pop		es;
	};
}
void	PutCmprsImgNOTCliping(int x, int y, int yl, LPVOID Stmp, LPVOID dest )
{
	DWORD	j;
	LPVOID	Dtmp = (LPVOID)( (char*)dest + y * dDxSize + (x * 2 ));
	j = yl;
	
	_asm{
		push	es;
		
		push	ds;
		pop		es;
		
		mov		edx,Dtmp;
		mov		esi,Stmp;
		
		mov		ebx,j;
		
		xor		eax,eax;
		xor		ecx,ecx;
loop_1:
		or		bx,bx;		// if(SY==0)
		jz		exit_1;
		mov		edi,edx;
		
loop_2:	
		cmp		word ptr[esi],0xffff;
		jz		exit_2;
		
		mov		ax,[esi];
		add		edi,eax;	//0 skip
		
		mov		cx,[esi+2];	//load data num
		add		esi,4;
		
		shr		ecx,2;		//move DATA
		jnc		Next2;		//
		movsw;				//
Next2:					//
		rep		movsd;		//
		
		jmp		loop_2;
exit_2:
		add		esi,2;
		
		add		edx,dDxSize;
		dec		bx;
		jmp		loop_1;
exit_1:
		pop		es;
	}; 
}

void PutCompressedImage(int x, int y, Spr *sp )
{		
	int		lx, rx, ty, by , IsC=0;
	
	if( sp == NULL ) return;
	if( sp->img == NULL ) return;
	
	int xl = sp->xl;
	int yl = sp->yl;
	
	if( xl == 0 ) return;
	if( yl == 0 ) return;
	
	x -= sp->ox;
	y -= sp->oy;
	
	
	if( x >= SCREEN_WIDTH  ) return; 
	else if( x + xl < 0 ) return; 
	
	if( y >= SCREEN_HEIGHT ) return; 
	else if( y + yl < 0  ) return;
	
	rx = xl;
	lx = 0;
	ty = 0;
	by = yl;
	
	
	
	if( x + xl >= (SCREEN_WIDTH-1) )
	{
		rx -= x + xl - (SCREEN_WIDTH-1);
		IsC = 1;
	}
	if( x < 0 )
	{
		lx  = 0 - x;
		x   = 0;
		rx -= lx;
		IsC = 1;
	}
	
	if( y + yl >= SCREEN_HEIGHT )
	{
		by -= y + yl - SCREEN_HEIGHT;
		IsC = 1;
	}
	if( y < 0 )
	{
		ty  = 0 - y;
		y   = 0;
		by -= ty;
		IsC = 1;
	}	
	
	
	if( sp->img == NULL ) return;
	
	
	if( IsC )
	{	
		PutCmprsImgCliping( x,  y, sp->img, g_DestBackBuf, lx, rx+1, ty, by);
	}	
	else
	{	
		PutCmprsImgNOTCliping( x,  y, sp->yl, sp->img, g_DestBackBuf );
	}	
}		



//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//			Put Sprite Normally...
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

void	PutCmprsImgClipingOneColor(int x, int y, LPVOID Stmp, LPVOID dest, int lx, int rx, int ty, int by, WORD color)
{
	int		l;
	LPVOID Dtmp = (LPVOID)((char*)dest + y * dDxSize + (x * 2));
	
	_asm{
		mov		ecx,rx;
		shl		ecx,1;
		mov		rx,ecx;
		
		mov		ecx,lx;
		shl		ecx,1;
		mov		lx,ecx;
	}
	
	_asm{
		push	es;
		
		push	ds;
		pop		es;
		
		xor		eax,eax;
		
		mov		esi,Stmp;
		
		mov		ecx,ty;
		or		ecx,ecx;
		jz		exit_1;
loop_1:
		cmp		word ptr[esi],0xffff;
		jz		exit_xxxx;
		mov		ax,[esi+2]
			add		esi,4;
		add		esi,eax;
		jmp		loop_1;
exit_xxxx:
		add		esi,2;
		loop	loop_1;
exit_1:
	}
	_asm{
		mov		ebx, by;		//
		or		ebx,ebx;
		jz		exit_for1;
loop_for1:
		xor		edx,edx;
		mov		edi,Dtmp;
		test	lx,0xffff;			//if(lx)
		jz		exit_if1;
loop_while1:
		cmp		word ptr[esi],0xffff;	//while(*stmp != 0xffff)
		jz		exit_while1;			//
		add		dx,[esi];
		cmp		edx,lx;		//if(j>lx)
		jle		jmp_if1;			//
		sub		edx,lx;		//j-=lx
		add		edi,edx;			//dtmp+=j
		jmp		jmp_0416;//****************************************************
		
jmp_if1:///////////////////////////////////////
		mov		ax,[esi + 2];
		add		esi,4;
		add		edx,eax;
		add		esi,eax;	//
		cmp		edx,lx;		//
		jle		loop_while1;
		sub		edx,lx;
		sub		esi,edx;
		mov		eax,edx;
		xor		edx,edx;
		jmp		jmp_0429;		//4.29
exit_while1:	//end while(*stmp != 0xffff)*/
exit_if1:	//end if(lx)
		
loop_while2:	
		cmp		word ptr[esi],0xffff;
		jz		exit_while2;
		
		movzx	eax,word ptr[esi];
		add		edi,eax;	//dtmp+=*stmp
		add		dx,ax;		//j+=*stmp
jmp_0416:
		mov		ax,[esi + 2];
		add		esi,4;
jmp_0429:
		mov		ecx,eax;		//l=k=*stmp
		mov		l,eax;
		
		add		eax,edx;
		cmp		eax, rx;
		jle		exit_if0;
		cmp		edx, rx;
		jg		exit_if0;
		mov		ecx, rx;
		sub		ecx,edx;
exit_if0:
		cmp		edx, rx;
		jg		else_if;
		
		mov		ax, color
			shl		eax, 16
			mov		ax, color
			
			add		edx, l;			//j+=l;
		sub		l,ecx;			//l-k;
		
		add		esi, ecx;
		sub		edi, 2
			add		ecx, 4
			shr		ecx,2;		//move DATA
		jnc		Next2_1;	//
		
		stosw;	//
		
Next2_1:				//
		
		rep		stosd;		//
		sub		edi, 2
			
			add		esi,l;
		jmp		loop_while2;
		
else_if:
		add		esi,l;
ext_loop:
		cmp		word ptr[esi],0xffff;
		jz		ext;
		mov		ax,[esi+2];
		add		esi,4;
		add		esi,eax;
		jmp		ext_loop;
ext:
		
exit_while2:
		mov		eax, dDxSize;
		add		esi,2;
		add		dword ptr Dtmp,eax;
		dec		ebx;	//for(i=0;i<by;i++)
		jnz		loop_for1;	//
exit_for1:
		
		pop		es;
	};
}
void	PutCmprsImgNOTClipingOneColor(int x, int y, int yl, LPVOID Stmp, LPVOID dest, WORD color )
{
	DWORD	j;
	LPVOID	Dtmp = (LPVOID)( (char*)dest + y * dDxSize + (x * 2 ));
	j = yl;
	
	_asm{
		push	es;
		
		push	ds;
		pop		es;
		
		mov		edx,Dtmp;
		mov		esi,Stmp;
		
		//	mov		ebx,j;
		
		mov     ax, color;
		shl		eax, 16;
		mov		ax, color;
		
		xor		ebx,ebx;
		xor		ecx,ecx;
loop_1:
		cmp 	j,0;		// if(SY==0)
		jz		exit_1;
		mov		edi,edx;
		
loop_2:	
		cmp		word ptr[esi],0xffff;
		jz		exit_2;
		
		mov		bx,[esi];
		add		edi,ebx;	//0 skip
		
		mov		cx,[esi+2];	//load data num
		add		esi,4;
		
		add		esi, ecx;
		sub		edi, 2
			add		ecx, 4;
		shr		ecx, 2;
		jnc		Next2;		//
		
		stosw;				//
Next2:					//
		rep		stosd;		//
		sub		edi, 2
			
			jmp		loop_2;
exit_2:
		add		esi,2;
		
		add		edx,dDxSize;
		sub		j, 1;
		jmp		loop_1;
exit_1:
		pop		es;
	};
}	
void PutCompressedImageOneColor(int x, int y, Spr *sp, WORD color )
{		
	
	int		lx, rx, ty, by , IsC=0;
	
	int		ey = SCREEN_HEIGHT - 128;
	
	if( sp == NULL ) return;
	if( sp->img == NULL ) return;
	
	
	
	int xl = sp->xl;
	int yl = sp->yl;
	
	if( xl == 0 ) return;
	if( yl == 0 ) return;
	
	x -= sp->ox;
	y -= sp->oy;
	
	
	if( x >= SCREEN_WIDTH -1 ) return; 
	else if( x + xl < 1 ) return; 
	
	if( y >= ey ) return; 
	else if( y + yl < 0  ) return;
	
	rx = xl;
	lx = 1;
	ty = 0;
	by = yl;
	
	
	
	if( x + xl >= SCREEN_WIDTH-1)
	{
		rx -= x + xl - (SCREEN_WIDTH-1);
		IsC = 1;
	}
	if( x < 1 )
	{
		lx  = 1 - x;
		x   = 1;
		rx -= lx;
		IsC = 1;
	}
	
	if( y + yl >= SCREEN_HEIGHT )
	{
		by -= y + yl - ey;
		IsC = 1;
	}
	if( y < 0 )
	{
		ty  = 0 - y;
		y   = 0;
		by -= ty;
		IsC = 1;
	}	
	
	
	if( IsC )
	{	
		PutCmprsImgClipingOneColor( x,  y, sp->img, g_DestBackBuf, lx, rx, ty, by, color);
	}	
	else
	{	
		PutCmprsImgNOTClipingOneColor( x,  y, sp->yl, sp->img, g_DestBackBuf, color );
	}	
}		





///////////////////////////////////////////////////////////////////////////// Put Sprite Normally...
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////





//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

void	PutCmprsImgVoidCliping(int x, int y, LPVOID Stmp, LPVOID dest, int lx, int rx, int ty, int by)
{
	int		l;
	LPVOID Dtmp = (LPVOID)((char*)dest + y * dDxSize + (x * 2));
	
	_asm{
		mov		ecx,rx;
		shl		ecx,1;
		mov		rx,ecx;
		
		mov		ecx,lx;
		shl		ecx,1;
		mov		lx,ecx;
	}
	
	_asm{
		push	es;
		
		push	ds;
		pop		es;
		
		xor		eax,eax;
		
		mov		esi,Stmp;
		
		mov		ecx,ty;
		or		ecx,ecx;
		jz		exit_1;
loop_1:
		cmp		word ptr[esi],0xffff;
		jz		exit_xxxx;
		mov		ax,[esi+2]
			add		esi,4;
		add		esi,eax;
		jmp		loop_1;
exit_xxxx:
		add		esi,2;
		loop	loop_1;
exit_1:
	}
	_asm{
		mov		ebx, by;		//
		or		ebx,ebx;
		jz		exit_for1;
loop_for1:
		xor		edx,edx;
		mov		edi,Dtmp;
		test	lx,0xffff;			//if(lx)
		jz		exit_if1;
loop_while1:
		cmp		word ptr[esi],0xffff;	//while(*stmp != 0xffff)
		jz		exit_while1;			//
		add		dx,[esi];
		cmp		edx,lx;		//if(j>lx)
		jle		jmp_if1;			//

⌨️ 快捷键说明

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