/*****************************************************************************
*
* GameManager.cpp
*
* Electrical Engineering Faculty - Software Lab
* Spring semester 1998
*
* Tanks game
*
* Module description: The core of the game - implements the main game loop.
* Holds the list of objects participating in the game.
* In every game iteration, all the objects on the list
* are refreshed, and the game display is updated.
* More details on the algorithms in use are described below.
*
* Authors: Eran Yariv - 28484475
* Moshe Zur - 24070856
*
*
* Date: 23/09/98
*
******************************************************************************/
#include "stdafx.h"
#include <afxmt.h>
#include "tanks.h"
#include "DIB.h"
#include "GameManager.h"
#include "ImageManager.h"
#include "MsgQueue.h"
#include "Bonus.h"
#include "GameBoard.h"
#include "TankObj.h"
#include "Shell.h"
#include "Bullet.h"
#include "Mine.h"
#include "Bomber.h"
#include "Message.h"
#include "GameOver.h"
CGameManager::CGameManager (UINT uFreq) :
m_Timer(TANKS_APP->m_gTimer),
m_ImageManager(TANKS_APP->m_gImageManager),
m_MsgQueue(TANKS_APP->m_gIncomingMsgQueue),
m_CommManager(TANKS_APP->m_gCommManager),
m_dwBonusTimeout (0)
{
VERIFY (SetFrequency (uFreq));
}
BOOL CGameManager::SetFrequency (UINT uFreq)
{
if (uFreq < MIN_RENDER_FREQ || uFreq > MAX_RENDER_FREQ)
return FALSE;
m_uFreq = uFreq;
m_uMilliSleep = UINT (double(1000.0) / double(m_uFreq));
return TRUE;
}
UINT CGameManager::ThreadEntry (LPVOID /*lpParam*/)
{
SetPriority (GAME_MANAGER_THREAD_PRIORITY);
m_MapHWnd = TANKS_APP->m_gHwndMap; // Get handle to map (Windows handle)
ASSERT (NULL != m_MapHWnd);
m_dwChkSumSignal = 0; // Don't send check sum right away
m_iNumTanks = 0; // Initially, no tanks.
m_iLocalTankID = -1; // Initially, no local tank
HDC dc = ::GetDC (m_MapHWnd);
m_BackBuffer.CreateEmpty (MAP_WIDTH, MAP_HEIGHT);// Create back (off-screen) buffer
m_BackBuffer.GetPaletteFromResourceBitmap (IDB_BULLET);
TANKS_APP->m_gDrawDIB.SetPalette (*m_BackBuffer.m_pPalette);
TANKS_APP->m_gDrawDIB.Realize (dc, FALSE);
::ReleaseDC (m_MapHWnd, dc);
MultiRectGameTechnique (); // Do the game main loop
DestroyObjects (); // Kill list of objects
return 0;
}
void CGameManager::DestroyObjects ()
{
m_GameObjsList.KillList();
m_TanksCS.Lock();
for (int i=0; i<MAX_TANKS; i++)
m_pTanks[i] = NULL;
m_TanksCS.Unlock();
m_BonusCS.Lock();
m_pBonus = NULL;
m_BonusCS.Unlock();
m_iNumTanks = 0;
}
#pragma warning (disable : 4701)
/* warning C4701: local variable 'CurObjHImg' may be used without having been initialized
God damn it, trust me on this one - I know what I'm doing here....
*/
/*------------------------------------------------------------------------------
Function: MultiRectGameTechnique
Purpose: Main game loop. Every iteration of the loop, game objects recalc
their status, and the display is refreshed. Every Iteration lasts a
constant period of time, to allow a steady frame rate of the display,
using the sleep system call, to stay low on CPU use.
Input: None.
Output: None.
Remarks: The algorithm in use is explained in details in the Programmers's
manual section in the game's help files.
------------------------------------------------------------------------------*/
void
CGameManager::MultiRectGameTechnique ()
{
#ifdef GATHER_RENDERING_STATS
DWORD dwLoopCount=0;
DWORD dwStartTime = GetTickCount();
int lTotalTimeLeft = 0, // For statistics only !
lMaxTimeLeft = 0, // For statistics only !
lMinTimeLeft = LONG(m_uMilliSleep), // For statistics only !
iMaxObjs = 0; // For statistics only !
#endif // GATHER_RENDERING_STATS
BOOL bImageChanged;
typedef struct {
HIMAGE himg;
CPoint ObjectPos;
} UpdateArrayUnit;
UpdateArrayUnit UpdateArray[MAX_POSSIBLE_OBJECTS];
UINT uArrIndex;
LONG lSleepTime; // Time left to sleep (may be negative if loop is too slow)
m_bRefreshAll = TRUE;
// Initially, empty the message queue to add the board object to the game objects list
EmptyMsgQ(dwStartTime);
// First, create the constant board in the back-buffer
LIST_POS lp = m_GameObjsList.GetHeadPosition();
CGameObject* pBoard = m_GameObjsList.GetNext(lp);
ASSERT (pBoard->GetType() == BOARD);
CDIB *pBoardDIB = m_ImageManager.ExposeDIB (pBoard->GetImage());
// Copy the board directly - no transparency
m_BackBuffer.CopyFrom (pBoardDIB);
while (!m_bEndThread)
{ // Loop while game lasts
// Get sample time
DWORD dwCurTime = m_Timer.GetLocalTime();
DWORD dwLoopStart = dwCurTime;
AttemptToSendGameChecksum ();
if (m_CommManager.IsHost())
TryToAddBonus (dwCurTime);
// Empty object list requests queue
bImageChanged = EmptyMsgQ(dwCurTime);
// Init update rectangle
m_UpdateRegionRect.SetRectEmpty();
// Init updates array
uArrIndex = 0;
//
// First pass: loop the objects
//
// Walk over game objects and update rectangle
// Skip the board:
LIST_POS lp = m_GameObjsList.GetHeadPosition();
CGameObject* pGameObj = m_GameObjsList.GetNext(lp);
ASSERT (pGameObj->GetType() == BOARD);
// Loop the other (transparent non-board) objects:
for ( pGameObj = m_GameObjsList.GetNext(lp);
pGameObj;
pGameObj = m_GameObjsList.GetNext(lp) )
{
StateType CurObjState = pGameObj->CalcState(dwCurTime);
HIMAGE CurObjHImg;
// Get new position from current object
CPoint CurObjPos = pGameObj->GetPos();
// Get update rectangle from current object
CRect CurObjUpdateRect = pGameObj -> GetUpdateRectangle();
// Update region to be union of all rectangles
m_UpdateRegionRect |= CurObjUpdateRect;
if (STATE_DEAD == CurObjState)
{ // Object is no longer with us:
BOOL fIsMine = FALSE;
if (pGameObj->GetType() == MINE)
{
fIsMine = TRUE;
}
else if (pGameObj->GetType() == TA
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本游戏实现了一个实时、多人、分布式坦克对战游戏。游戏的主要特征包括: 游戏运行于Win32平台(Win95 / 98, Win NT 4或者更高); 支持各种通信协议(LAN, Internet, Dial-up, Direct cable); 游戏允许四个人参与; 游戏使用图像和动画来显示背景和移动目标; 一个游戏片断是驻留在服务器上; 每个参赛者要么是一个服务器,要么是一个客户; 客户与服务器交互,并参与到游戏之中。 主要编程特征: 基于MFC; 充分应用C++特征; 使用DirectPlay; 使用DirectSound; 多线程; 使用DIBs和DrawDIB API (基于WFW)用于动画处理; 同步机制; 消息打包和解包; 定时机制; 自动和随机地传输地形; 图像管理器; 线程内消息快速排队支持; 键盘管理器:将虚拟键映射为本地坦克的随机移动; 动画对话框; 动画控件。
资源推荐
资源详情
资源评论
收起资源包目录
VC++6.0 分布式坦克大战游戏 源码 (510个子文件)
TANKS.001 38KB
Tanks.aps 3.59MB
TANK3.AVI 174KB
TANK1.AVI 174KB
TANK2.AVI 151KB
TANK4.AVI 150KB
DEFAULT.AVI 22KB
CANCEL.AVI 21KB
OK.AVI 13KB
SPLASH.BMP 245KB
BOARD.BMP 245KB
GAMEOVER-30.BMP 26KB
GAMEOVER-03.BMP 26KB
GAMEOVER-58.BMP 26KB
GAMEOVER-20.BMP 26KB
GAMEOVER-51.BMP 26KB
GAMEOVER-14.BMP 26KB
GAMEOVER-23.BMP 26KB
GAMEOVER-24.BMP 26KB
GAMEOVER-39.BMP 26KB
GAMEOVER-10.BMP 26KB
GAMEOVER-07.BMP 26KB
GAMEOVER-36.BMP 26KB
GAMEOVER-29.BMP 26KB
GAMEOVER-33.BMP 26KB
GAMEOVER-12.BMP 26KB
GAMEOVER-56.BMP 26KB
GAMEOVER-55.BMP 26KB
GAMEOVER-25.BMP 26KB
GAMEOVER-40.BMP 26KB
GAMEOVER-22.BMP 26KB
GAMEOVER-47.BMP 26KB
GAMEOVER-44.BMP 26KB
GAMEOVER-31.BMP 26KB
GAMEOVER-35.BMP 26KB
GAMEOVER-11.BMP 26KB
GAMEOVER-18.BMP 26KB
GAMEOVER-28.BMP 26KB
GAMEOVER-19.BMP 26KB
GAMEOVER-42.BMP 26KB
GAMEOVER-16.BMP 26KB
GAMEOVER-59.BMP 26KB
GAMEOVER-01.BMP 26KB
GAMEOVER-37.BMP 26KB
GAMEOVER-09.BMP 26KB
GAMEOVER-34.BMP 26KB
GAMEOVER-46.BMP 26KB
GAMEOVER-54.BMP 26KB
GAMEOVER-48.BMP 26KB
GAMEOVER-08.BMP 26KB
GAMEOVER-32.BMP 26KB
GAMEOVER-15.BMP 26KB
GAMEOVER-06.BMP 26KB
GAMEOVER-49.BMP 26KB
GAMEOVER-17.BMP 26KB
GAMEOVER-41.BMP 26KB
GAMEOVER-27.BMP 26KB
GAMEOVER-43.BMP 26KB
GAMEOVER-21.BMP 26KB
GAMEOVER-57.BMP 26KB
GAMEOVER-38.BMP 26KB
GAMEOVER-02.BMP 26KB
GAMEOVER-52.BMP 26KB
GAMEOVER-26.BMP 26KB
GAMEOVER-00.BMP 26KB
GAMEOVER-53.BMP 26KB
GAMEOVER-05.BMP 26KB
GAMEOVER-04.BMP 26KB
GAMEOVER-13.BMP 26KB
GAMEOVER-45.BMP 26KB
GAMEOVER-50.BMP 26KB
BOULDERS.BMP 4KB
POND.BMP 4KB
BOMB-00.BMP 4KB
BOMBER-105.BMP 4KB
BOMBER-120.BMP 4KB
BOMBER-075.BMP 4KB
BOMBER-150.BMP 4KB
BOMB-01.BMP 4KB
BOMBER-090.BMP 4KB
BOMBER-300.BMP 4KB
BOMB-05.BMP 4KB
BOMB-06.BMP 4KB
BOMBER-000.BMP 4KB
BOMB-08.BMP 4KB
BOMB-07.BMP 4KB
BOMBER-030.BMP 4KB
BOMB-04.BMP 4KB
BOMBER-135.BMP 4KB
BOMBER-240.BMP 4KB
BOMBER-015.BMP 4KB
BOMB-03.BMP 4KB
BOMBER-270.BMP 4KB
BOMBER-195.BMP 4KB
BOMBER-225.BMP 4KB
BOMBER-210.BMP 4KB
BOMBER-045.BMP 4KB
BOMB-02.BMP 4KB
BOMB-09.BMP 4KB
BOMBER-255.BMP 4KB
共 510 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
- cyc198812172012-05-11可运行,界面较差,功能齐全,总体不错。
- a7520509432012-05-14这个在vs2010下编译会报错……估计是还没有写完整啊
JasonLiu_
- 粉丝: 11
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功