2016-01-27 00:50:42 chip
Page 1545
📢 PUBLIC
WinMain.c:
/*************************************************************************/
/** Game.cpp: Manages game objects. **/
/** (C)2016 nlited systems, Chip Doran **/
/*************************************************************************/
#include <Windows.h>
#include "Util.h"
#include "Globals.h"
#define ITEM_MAX 100 //Limit the number of INITIAL game objects.
class Game {
public:
static Game *Ptr(HGAME hGame);
static int Create(HGAME *phGame);
int Destroy(void);
int SetImage(HIMAGE hImg);
int SetArena(const RECT *pR);
int SetControl(UINT PlayerID, UINT Key, UINT OnOff);
int GetControl(UINT PlayerID, UINT *pCtrlState);
int Update(void);
int Event(UINT EventID);
//Data
UINT32 Signature;
private:
Game(void);
~Game(void);
int Create2(void);
int CreateItems(void);
int CreateItem(UINT ItemID);
void Sounds(void);
//Data
HITEMS hItems;
HIMAGE hImg;
RECT rArena;
UINT CtrlState;
HSOUND hSndFire;
HSOUND hSndThrust;
HSOUND hSndRockDestroyed;
};
/*************************************************************************/
/** Public interface **/
/*************************************************************************/
int GameCreate(HGAME *phGame) {
if(IsBadPtr(phGame,sizeof(*phGame),BADPTR_WRITE))
return(ERR_BADPTR);
return(Game::Create(phGame));
}
int GameDestroy(HGAME hGame) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
return(pGame->Destroy());
}
int GameSetImage(HGAME hGame, HIMAGE hImg) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
return(pGame->SetImage(hImg));
}
int GameSetArena(HGAME hGame, const RECT *pR) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
if(IsBadPtr(pR,sizeof(*pR),BADPTR_READ))
return(ERR_BADPTR);
return(pGame->SetArena(pR));
}
int GameSetControl(HGAME hGame, UINT PlayerID, UINT Key, UINT OnOff) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
return(pGame->SetControl(PlayerID,Key,OnOff));
}
int GameGetControl(HGAME hGame, UINT PlayerID, UINT *pCtrlState) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
if(pCtrlState && IsBadPtr(pCtrlState,sizeof(*pCtrlState),BADPTR_WRITE))
return(ERR_BADPTR);
return(pGame->GetControl(PlayerID,pCtrlState));
}
int GameUpdate(HGAME hGame) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
return(pGame->Update());
}
int GameEvent(HGAME hGame, UINT EventID) {
Game *pGame= Game::Ptr(hGame);
if(!pGame)
return(ERR_BADHANDLE);
return(pGame->Event(EventID));
}
/*************************************************************************/
/** Public internals **/
/*************************************************************************/
Game *Game::Ptr(HGAME hGame) {
Game *pGame= (Game*)hGame;
if(!hGame || IsBadPtr(pGame,sizeof(*pGame),BADPTR_RW) || pGame->Signature!=SIGNATURE_GAME)
pGame= 0;
return(pGame);
}
int Game::Create(HGAME *phGame) {
int Err= ERR_OK;
Game *pGame= new Game;
if(!pGame) {
Err= Error(ERR_NOMEM,__FUNCTION__": Unable to alloc %d.",sizeof(*pGame));
} else if(IsErr(Err= pGame->Create2())) {
delete pGame;
} else {
*phGame= (HGAME)pGame;
}
return(Err);
}
int Game::Destroy(void) {
int Err= ERR_OK;
SoundDestroy(hSndFire);
SoundDestroy(hSndThrust);
SoundDestroy(hSndRockDestroyed);
delete this;
return(Err);
}
int Game::SetImage(HIMAGE hImg) {
int Err= ERR_OK;
this->hImg= hImg;
return(Err);
}
int Game::SetArena(const RECT *pR) {
int Err= ERR_OK;
rArena= *pR;
ItemsSetArena(hItems,&rArena);
return(Err);
}
#define SETBIT(Var,Bit,OnOff) { if(OnOff) { Var|= Bit; } else { Var&= ~Bit; } }
int Game::SetControl(UINT PlayerID, UINT Key, UINT OnOff) {
int Err= ERR_OK;
switch(Key) {
case VK_LEFT: SETBIT(CtrlState,CTRL_LEFT,OnOff); break;
case VK_RIGHT: SETBIT(CtrlState,CTRL_RIGHT,OnOff); break;
case VK_DOWN: SETBIT(CtrlState,CTRL_THRUST,OnOff); break;
case VK_SPACE: SETBIT(CtrlState,CTRL_FIRE,OnOff); break;
}
return(Err);
}
int Game::GetControl(UINT PlayerID, UINT *pCtrlState) {
int Err= ERR_OK;
if(pCtrlState)
*pCtrlState= CtrlState;
else
Err= CtrlState;
return(Err);
}
int Game::Update(void) {
int Err= ERR_OK;
ItemsUpdate(hItems,GetTickCount());
Sounds();
ImgBegin(hImg);
ItemsDraw(hItems,hImg);
ImgPaint(hImg);
ImgEnd(hImg);
return(Err);
}
int Game::Event(UINT EventID) {
int Err= ERR_OK;
switch(EventID) {
case EVENT_ROCK_DESTROYED: SoundPlay(hSndRockDestroyed,0); break;
default: Err= ERR_BADARG2;
}
return(Err);
}
/*************************************************************************/
/** Private internals **/
/*************************************************************************/
Game::Game(void) {
memset(this,0,sizeof(*this));
Signature= SIGNATURE_GAME;
SetRect(&rArena,0,0,1000,800);
}
Game::~Game(void) {
Signature|= SIGNATURE_INVALID;
ImgDestroy(hImg);
}
int Game::Create2(void) {
int Err2,Err= ERR_OK;
if(IsErr(Err2= SoundCreate(&hSndFire,"Resource\\Fire.wav")))
Warn(Err2,"Game:Create2: Unable to create Fire sound.");
if(IsErr(Err2= SoundCreate(&hSndThrust,"Resource\\Thrust.wav")))
Warn(Err2,"Game:Create2: Unable to create thrust sound.");
if(IsErr(Err2= SoundCreate(&hSndRockDestroyed,"Resource\\RockDestroyed.wav")))
Warn(Err2,"Game:Create2: Unable to create RockDestroyed sound.");
if(IsErr(Err= ItemsCreate(&hItems,(HGAME)this))) {
Err= Error(Err,__FUNCTION__": Unable to create Items.");
} else if(IsErr(Err= CreateItems())) {
Err= Error(Err,__FUNCTION__": Unable to create starting items.");
}
return(Err);
}
int Game::CreateItems(void) {
int Err= ERR_OK;
UINT n1;
if(IsErr(Err= CreateItem(ITEM_ROCKET))) {
Err= Error(Err,__FUNCTION__": Unable to create rocket.");
} else {
for(n1=0;n1<ITEM_MAX;n1++) {
if(IsErr(Err= CreateItem(ITEM_ROCK))) {
Err= Warn(Err,__FUNCTION__": Unable to add Rock #%d",n1);
break;
}
}
}
return(Err);
}
int Game::CreateItem(UINT ItemID) {
int Err= ERR_OK;
HITEM hItem;
if(IsErr(Err= ItemCreate(&hItem,ItemID,0))) {
Err= Error(Err,__FUNCTION__": Unable to create ItemID %d",ItemID);
} else if(IsErr(Err= ItemsAdd(hItems,hItem))) {
Err= Error(Err,__FUNCTION__": Unable to add ItemID %d",ItemID);
}
return(Err);
}
void Game::Sounds(void) {
if(CtrlState & CTRL_FIRE)
SoundPlay(hSndFire,0);
if(CtrlState & CTRL_THRUST)
SoundPlay(hSndThrust,SNDPLAY_LOOP);
else
SoundStop(hSndThrust);
}
WebV7 (C)2018 nlited | Rendered by tikope in 34.636ms | 18.191.205.110