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

📄 console.cpp

📁 Visual C++ 游戏开发与设计实例 源代码(所有)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				}
				else {
					m_ppTanks[i]->m_bOnIce = false;
					m_ppTanks[i]->m_uiIceDir = DIR_NONE;
				}

				// Choose a fewest step
				if ( pt_block.x * step.x < rt_mobile.left * step.x ||
					pt_block.y * step.y < rt_mobile.top * step.y ) 
					m_ppTanks[i]->SetPos( pt_block.x, pt_block.y );
				else {
					m_ppTanks[i]->SetPos( rt_mobile.left, rt_mobile.top );
					if ( hit_blt >= 0 ) 
						m_ppBullets[hit_blt]->Hit( m_ppTanks[i] );
				}
			}
		}	// for, tanks, num 0-9
	return 0;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void ConsoleNet::FoodProc() {
	// Collision test
	if ( m_pFood->IsExsit() ) {
		RECT	rt_eat = m_pFood->GetPermitRect();
		POINT	step = {0,0};
		int		hit_tk;

		// Collistion test of tanks
		MapInfo.ColRToMobile( rt_eat, step, (CMobileObject **)m_ppTanks, DEFTANKNUM, -1,
					0, false, hit_tk );
		if ( hit_tk >= 0 ) {		// reset its property
			if ( m_pFood->GetFoodType() == FOOD_KEEPBASE ) {
				POINT	pts[9];
				int		changed = 9;
				int		i = 1-m_ppTanks[hit_tk]->IsHomeTeam();
				m_pProCounter[i] = DEFPROTECTTIME;
				MapInfo.Protect( m_ppBases[i]->GetRect(), true, pts, changed );

				int		level;
				RECT	*prc = new RECT;
				for( int j=0; j<changed; j++ ) {
					MapInfo.BlockLocator( pts[j].x, pts[j].y, prc, level );
					pddsSolid->BltFast( pts[j].x<<5, pts[j].y<<5, pddsRes, prc, 0 );
				}
			} else {
				m_pFood->Benefit( m_ppTanks[hit_tk] );
			}
			m_pFood->SetExsit(false);
		}
	}

	if ( m_pProCounter[0] == 0 ) {
		POINT	pts[9];
		int		changed = 9;
		MapInfo.Protect( m_ppBases[0]->GetRect(), false, pts, changed );

		int		level;
		RECT	*prc = new RECT;
		for( int j=0; j<changed; j++ ) {
			MapInfo.BlockLocator( pts[j].x, pts[j].y, prc, level );
			pddsSolid->BltFast( pts[j].x<<5, pts[j].y<<5, pddsRes, prc, 0 );
		}
	}
	if ( m_pProCounter[0] >= 0 )
		m_pProCounter[0]--;

	if ( m_pProCounter[1] == 0 ) {
		POINT	pts[9];
		int		changed = 9;

		MapInfo.Protect( m_ppBases[1]->GetRect(), false, pts, changed );
		int		level;
		RECT	*prc = new RECT;
		for( int j=0; j<changed; j++ ) {
			MapInfo.BlockLocator( pts[j].x, pts[j].y, prc, level );
			pddsSolid->BltFast( pts[j].x<<5, pts[j].y<<5, pddsRes, prc, 0 );
		}
	}
	if ( m_pProCounter[1] >= 0 )
		m_pProCounter[1]--;
	
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void ConsoleNet::MsgProcessor( CMsgList *ml ) {
	if ( !ml ) 
		return ;

	CMsgElem	*pelem,*peek;
	int			lastmsg = 0;
	int			*ibuf;

	ml->Lock();
	while ( !ml->IsEmpty() ) {
		peek = ml->Peek();
		if ( !peek || peek->GetMsg() == lastmsg ) {
			ml->UnLock();
			return;
		}
		pelem = ml->Pop();
		lastmsg = pelem->GetMsg();

		// Messages from server
		if ( pelem->GetMsgType() == MSG_NET ) {
			switch ( lastmsg ) 
			{
			case NETMSGTK_ANSWERSEATINFO:
				ibuf = (int *)(pelem->GetParam());
				m_nPlayers		= DEFTANKNUM/(DEFAINUM+1);
				m_nComPerTeam	= DEFAINUM;
				m_nLocal = ibuf[0]*(DEFAINUM+1);
				if ( m_nLocal >= DEFTANKNUM/2 )
					m_bHomeTeam = false;
				else
					m_bHomeTeam = true;

				m_dwStatus = CONSTAT_WAITMORE;
				m_pMsgFlag = new bool[m_nPlayers];
				ZeroMemory( m_pMsgFlag,sizeof(bool)*m_nPlayers);
				if ( !CreateConsole( hChildWnd, "Map/Map_02.idx", m_bHomeTeam ) ) {
					MessageBox( NULL, "Create Console Error!", "Sorry", MB_OK );
					m_dwStatus = CONSTAT_ENDGAME;
					DestroyWindow( hMainWnd );
				}
				break;

			case NETMSGTK_WAITMOREPLAYER:
				break;

			case NETMSGTK_MOREPLAYER:
				break;

			case NETMSGTK_GAMEREADY:
				InitObjects();
				SendMsg( NETMSGTK_PLAYERREADY, NULL, 0 );
				m_dwStatus = CONSTAT_WAITBEGIN;
				break;

			case NETMSGTK_GAMESTART:
				SendCmdMsg( &m_pCmd[m_nLocal], 0, m_nLocal );
				m_dwStatus = CONSTAT_WAITPLAYER;
				break;

			case NETMSGTK_CMDFOODDELETE:
				m_pFood->SetExsit(false);
				break;

			case NETMSGTK_CMDFOODCREATE:
				ibuf = (int *)(pelem->GetParam());
				if ( !m_bHomeTeam ) {
					ibuf[1] = g_FrameLeft - ibuf[1];
					ibuf[2] = g_FrameLeft - ibuf[2];
				}
				m_pFood->CreateFood(ibuf[0], ibuf[1], ibuf[2] );
				
				break;

			case NETMSGTK_CMDINFO:
				if ( m_dwStatus != CONSTAT_WAITPLAYER )
					ml->Push(pelem);
				else {
					ibuf = (int *)(pelem->GetParam());
					if ( m_pMsgFlag[ibuf[0]/(m_nComPerTeam+1)] ) {
						ml->Push(pelem);
						break;
					} 
					else {
						m_pMsgFlag[ibuf[0]/(m_nComPerTeam+1)] = true;
						memcpy(m_pCmd+ibuf[0], ibuf+2, sizeof(TANKCMD)*ibuf[1]);
						if ( ++m_nMsgCounter == (int)(m_nPlayers-1))
							bRecvCmd = true;
#ifdef _DEBUG_CMDOUTPUT
							char	temp[4];
							DebugOutput( 1, "*****Message Get:*****" );
							for ( int i=ibuf[0]; i<ibuf[0]+DEFAINUM+1; i++ ) {
								itoa(m_pCmd[i].cmd,temp,10);
								DebugOutput( 2, temp, "\t" );
							}
#endif
					}
				}
				break;

			case NETMSGTK_TEAMVICTORY:
				ibuf = (int *)(pelem->GetParam());
				if ( ibuf[0] ) 
					MessageBox( NULL, "Home Team Win!", "Congratulations", MB_OK );
				else
					MessageBox( NULL, "Enemy Team Win!", "Congratulations", MB_OK );
				m_dwStatus = CONSTAT_ENDGAME;
				DestroyWindow( hMainWnd );
				break;

			case MSGNET_RECEIVEERROR:
				ERRORMSG( pelem->GetParam() );
				break;
			}
		}
//		delete pelem;
	} 
	ml->UnLock();	
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void ConsoleNet::BlitFood() {
	if ( m_pFood->IsExsit() ) {
		RECT	*prc = new RECT();
		prc->left = 32 + m_pFood->GetFoodType() * 32;
		prc->top  = 256;
		prc->right  = prc->left + 32;
		prc->bottom = prc->top + 32;
		Display.Blt( m_pFood->GetLeft(), m_pFood->GetTop(), pddsRes, 
			prc, DDBLTFAST_SRCCOLORKEY);
	}
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void ConsoleNet::BlitTanks( CObjTank **pptks, int num ) {
	if ( pptks ) {
		RECT	*prc = new RECT();
		int		*pres;
		int		len;
		DWORD	time = timeGetTime();

		for ( int i=0; i<num; i++ ) {
			if ( pptks[i]->GetStat() & OBJSTAT_LIVE ) {
			pres = &ResArray[pptks[i]->GetFrameType()][0];
			prc->left = (*(pres+RESPOS_LEFT))+(pptks[i]->m_uiDirection-1) * 
				(*(pres+RESSIZE_WIDTH));

			if ( pptks[i]->IsHomeTeam() )
				prc->left += 256;
			else
				prc->left += 384;

			if ( pptks[i]->m_bMoving ) {
				pptks[i]->NextFrame(time);
				pptks[i]->m_bMoving = false;
			}
			prc->top  = *(pres+RESPOS_TOP) + pptks[i]->GetFrameCurrent()*32;
			prc->right  = prc->left + (*(pres+RESSIZE_WIDTH));
			prc->bottom = prc->top + (*(pres+RESSIZE_HEIGHT));
	
			Display.Blt( pptks[i]->GetLeft(), pptks[i]->GetTop(), pddsRes, 
				prc, DDBLTFAST_SRCCOLORKEY);

			// draw blood
			prc->left = 256;
			prc->top  = 552;
			prc->right  = prc->left + 31;
			prc->bottom = prc->top + 5;
			Display.Blt( pptks[i]->GetLeft(), pptks[i]->GetTop(), pddsRes, 
				prc, DDBLTFAST_NOCOLORKEY);

			len = pptks[i]->GetBloodPercent(29);
			prc->left = 256;
			prc->top  = 560;
			prc->right  = prc->left + len;
			prc->bottom = prc->top + 3;
			Display.Blt( pptks[i]->GetLeft()+1, pptks[i]->GetTop()+1, pddsRes, 
				prc, DDBLTFAST_NOCOLORKEY );
			} 
			else if ( pptks[i]->GetStat() & OBJSTAT_DIE ) {
				prc->left = 0 + 32 * pptks[i]->GetFrameCurrent();
				prc->top  = 544;
				prc->right  = prc->left + 32;
				prc->bottom = prc->top + 32;
				Display.Blt( pptks[i]->GetLeft(), pptks[i]->GetTop(), pddsRes, 
					prc, DDBLTFAST_SRCCOLORKEY);
				pptks[i]->NextFrame( time );
			}
		}
	}
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void ConsoleNet::BlitBullets( CObjBullet **ppbts, int num ) {
	if ( ppbts ) {
		RECT	*prc = new RECT();
		DWORD	time = timeGetTime();
//		int		*pres;

		for ( int i=0; i<num; i++ ) {
			if ( ppbts[i]->GetStat() & OBJSTAT_LIVE ) {
			prc->left = 96 + 32 * ppbts[i]->m_uiDirection;
			prc->top  = 544;
			prc->right  = prc->left + 16;
			prc->bottom = prc->top + 16;
	
			Display.Blt( ppbts[i]->GetLeft(), ppbts[i]->GetTop(), pddsRes, 
				prc, DDBLTFAST_SRCCOLORKEY);
			}else if ( ppbts[i]->GetStat() & OBJSTAT_DIE ) {
				prc->left = 0 + 32 * ppbts[i]->GetFrameCurrent();
				prc->top  = 544;
				prc->right  = prc->left+32;
				prc->bottom = prc->top+32;
				Display.Blt( ppbts[i]->GetLeft()-8*(1+ppbts[i]->GetDirectionUnit().x), 
					ppbts[i]->GetTop()-8*(1+ppbts[i]->GetDirectionUnit().y), pddsRes, 
					prc, DDBLTFAST_SRCCOLORKEY);
				ppbts[i]->NextFrame(time);
			}
		}
	}
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool ConsoleNet::BlitBases(  CObjBase **ppbs, int num ) {
	if ( !ppbs )
		return false;

	RECT		prc;
	int			level;

	for ( int i=0; i<num; i++ ) {
		MapInfo.ObjectLocator( ppbs[i], &prc, level );
		Display.Blt( ppbs[i]->GetLeft(), ppbs[i]->GetTop(), 
			pResource->GetDDrawSurface(), &prc, DDBLTFAST_SRCCOLORKEY);

		// draw blood
		prc.left = 256;
		prc.top  = 552;
		prc.right  = prc.left + 31;
		prc.bottom = prc.top + 5;
		Display.Blt( ppbs[i]->GetLeft(), ppbs[i]->GetTop(), pddsRes, 
			&prc, DDBLTFAST_NOCOLORKEY);

		prc.left = 256;
		prc.top  = 560;
		prc.right  = prc.left + ppbs[i]->m_ptyBlood.GetPercent(30);
		prc.bottom = prc.top + 3;
		Display.Blt( ppbs[i]->GetLeft()+1, ppbs[i]->GetTop()+1, pddsRes, 
			&prc, DDBLTFAST_NOCOLORKEY );
	}
	return true;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool ConsoleNet::RollBlockObjects( CObjBlock *poblk, int num ) {
	if ( !poblk || num < 0 )
		return false;

	RECT		*prc = new RECT;
	int			level;
	DWORD		time = timeGetTime();

	for ( int i=0; i<num ; i++ ) {
		poblk[i].NextFrame( time );
		MapInfo.ObjBlockLocator( poblk+i, prc, level );
		if ( FAILED( pddsSolid->BltFast( poblk[i].GetLeft(), poblk[i].GetTop(), 
			pddsRes, prc, 0 ) ) )
			return false;
	}
	return true;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------



⌨️ 快捷键说明

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