📄 shot.cpp
字号:
//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------
#include "Shot.h"
//-----------------------------------------------------------------------------
//游戏引擎函数
//-----------------------------------------------------------------------------
BOOL GameInitialize(HINSTANCE hInstance)
{
//创建游戏引擎
g_pGame = new GameEngine(hInstance, TEXT("Shot"),
TEXT("Shot Made By MJ"), IDI_WuLinShot, IDI_WuLinShot_SM, 500, 398);
if (g_pGame == NULL)
return FALSE;
//设置帧频
g_pGame->SetFrameRate(30);
//存储实例句柄
g_hInstance = hInstance;
return TRUE;
}
void GameStart(HWND hWindow)
{
//生成随机数生成器种子
srand(GetTickCount());
//创建屏幕外设备环境和位图
g_hOffscreenDC = CreateCompatibleDC(GetDC(hWindow));
g_hOffscreenBitmap = CreateCompatibleBitmap(GetDC(hWindow),
g_pGame->GetWidth(), g_pGame->GetHeight());
SelectObject(g_hOffscreenDC, g_hOffscreenBitmap);
//创建并加载方块位图
HDC hDC = GetDC(hWindow);
g_pOfficeBitmap = new Bitmap(hDC, IDB_OFFICE, g_hInstance);
g_pTargetBitmap = new Bitmap(hDC, IDB_TARGET, g_hInstance);
g_pPowBitmap = new Bitmap(hDC, IDB_POW, g_hInstance);
g_pRabbitBitmap = new Bitmap(hDC, IDB_RABBIT, g_hInstance);
g_pSnakeBitmap = new Bitmap(hDC, IDB_SNAKE, g_hInstance);
g_pDeerBitmap = new Bitmap(hDC, IDB_DEER, g_hInstance);
g_pBearBitmap = new Bitmap(hDC, IDB_BEAR, g_hInstance);
g_pPigBitmap = new Bitmap(hDC, IDB_PIG, g_hInstance);
g_pEagleBitmap = new Bitmap(hDC, IDB_EAGLE, g_hInstance);
g_pSmallGuyBitmap = new Bitmap(hDC, IDB_SMALLGUY, g_hInstance);
g_pGameOverBitmap = new Bitmap(hDC, IDB_GAMEOVER, g_hInstance);
//创建靶心、爆炸及猎物(猪、熊、鹰、兔、蛇、鹿)子画面
RECT rcBounds = { 0, 0, 500, 398 };
g_pTargetSprite = new Sprite(g_pTargetBitmap, rcBounds, BA_STOP);
g_pTargetSprite->SetZOrder(3);
g_pGame->AddSprite(g_pTargetSprite);
g_pPowSprite = new Sprite(g_pPowBitmap, rcBounds,BA_STOP);
g_pPowSprite->SetZOrder(3);
g_pPowSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pPowSprite);
g_pEagleSprite = new Sprite(g_pEagleBitmap, rcBounds);
g_pEagleSprite->SetPosition(240,10);
g_pEagleSprite->SetZOrder(2);
g_pEagleSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pEagleSprite);
g_pDeerSprite = new Sprite(g_pDeerBitmap, rcBounds);
g_pDeerSprite->SetPosition(158,189);
g_pDeerSprite->SetZOrder(2);
g_pDeerSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pDeerSprite);
g_pPigSprite = new Sprite(g_pPigBitmap, rcBounds);
g_pPigSprite->SetPosition(398,291);
g_pPigSprite->SetZOrder(2);
g_pPigSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pPigSprite);
g_pBearSprite = new Sprite(g_pBearBitmap, rcBounds);
g_pBearSprite->SetPosition(254,87);
g_pBearSprite->SetZOrder(2);
g_pBearSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pBearSprite);
g_pSnakeSprite = new Sprite(g_pSnakeBitmap, rcBounds);
g_pSnakeSprite->SetPosition(30, 39);
g_pSnakeSprite->SetZOrder(2);
g_pSnakeSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pSnakeSprite);
g_pRabbitSprite = new Sprite(g_pRabbitBitmap, rcBounds);
g_pRabbitSprite->SetPosition(92, 175);
g_pRabbitSprite->SetZOrder(2);
g_pRabbitSprite->SetHidden(TRUE);
g_pGame->AddSprite(g_pRabbitSprite);
g_pGuySprites[0] = g_pRabbitSprite;
g_pGuySprites[1] = g_pSnakeSprite;
g_pGuySprites[2] = g_pEagleSprite;
g_pGuySprites[3] = g_pPigSprite;
g_pGuySprites[4] = g_pDeerSprite;
g_pGuySprites[5] = g_pBearSprite;
//初始化其余全局变量
g_iGuyMasterDelay = 50;
g_iHits = 0;
g_iMisses = 0;
g_bGameOver = FALSE;
//播放背景音乐
g_pGame->PlayMIDISong(TEXT("Music.mid"));
}
void GameEnd()
{
//关闭背景音乐的MIDI播放器
g_pGame->CloseMIDIPlayer();
//清理屏幕外设备环境和位图
DeleteObject(g_hOffscreenBitmap);
DeleteDC(g_hOffscreenDC);
//清理子画面
delete g_pOfficeBitmap;
delete g_pTargetBitmap;
delete g_pPowBitmap;
delete g_pRabbitBitmap;
delete g_pEagleBitmap;
delete g_pSnakeBitmap;
delete g_pDeerBitmap;
delete g_pBearBitmap;
delete g_pPigBitmap;
delete g_pSmallGuyBitmap;
delete g_pGameOverBitmap;
//清理游戏引擎
delete g_pGame;
}
void GameActivate(HWND hWindow)
{
//恢复背景音乐
g_pGame->PlayMIDISong(TEXT(""), FALSE);
}
void GameDeactivate(HWND hWindow)
{
//暂停背景音乐
g_pGame->PauseMIDISong();
}
void GamePaint(HDC hDC)
{
//绘制背景
g_pOfficeBitmap->Draw(hDC, 0, 0);
//绘制子画面
g_pGame->DrawSprites(hDC);
//绘制击中的人数
TCHAR szText[64];
RECT rect = { 237, 360, 301, 390 };
wsprintf(szText, "%d", g_iHits);
DrawText(hDC, szText, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
//绘制未击中(逃脱)的人数
for (int i = 0; i < g_iMisses; i++)
g_pSmallGuyBitmap->Draw(hDC, 389 + (g_pSmallGuyBitmap->GetWidth() * i), 359, TRUE);
//如有必要,绘制游戏结束消息
if (g_bGameOver)
{
g_pGameOverBitmap->Draw(hDC, 120, 110, TRUE);
}
}
void GameCycle()
{
if (!g_bGameOver)
{
for (int i = 0; i < 6; i++)
if (g_pGuySprites[i]->IsHidden())
{
if (rand() % 60 == 0)
{
//显示猎物
g_pGuySprites[i]->SetHidden(FALSE);
// Start the countdown delay
g_iGuyDelay[i] = 20 + (rand() % g_iGuyMasterDelay);
}
}
else
{
if (--g_iGuyDelay[i] == 0)
{
//隐藏猎物
g_pGuySprites[i]->SetHidden(TRUE);
//将未命中数加1
if (++g_iMisses == 5)
{
//结束游戏
g_pGame->PauseMIDISong();
PlaySound((LPCSTR)IDW_GAMEOVER, g_hInstance, SND_ASYNC | SND_RESOURCE);
for (int i = 0; i < 6; i++)
g_pGuySprites[i]->SetHidden(TRUE);
g_bGameOver = TRUE;
}
}
}
//更新子画面
g_pGame->UpdateSprites();
//在屏幕外设备环境上绘制游戏
HWND hWindow = g_pGame->GetWindow();
HDC hDC = GetDC(hWindow);
GamePaint(g_hOffscreenDC);
//将屏幕外位图绘制到游戏屏幕
BitBlt(hDC, 0, 0, g_pGame->GetWidth(), g_pGame->GetHeight(),g_hOffscreenDC, 0, 0, SRCCOPY);
//清理
ReleaseDC(hWindow, hDC);
}
}
void HandleKeys()
{
}
void MouseButtonDown(int x, int y, BOOL bLeft)
{
// 只检查鼠标左键
if (!g_bGameOver && bLeft)
{
//临时隐藏靶心和爆炸子画面
g_pTargetSprite->SetHidden(TRUE);
g_pPowSprite->SetHidden(TRUE);
//查看是否单击了一个猎物子画面
Sprite* pSprite;
if ((pSprite = g_pGame->IsPointInSprite(x, y)) != NULL)
{
//播放击中的声音
PlaySound((LPCSTR)IDW_SELECT, g_hInstance, SND_ASYNC | SND_RESOURCE);
// 定位并显示爆炸子画面
g_pPowSprite->SetPosition(x - (g_pPowSprite->GetWidth() / 2),y - (g_pPowSprite->GetHeight() / 2));
g_pPowSprite->SetHidden(FALSE);
//隐藏单机的同事
pSprite->SetHidden(TRUE);
//增加击中数并在必要时提高游戏难度
g_iHits++;
if ((g_iHits % 5) == 0)
if (--g_iGuyMasterDelay == 0)
g_iGuyMasterDelay = 1;
}
//再次显示靶心子画面
g_pTargetSprite->SetHidden(FALSE);
}
else if (g_bGameOver && !bLeft)
{
//开始一个新游戏
g_bGameOver = FALSE;
g_iHits = 0;
g_iMisses = 0;
}
}
void MouseButtonUp(int x, int y, BOOL bLeft)
{
}
void MouseMove(int x, int y)
{
//使用靶心子画面跟踪鼠标
g_pTargetSprite->SetPosition(x - (g_pTargetSprite->GetWidth() / 2), y - (g_pTargetSprite->GetHeight() / 2));
}
void HandleJoystick(JOYSTATE jsJoystickState)
{
}
BOOL SpriteCollision(Sprite* pSpriteHitter, Sprite* pSpriteHittee)
{
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -