亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? game.cpp

?? 一個用c++寫的很棒的坦克大戰游戲源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
	SAFE_RELEASE( m_pddsFrontBuffer );
	SAFE_RELEASE( m_pDD );
}


void CGame::FlipScreen()
{
	HRESULT hr;
	
	if( m_bFullScreen )
		hr = m_pddsFrontBuffer->Flip( NULL, DDFLIP_WAIT );
	else
	{
		hr = m_pddsFrontBuffer->Blt( &m_rcWindow, m_pddsBackBuffer,
				NULL, DDBLT_WAIT, NULL );
	}

	if( hr == DDERR_SURFACELOST )
		RestoreSurfaces();
}


LPDIRECTDRAWSURFACE CGame::DDCreateSurface( int width, int height )
{
	DDSURFACEDESC	ddsd;
	ZeroMemory( &ddsd, sizeof(ddsd) );
	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
	ddsd.dwWidth = width;
	ddsd.dwHeight = height;

	LPDIRECTDRAWSURFACE pdds;
	if( FAILED(m_pDD->CreateSurface( &ddsd, &pdds, NULL )) )
		return NULL;

	return pdds;
}


void CGame::RestoreSurfaces()
{
	m_pddsBackBuffer->Restore();
	m_pddsFrontBuffer->Restore();

	for( int i = 0; i < NUM_BITMAPS; i ++ )
		m_pBmpList[i]->Restore();

	DDReLoadBitmap( m_pBmpList[0], "graphics\\tile.bmp" ); //物體
	DDReLoadBitmap( m_pBmpList[1], "graphics\\player1.bmp" );
	DDReLoadBitmap( m_pBmpList[2], "graphics\\bullet.bmp" );
	DDReLoadBitmap( m_pBmpList[3], "graphics\\explode1.bmp" ); //爆炸形狀1
	DDReLoadBitmap( m_pBmpList[4], "graphics\\explode2.bmp" ); //爆炸形狀2
	DDReLoadBitmap( m_pBmpList[5], "graphics\\enemy.bmp" );
	DDReLoadBitmap( m_pBmpList[6], "graphics\\bonus.bmp" );
	DDReLoadBitmap( m_pBmpList[7], "graphics\\bore.bmp" );
	DDReLoadBitmap( m_pBmpList[8], "graphics\\misc.bmp" );
	DDReLoadBitmap( m_pBmpList[9], "graphics\\player2.bmp" );
	DDReLoadBitmap( m_pBmpList[10], "graphics\\splash.bmp" );
	DDReLoadBitmap( m_pBmpList[11], "graphics\\gameover.bmp" );
	DDReLoadBitmap( m_pBmpList[12], "graphics\\flag.bmp" );
	DDReLoadBitmap( m_pBmpList[13], "graphics\\num.bmp" );
	DDReLoadBitmap( m_pBmpList[14], "graphics\\shield.bmp" ); //保護體
}


void CGame::DDClear( RECT* prc, DWORD dwFillColor )
{
	DDBLTFX	ddbfx;
	ZeroMemory( &ddbfx, sizeof(ddbfx) );
	ddbfx.dwSize = sizeof(ddbfx);
	ddbfx.dwFillColor = dwFillColor;
	
	m_pddsBackBuffer->Blt( prc, NULL, NULL, 
		DDBLT_COLORFILL | DDBLT_WAIT, &ddbfx );
}


void CGame::ProcessInput()
{
	static DWORD lastTick = timeGetTime();
	DWORD time = timeGetTime() - lastTick;
	CBullet* bullet;
	float x, y;
	DIRECTION dir;
	int surface;
	int i, j, k;
	lastTick = timeGetTime();
	
	
	// process player's input
	
	WORD input[2];
	m_DirectInput.GetKey( input[0], input[1] );

	for( k = 0; k < 2; k ++ )
	{
		if( !m_player[k].m_active )
			continue;

		x = m_player[k].m_x;
		y = m_player[k].m_y;
		dir = m_player[k].m_dir;

		if( !m_player[k].m_bBoring && m_gameState != GS_OVER )
		{
			if( m_player[k].ProcessInput(input[k], time) )
				m_DirectSound.Play( EFFECT_FIRE );
		}
		surface = m_plane.GetSurface( m_player[k] );
		if( surface != OBJ_NULL &&
			surface != OBJ_TREE )
		{
			m_player[k].m_x = x;
			m_player[k].m_y = y;
			m_player[k].m_dir = dir;
		}
		if( m_player[k].HitTest( m_player[!k], (int)x, (int)y ) )
		{
			// two players hit together 
			m_player[k].m_x = x;
			m_player[k].m_y = y;
			m_player[k].m_dir = dir;
		}
		
		for( i = 0; i < m_nMaxEnemys; i ++ )
		{
			if( m_player[k].HitTest( m_enemy[i], (int)x, (int)y ) )
			{
				// we hit the enemy
				m_player[k].m_x = x;
				m_player[k].m_y = y;
				m_player[k].m_dir = dir;
				break;
			}
		}
	
		if( m_player[k].HitTest( m_bonus ) )
		{
			// we hit the bonus
			EatBonus( m_player[k] );
		}

		// bullet
		for( j = 0; j < 2; j ++ )
		{
			bullet = &m_player[k].m_bullet[j];
			if( !bullet->m_active )
				continue;

			if( !bullet->Move() )
			{
				bullet->m_active = FALSE;
				continue;
			}
			int surface = m_plane.HitSurface( *bullet, m_player[k].m_type>=3 );
			if( surface == OBJ_BRICK )
			{
				bullet->m_active = FALSE;
				Explode( *bullet );
			}
			else if( surface == OBJ_CONCRETE )
			{
				bullet->m_active = FALSE;
				Explode( *bullet );
				m_DirectSound.Play( EFFECT_HIT );
			}
			else if( surface == OBJ_HAWK )
			{
				bullet->m_active = FALSE;
				Explode( *bullet, TRUE );
				m_DirectSound.Play( EFFECT_EXPLODE );
				m_gameState = GS_OVER;
			}
			
			if( !m_bSingle &&
				bullet->HitTest( m_player[!k] ) )
				
			{
				// We hit the other player
				bullet->m_active = FALSE;
				if( !m_player[!k].m_bShield )
					m_player[!k].Lock();
			}
			
			for( i = 0; i < m_nMaxEnemys; i ++ )
			{
				if( !m_enemy[i].m_bShield && !m_enemy[i].m_bBoring &&
					bullet->HitTest( m_enemy[i] ) )
				{
					// our bullet hit the enemy
					bullet->m_active = FALSE;
					Explode( *bullet );					
					if( m_enemy[i].m_bBonus )
					{
						m_enemy[i].m_bBonus = FALSE;
						BoreBonus();
					}

					if( m_enemy[i].m_type == 2 )
					{
						if( --m_enemy[i].m_level < 0 )
							m_enemy[i].m_active = FALSE;
					}
					else
						m_enemy[i].m_active = FALSE;

					if( !m_enemy[i].m_active )
					{
						// the enemy is dead
						Explode( m_enemy[i], TRUE );
						m_DirectSound.Play( EFFECT_EXPLODE );
						m_nEnemys --;
						m_player[k].m_nScore += (m_enemy[i].m_type+1) * 100;
					}
					break;
				}
				else if( bullet->HitTest( m_enemy[i].m_bullet[0] ) )
				{
					// our bullet hit the enemy's
					bullet->m_active = FALSE;
					m_enemy[i].m_bullet[0].m_active = FALSE;
					break;
				}
			}
		}
	}

	if( !m_bSingle )
	{
		for( i = 0; i < 2; i ++ )
			for( j = 0; j < 2; j ++ )
			{
				if( m_player[0].m_bullet[i].HitTest(
					m_player[1].m_bullet[j] ) )
				{
					// two players' bullet hit together
					m_player[0].m_bullet[i].m_active = FALSE;
					m_player[1].m_bullet[j].m_active = FALSE;
				}
			}
	}
				
	
	// process enemys
	for( i = 0; i < m_nMaxEnemys; i ++ )
	{
		if( !m_bEnemyLocked && !m_enemy[i].m_bBoring &&
			m_enemy[i].m_active )
		{
			x = m_enemy[i].m_x;
			y = m_enemy[i].m_y;
			dir = m_enemy[i].m_dir;
			
			if( rand() % 200 == 0 ||
				!m_enemy[i].Move() )
			{
				m_enemy[i].ChangeDirection();
			}
			
			surface = m_plane.GetSurface( m_enemy[i] );
			if( surface == OBJ_BRICK )
			{
				if( rand() % 100 < 30 )
				{
					m_enemy[i].ChangeDirection();
					surface = m_plane.GetSurface( m_enemy[i] );
				}
				else
					m_enemy[i].Fire();
			}
			else if( surface == OBJ_CONCRETE ||
					surface == OBJ_RIVER )
			{
				m_enemy[i].ChangeDirection();
				surface = m_plane.GetSurface( m_enemy[i] );
			}
			if( m_enemy[i].HitTest( m_player[0], (int)x, (int)y ) ||
				m_enemy[i].HitTest( m_player[1], (int)x, (int)y ) )
			{
				m_enemy[i].m_x = x;
				m_enemy[i].m_y = y;
				m_enemy[i].m_dir = dir;
				m_enemy[i].Fire();
			}
			else if( surface != OBJ_NULL && surface != OBJ_TREE )
			{
				m_enemy[i].m_x = x;
				m_enemy[i].m_y = y;
				m_enemy[i].m_dir = dir;
			}
			for( int j = 0; j < m_nMaxEnemys; j ++ )
			{
				if( i != j &&
					m_enemy[i].HitTest( m_enemy[j], (int)x, (int)y ) )
				{
					// two enemys hit each other
					m_enemy[i].ChangeDirection();
					if( m_enemy[i].HitTest( m_enemy[j], (int)x, (int)y ) )
					{
						m_enemy[i].m_x = x;
						m_enemy[i].m_y = y;
						m_enemy[i].m_dir = dir;
					}
					break;
				}
			}
			
			// the enemy can also eat the bonus
			if( m_enemy[i].HitTest( m_bonus ) )
				EatBonus( m_enemy[i] );
						
			if( rand() % 100 == 0 )
				m_enemy[i].Fire();
		}

		bullet = &m_enemy[i].m_bullet[0];
		if( bullet->m_active )
		{
			if( !bullet->Move() )
				bullet->m_active = FALSE;
	
			surface = m_plane.HitSurface( *bullet );
			if( surface == OBJ_BRICK ||
				surface == OBJ_CONCRETE )
			{
				bullet->m_active = FALSE;
				Explode( *bullet );
			}
			else if( surface == OBJ_HAWK )
			{
				bullet->m_active = FALSE;
				Explode( *bullet, TRUE );
				m_DirectSound.Play( EFFECT_EXPLODE );
				m_gameState = GS_OVER;
			}

			for( k = 0; k < 2; k ++ )
			{
				if( bullet->HitTest( m_player[k] ) )
				{
					// enemy's bullet hit us
					bullet->m_active = FALSE;
					if( !m_player[k].m_bShield )
					{
						Explode( *bullet );
						PlayerBeenHit( m_player[k] );
						m_DirectSound.Play( EFFECT_EXPLODE );
					}
				}
			}
		}
	}

	// produce some enemys...
	static DWORD lastTime;
	DWORD thisTime = timeGetTime();

	if( thisTime - lastTime > 3000 )
	{
		lastTime = thisTime;
		BoreEnemy();
	}

	// It's time to unlock the enemys
	if( m_bEnemyLocked &&
		thisTime - m_lockTime > 10000 )
	{
		m_bEnemyLocked = FALSE;
	}

	if( m_nEnemys <= 0 && m_gameState == GS_ACTIVE )
	{
		m_gameState = GS_WIN;
		m_lastTime = timeGetTime();
	}

	if( !m_player[0].m_active && !m_player[1].m_active )
		m_gameState = GS_OVER;
}


void CGame::DrawWorld()
{
	
	RECT rc;

	rc.left = OFFSETX;
	rc.right = rc.left + 416;
	rc.top = OFFSETY;
	rc.bottom = rc.top + 416;
	DDClear( &rc, 0x0 );
	
	rc.left = 0;
	rc.right = SCREEN_W;
	rc.top = 0;
	rc.bottom = OFFSETY;
	DDClear( &rc, m_dwFillColor );
	
	rc.top = OFFSETY + 416;
	rc.bottom = SCREEN_H;
	DDClear( &rc, m_dwFillColor );
	
	rc.left = 0;
	rc.right = OFFSETX;
	rc.top = OFFSETY;
	rc.bottom = rc.top + 416;
	DDClear( &rc, m_dwFillColor );
	
	rc.left = OFFSETX + 416;
	rc.right = SCREEN_W;
	DDClear( &rc, m_dwFillColor );
 	
	m_plane.Draw( m_pddsBackBuffer );
	for( int i = 0; i < m_nMaxEnemys; i ++ )
		m_enemy[i].Draw( m_pddsBackBuffer );
	m_player[0].Draw( m_pddsBackBuffer );
	m_player[1].Draw( m_pddsBackBuffer );	
	m_plane.DrawTree( m_pddsBackBuffer );
	for( i = 0; i < NUM_EXPLODES; i ++ )
		m_explode[i].Draw( m_pddsBackBuffer );
	m_bonus.Draw( m_pddsBackBuffer );
	
	rc.left = 0;
	rc.top = 0;
	rc.right = 14;
	rc.bottom = 14;
	for( i = 0; i < m_nEnemysLeft; i ++ )
	{
		int x = 550 + i % 2 * 15;
		int y = 68 + i / 2 * 15;
		
		m_pddsBackBuffer->BltFast( x, y, m_pBmpList[8], &rc,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	}

	rc.left = 28;
	rc.right = rc.left + 28;
	m_pddsBackBuffer->BltFast( 550, 300, m_pBmpList[8], &rc,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

	m_pddsBackBuffer->BltFast( 20, 20, m_pBmpList[8], &rc,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	BltNumber( 70, 20, m_player[0].m_nScore );

	rc.left = 14;
	rc.right = rc.left + 14;
	m_pddsBackBuffer->BltFast( 550, 317, m_pBmpList[8], &rc,
		DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

	BltNumber( 570, 317, m_player[0].m_nLife );

	if( !m_bSingle )
	{
		rc.left = 56;
		rc.right = rc.left + 28;
		m_pddsBackBuffer->BltFast( 550, 350, m_pBmpList[8],
			&rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	
		m_pddsBackBuffer->BltFast( 480, 20, m_pBmpList[8], &rc,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
		BltNumber( 530, 20, m_player[1].m_nScore );

		rc.left = 14;
		rc.right = rc.left + 14;
		m_pddsBackBuffer->BltFast( 550, 367, m_pBmpList[8],
			&rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

		BltNumber( 570, 367, m_player[1].m_nLife );
	}

	// draw level No.
	m_pddsBackBuffer->BltFast( 550, 400, m_pBmpList[12], NULL,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	BltNumber( 580, 420, m_nLevel );
}


void CGame::BltNumber( int x, int y, int n )
{
	char szNum[20];
	sprintf( szNum, "%d", n );
	int len = lstrlen( szNum );

	for( int i = 0; i < len; i ++ )
	{
		RECT rc;
		rc.left = (szNum[i] - '0') * 14;
		rc.right = rc.left + 14;
		rc.top = 0;
		rc.bottom = 14;
		m_pddsBackBuffer->BltFast( x, y, m_pBmpList[13], &rc,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

		x += 15;
	}
}



void CGame::DoSplash()
{
	HRESULT hr;
	
	DDClear( NULL, 0 );

	hr = m_pddsBackBuffer->BltFast( 135, 130, m_pBmpList[10], NULL,
			DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	if( hr == DDERR_SURFACELOST )
		RestoreSurfaces();

	RECT rc;
	rc.left = 0;
	rc.right = 28;
	rc.top = 28;
	rc.bottom = 56;
	m_pddsBackBuffer->BltFast( 200, 300 + 30*(!m_bSingle),
		m_pBmpList[1], &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久色婷婷小香蕉久久| 三级久久三级久久久| 亚洲网友自拍偷拍| 国产成人一级电影| 91 com成人网| 亚洲靠逼com| 国产成人av网站| 日韩免费高清电影| 亚洲大片免费看| 成人不卡免费av| 国产三级一区二区三区| 日韩激情视频在线观看| 91福利精品第一导航| 国产精品国产三级国产aⅴ中文 | 精品国产乱码久久久久久免费| 亚洲女厕所小便bbb| 国产一区二区三区视频在线播放| 欧美色视频在线| 一区二区高清免费观看影视大全| 懂色av噜噜一区二区三区av| 精品国产一二三区| 久久66热偷产精品| 欧美顶级少妇做爰| 亚洲aaa精品| 欧美日韩精品一区二区三区| 亚洲视频1区2区| 99久久99久久精品免费观看| 中文字幕亚洲区| 成人avav影音| 亚洲色图.com| 色www精品视频在线观看| 日本一区二区免费在线| 成人丝袜高跟foot| 中文字幕一区二区三区四区| 东方欧美亚洲色图在线| 欧美国产激情二区三区| 国产激情91久久精品导航| 久久久久国产成人精品亚洲午夜| 美女视频黄 久久| 欧美成人福利视频| 国产美女久久久久| 国产精品无人区| 色综合中文字幕国产| 国产精品久久综合| 色老综合老女人久久久| 亚洲一区二区三区在线播放| 欧美三级视频在线播放| 蜜桃视频一区二区三区| 精品国产乱码久久久久久夜甘婷婷 | 亚洲成av人片在线| 91精品国产91久久综合桃花| 狠狠色狠狠色综合系列| 国产精品嫩草99a| 欧美一区二区在线播放| 狠狠色丁香婷婷综合| 中国色在线观看另类| 色偷偷88欧美精品久久久| 亚洲国产精品麻豆| 久久久夜色精品亚洲| 一本大道久久精品懂色aⅴ| 亚洲一区二区三区在线看| 日韩女同互慰一区二区| 成人va在线观看| 丝袜美腿高跟呻吟高潮一区| 久久午夜免费电影| 91麻豆免费观看| 青青草精品视频| 国产精品福利一区二区| 91精品国产综合久久久久久久久久| 国产精品一区二区在线播放| 一区二区三区中文字幕精品精品| 日韩一区二区三区视频| jiyouzz国产精品久久| 日韩和欧美的一区| 国产精品久久久久久久久免费相片| 欧美日韩一区久久| 从欧美一区二区三区| 日日摸夜夜添夜夜添精品视频 | 亚洲成人手机在线| 国产日韩在线不卡| 日韩一区二区电影网| 97久久久精品综合88久久| 久久不见久久见中文字幕免费| 中文字幕一区不卡| 久久亚洲综合色| 777久久久精品| 在线视频一区二区三| 国产91精品精华液一区二区三区| 日韩高清不卡在线| 亚洲精品成人天堂一二三| 国产日本亚洲高清| 精品国产伦一区二区三区观看方式| 欧美综合一区二区| 91日韩在线专区| 成人中文字幕合集| 精品一区二区在线视频| 亚洲va天堂va国产va久| 一区二区三区中文在线| 中文字幕在线不卡| 国产精品污污网站在线观看| 欧美不卡一区二区| 日韩一区二区中文字幕| 欧美视频在线观看一区二区| 色国产综合视频| 91一区二区在线| 99re免费视频精品全部| 成人听书哪个软件好| 国产成人精品亚洲777人妖 | 精品视频一区三区九区| 91激情五月电影| 色猫猫国产区一区二在线视频| a级高清视频欧美日韩| av一二三不卡影片| 99免费精品在线| 91在线小视频| 色偷偷88欧美精品久久久| 日本道精品一区二区三区| 91在线精品一区二区| 91看片淫黄大片一级在线观看| 99精品黄色片免费大全| 日本久久电影网| 欧美挠脚心视频网站| 欧美一三区三区四区免费在线看| 国产精品免费视频观看| 欧美高清在线视频| 国产精品国产精品国产专区不蜜| 亚洲欧美综合另类在线卡通| 亚洲欧美国产77777| 亚洲va欧美va国产va天堂影院| 日韩成人一区二区| 九九国产精品视频| 丁香天五香天堂综合| 99国产精品久久| 欧美日韩国产乱码电影| 欧美一区二区三区视频| 精品国产乱码久久| 欧美激情一区二区在线| 亚洲欧美日韩电影| 日韩精品久久理论片| 国产在线精品一区二区三区不卡| 成人少妇影院yyyy| 在线国产电影不卡| 久久综合狠狠综合久久综合88| 中文无字幕一区二区三区| 亚洲乱码中文字幕| 久久99精品久久久久久动态图| 成人免费视频一区| 欧美日韩视频在线一区二区 | 国产综合久久久久久鬼色| 成人一区二区三区视频在线观看| 色94色欧美sute亚洲线路一ni| 欧美日韩久久一区| 国产欧美日韩在线看| 亚洲高清免费观看| 国产一区二区三区免费播放| 91久久香蕉国产日韩欧美9色| 欧美大度的电影原声| 1000精品久久久久久久久| 美女视频网站黄色亚洲| 成人国产电影网| 欧美一卡二卡三卡| 中文字幕一区二区三区色视频 | 日韩精品在线一区二区| 国产精品毛片大码女人| 蜜臀久久99精品久久久画质超高清| 99精品黄色片免费大全| 精品99999| 婷婷综合五月天| 972aa.com艺术欧美| 久久午夜电影网| 日本亚洲天堂网| 在线免费一区三区| 国产精品网站在线| 国产一区视频在线看| 欧美日韩不卡一区| 亚洲欧美另类久久久精品2019| 国产精品一品二品| 欧美成人一区二区三区片免费 | 国产揄拍国内精品对白| 欧美久久高跟鞋激| 亚洲激情成人在线| 99综合电影在线视频| 久久久久9999亚洲精品| 裸体歌舞表演一区二区| 欧美三级视频在线播放| 亚洲一区中文在线| 色悠悠亚洲一区二区| 欧美国产日韩在线观看| 国产精选一区二区三区| 欧美精品一区二区三区视频| 蜜臀91精品一区二区三区| 在线成人小视频| 日韩av在线播放中文字幕| 色狠狠色狠狠综合| 亚洲免费在线看| 色av一区二区| 亚洲一区二区三区小说| 欧美日韩一区二区三区高清| 亚洲国产精品人人做人人爽| 91成人免费网站|