// 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)
没有合适的资源?快使用搜索试试~ 我知道了~
vc++MFC坦克源代码
共76个文件
map:20个
bmp:15个
h:7个
3星 · 超过75%的资源 需积分: 10 6 下载量 2 浏览量
2011-04-19
23:56:57
上传
评论
收藏 1.54MB RAR 举报
温馨提示
自己编写的坦克小游戏,欢迎下载!欢迎下载!欢迎下载!
资源推荐
资源详情
资源评论
收起资源包目录
178193326tanke.rar (76个子文件)
坦克大战
Sound.h 903B
Release
wavread.cpp 9KB
res
tank.ico 1KB
Thumbs.db 3KB
graphics
shield.bmp 3KB
num.bmp 1KB
misc.bmp 2KB
tile.bmp 8KB
gameover.bmp 40KB
bonus.bmp 6KB
player2.bmp 26KB
bullet.bmp 1KB
splash.bmp 41KB
enemy.bmp 50KB
bore.bmp 5KB
player1.bmp 26KB
flag.bmp 2KB
explode1.bmp 566B
explode2.bmp 5KB
Thumbs.db 50KB
Plane.cpp 9KB
Sound.cpp 3KB
BattleCity.aps 18KB
BattleCity.rc 2KB
BattleCity.dsw 528B
Plane.h 2KB
BattleCity.opt 48KB
Game.cpp 34KB
Debug
vc60.pdb 108KB
Plane.obj 28KB
wavread.obj 19KB
BattleCity.exe 264KB
BattleCity.ilk 315KB
BattleCity.pch 3.86MB
vc60.idb 185KB
Sprite.obj 39KB
BattleCity.res 1KB
Input.obj 19KB
Game.obj 82KB
BattleCity.pdb 713KB
Sound.obj 21KB
Input.cpp 5KB
Sprite.cpp 11KB
resource.h 504B
BattleCity.dsp 5KB
BattleCity.plg 949B
sound
hit.wav 790B
Gunfire.wav 2KB
Peow.wav 2KB
Bang.wav 9KB
Fanfare.wav 4KB
wavread.h 1KB
Game.h 3KB
Input.h 1KB
map
level19.map 227B
level1.map 242B
level14.map 234B
level18.map 232B
level6.map 228B
level9.map 221B
level11.map 222B
level13.map 238B
level4.map 253B
level17.map 220B
level12.map 218B
level8.map 223B
level20.map 212B
level5.map 217B
level3.map 217B
level10.map 240B
level15.map 228B
level2.map 228B
level16.map 188B
level7.map 221B
Sprite.h 4KB
BattleCity.ncb 97KB
共 76 条
- 1
资源评论
- 珠沉玉没香尤存2015-03-10有一定参考价值
Micheal_Xiao
- 粉丝: 9
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功