📄 console.cpp
字号:
}
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 + -