⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shot.cpp

📁 [简介] 名称:《打猎》-附源代码 (代码行数:1773 注释行数:363) 开发环境:WinXp+VC.Net2005+Win32 API 作者:mj 联系方式:mj055@yahoo.cn
💻 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 + -