// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "Game.h"
#include "resource.h"
#define SCREEN_W 640
#define SCREEN_H 480
#define OFFSETX 100
#define OFFSETY 48
#define PLAYER1_STARTX 130
#define PLAYER1_STARTY 386
#define PLAYER2_STARTX 258
#define PLAYER2_STARTY 386
#define SAFE_RELEASE(x) if(x){ x->Release(); x = NULL; }
CGame* g_pGame;
inline int random( int min, int max )
{
return (min + rand() % (max - min + 1));
}
void TRACE( LPCTSTR format, ... )
{
char buf[128];
va_list vl;
va_start(vl, format);
sprintf(buf, format, vl);
OutputDebugString( buf );
va_end(vl);
}
void CGame::OutputText( int x, int y, LPCTSTR string )
{
HDC hdc;
if( m_pddsBackBuffer &&
m_pddsBackBuffer->GetDC(&hdc) == DD_OK )
{
SetBkMode( hdc, TRANSPARENT );
SetTextColor( hdc, RGB(255,255,0) );
TextOut( hdc, x, y, string, lstrlen(string) );
m_pddsBackBuffer->ReleaseDC( hdc );
}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGame::CGame()
{
m_hInst = NULL;
m_hWnd = NULL;
m_bActive = FALSE;
m_bShowStats = FALSE;
m_bFullScreen = TRUE;
m_bSingle = TRUE;
m_pDD = NULL;
m_pddsFrontBuffer = NULL;
m_pddsBackBuffer = NULL;
g_pGame = this;
}
CGame::~CGame()
{
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( g_pGame )
return g_pGame->MsgProc( hWnd, uMsg, wParam, lParam );
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
LRESULT CGame::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_ACTIVATEAPP:
if( m_bActive = (BOOL)wParam )
m_DirectInput.Acquire();
return 0;
case WM_SETCURSOR:
if( m_bFullScreen )
{
SetCursor( NULL );
return TRUE;
}
break;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
case WM_MOVE:
m_bActive = TRUE;
GetClientRect( hWnd, &m_rcWindow );
ClientToScreen( hWnd, (LPPOINT)&m_rcWindow );
ClientToScreen( hWnd, (LPPOINT)&m_rcWindow + 1 );
return 0;
case WM_MOVING:
m_bActive = FALSE;
break;
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
if( m_gameState == GS_ACTIVE )
m_gameState = GS_SPLASH;
else if( m_gameState == GS_SPLASH )
PostQuitMessage(0);
else if( m_gameState == GS_OVER )
m_gameState = GS_SPLASH;
break;
case VK_F4:
DDTerm();
m_bFullScreen = !m_bFullScreen;
DDInit();
return 0;
case VK_F5:
m_bShowStats = !m_bShowStats;
return 0;
case VK_DOWN:
case VK_UP:
if( m_gameState == GS_SPLASH )
{
m_bSingle = !m_bSingle;
return 0;
}
break;
case VK_PRIOR:
if( m_gameState == GS_ACTIVE && m_nLevel > 1 )
{
m_nLevel --;
InitLevel();
}
break;
case VK_NEXT:
if( m_gameState == GS_ACTIVE )
{
m_nLevel ++;
InitLevel();
}
break;
case VK_RETURN:
if( m_gameState == GS_SPLASH )
{
ResetGame();
return 0;
}
else if( m_gameState == GS_ACTIVE && !m_bSingle )
{
if( m_player[0].m_nLife > 1 &&
m_player[1].m_nLife <= 0 )
{
m_player[0].m_nLife --;
m_player[1].m_nLife = 1;
ResetPlayer( m_player[1] );
}
else if( m_player[1].m_nLife > 1 &&
m_player[0].m_nLife <= 0 )
{
m_player[1].m_nLife --;
m_player[0].m_nLife = 1;
ResetPlayer( m_player[0] );
}
}
break;
}
break;
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
BOOL CGame::Initialize( HINSTANCE hInst )
{
m_hInst = hInst;
if( !InitApplication() ||
!DDInit() ||
!InitGame() )
{
DDTerm();
return FALSE;
}
return TRUE;
}
BOOL CGame::InitApplication()
{
char szClassName[] = "BATTLECITY";
char szTitle[] = "Battle City";
WNDCLASS wc;
wc.hInstance = m_hInst;
wc.lpszClassName = szClassName;
wc.lpfnWndProc = WndProc;
wc.style = CS_DBLCLKS;
wc.hIcon = LoadIcon( m_hInst, MAKEINTRESOURCE(IDI_TANK) );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
if( !RegisterClass( &wc ) )
{
TRACE( "Error In RegisterClassEx\n" );
return FALSE;
}
m_hWnd = CreateWindow( szClassName,
szTitle,
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT,
CW_USEDEFAULT,
646, 505,
NULL,
NULL,
m_hInst,
NULL );
if( !m_hWnd )
{
TRACE( "Error In CreateWindow\n" );
return FALSE;
}
UpdateWindow( m_hWnd );
ShowWindow( m_hWnd, SW_NORMAL );
return TRUE;
}
int CGame::Run()
{
MSG msg;
while( TRUE )
{
if (PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage( &msg, NULL, 0, 0))
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if( m_bActive )
{
UpdateFrame();
}
else
WaitMessage();
}
DDTerm();
return msg.wParam;
}
BOOL CGame::DDInit()
{
HRESULT hr;
hr = DirectDrawCreate( NULL, &m_pDD, NULL );
if( FAILED(hr) )
{
TRACE( "Error Create DirectDraw\n" );
return FALSE;
}
if( m_bFullScreen )
m_pDD->SetCooperativeLevel( m_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
else
m_pDD->SetCooperativeLevel( m_hWnd, DDSCL_NORMAL );
if( m_bFullScreen )
{
if( FAILED(m_pDD->SetDisplayMode( 640, 480, 16 )) )
{
TRACE( "Error SetDiaplayMode\n" );
return FALSE;
}
}
DDSURFACEDESC ddsd;
ZeroMemory( &ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if( m_bFullScreen )
{
ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
}
hr = m_pDD->CreateSurface( &ddsd, &m_pddsFrontBuffer, NULL );
if( FAILED(hr) )
{
TRACE( "Error Create Front Buffer\n" );
return FALSE;
}
if( m_bFullScreen )
{
DDSCAPS ddscaps;
ZeroMemory( &ddscaps, sizeof(ddscaps) );
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
m_pddsFrontBuffer->GetAttachedSurface( &ddscaps, &m_pddsBackBuffer );
}
else
m_pddsBackBuffer = DDCreateSurface( SCREEN_W, SCREEN_H );
if( !LoadBitmaps() )
return FALSE;
m_plane.BitBlt( m_pBmpList[0] );
m_player[0].BitBlt( m_pBmpList[1], m_pBmpList[2], m_pBmpList[14], m_pBmpList[7] );
m_player[1].BitBlt( m_pBmpList[9], m_pBmpList[2], m_pBmpList[14], m_pBmpList[7] );
for( int i = 0; i < NUM_ENEMYS; i ++ )
m_enemy[i].BitBlt( m_pBmpList[5], m_pBmpList[2], m_pBmpList[14], m_pBmpList[7] );
for( i = 0; i < NUM_EXPLODES; i ++ )
m_explode[i].BitBlt( m_pBmpList[3], m_pBmpList[4] );
m_bonus.BitBlt( m_pBmpList[6] );
m_dwFillColor = DDColorMatch( m_pddsBackBuffer, RGB(128,128,128) );
if( !m_bFullScreen )
{
SetWindowPos( m_hWnd, 0, 0, 0, 646, 505, SWP_NOMOVE | SWP_NOZORDER );
m_rcWindow.right = m_rcWindow.left + 640;
m_rcWindow.bottom = m_rcWindow.top + 480;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: DDLoadBitmap()
// Desc: Create a DirectDrawSurface from a bitmap resource.
//-----------------------------------------------------------------------------
LPDIRECTDRAWSURFACE CGame::DDLoadBitmap( LPCSTR szBitmap, int dx, int dy)
{
HBITMAP hbm;
BITMAP bm;
DDSURFACEDESC ddsd;
LPDIRECTDRAWSURFACE pdds;
//
// Try to load the bitmap as a resource, if that fails, try it as a file
//
hbm = (HBITMAP)
没有合适的资源?快使用搜索试试~ 我知道了~
c++项目实战
共114个文件
map:40个
bmp:30个
wav:10个
需积分: 50 176 下载量 25 浏览量
2018-01-05
16:18:09
上传
评论 16
收藏 1.47MB RAR 举报
温馨提示
c++项目实战实现坦克大战期末课程设计实现可视化的坦克大战
资源推荐
资源详情
资源评论
收起资源包目录
c++项目实战 (114个子文件)
enemy.bmp 50KB
enemy.bmp 50KB
splash.bmp 41KB
splash.bmp 41KB
gameover.bmp 40KB
gameover.bmp 40KB
player2.bmp 26KB
player1.bmp 26KB
player2.bmp 26KB
player1.bmp 26KB
tile.bmp 8KB
tile.bmp 8KB
bonus.bmp 6KB
bonus.bmp 6KB
explode2.bmp 5KB
bore.bmp 5KB
bore.bmp 5KB
explode2.bmp 5KB
shield.bmp 3KB
shield.bmp 3KB
misc.bmp 2KB
misc.bmp 2KB
flag.bmp 2KB
flag.bmp 2KB
bullet.bmp 1KB
bullet.bmp 1KB
num.bmp 1KB
num.bmp 1KB
explode1.bmp 566B
explode1.bmp 566B
Game.cpp 34KB
Sprite.cpp 11KB
wavread.cpp 9KB
Plane.cpp 9KB
Input.cpp 5KB
Sound.cpp 3KB
BattleCity.dsp 5KB
BattleCity.dsw 545B
BattleCity.exe 264KB
BattleCity.exe 240KB
Sprite.h 4KB
Game.h 3KB
Plane.h 2KB
wavread.h 1KB
Input.h 1KB
Sound.h 903B
resource.h 504B
tank.ico 1KB
vc60.idb 169KB
BattleCity.ilk 305KB
level4.map 253B
level4.map 253B
level1.map 242B
level1.map 242B
level10.map 240B
level10.map 240B
level13.map 238B
level13.map 238B
level14.map 234B
level14.map 234B
level18.map 232B
level18.map 232B
level6.map 228B
level15.map 228B
level2.map 228B
level6.map 228B
level15.map 228B
level2.map 228B
level19.map 227B
level19.map 227B
level8.map 223B
level8.map 223B
level11.map 222B
level11.map 222B
level7.map 221B
level9.map 221B
level7.map 221B
level9.map 221B
level17.map 220B
level17.map 220B
level12.map 218B
level12.map 218B
level3.map 217B
level3.map 217B
level5.map 217B
level5.map 217B
level20.map 212B
level20.map 212B
level16.map 188B
level16.map 188B
BattleCity.ncb 97KB
Game.obj 82KB
Sprite.obj 39KB
Plane.obj 28KB
Sound.obj 20KB
Input.obj 19KB
wavread.obj 19KB
BattleCity.opt 49KB
BattleCity.pch 3.52MB
BattleCity.pdb 569KB
共 114 条
- 1
- 2
资源评论
cplusplus02
- 粉丝: 3
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功