dev.nlited.com

>>

Game.cpp

<<<< prev
next >>>>

2016-01-27 00:50:42 chip Page 1545 📢 PUBLIC


WinMain.c: 1/*************************************************************************/ 2/** Game.cpp: Manages game objects. **/ 3/** (C)2016 nlited systems, Chip Doran **/ 4/*************************************************************************/ 5#include <Windows.h> 6#include "Util.h" 7#include "Globals.h" 8 9 10#define ITEM_MAX 100 //Limit the number of INITIAL game objects. 11 12class Game { 13public: 14 static Game *Ptr(HGAME hGame); 15 static int Create(HGAME *phGame); 16 int Destroy(void); 17 int SetImage(HIMAGE hImg); 18 int SetArena(const RECT *pR); 19 int SetControl(UINT PlayerID, UINT Key, UINT OnOff); 20 int GetControl(UINT PlayerID, UINT *pCtrlState); 21 int Update(void); 22 int Event(UINT EventID); 23 //Data 24 UINT32 Signature; 25private: 26 Game(void); 27 ~Game(void); 28 int Create2(void); 29 int CreateItems(void); 30 int CreateItem(UINT ItemID); 31 void Sounds(void); 32 //Data 33 HITEMS hItems; 34 HIMAGE hImg; 35 RECT rArena; 36 UINT CtrlState; 37 HSOUND hSndFire; 38 HSOUND hSndThrust; 39 HSOUND hSndRockDestroyed; 40}; 41 42/*************************************************************************/ 43/** Public interface **/ 44/*************************************************************************/ 45int GameCreate(HGAME *phGame) { 46 if(IsBadPtr(phGame,sizeof(*phGame),BADPTR_WRITE)) 47 return(ERR_BADPTR); 48 return(Game::Create(phGame)); 49} 50 51int GameDestroy(HGAME hGame) { 52 Game *pGame= Game::Ptr(hGame); 53 if(!pGame) 54 return(ERR_BADHANDLE); 55 return(pGame->Destroy()); 56} 57 58int GameSetImage(HGAME hGame, HIMAGE hImg) { 59 Game *pGame= Game::Ptr(hGame); 60 if(!pGame) 61 return(ERR_BADHANDLE); 62 return(pGame->SetImage(hImg)); 63} 64 65int GameSetArena(HGAME hGame, const RECT *pR) { 66 Game *pGame= Game::Ptr(hGame); 67 if(!pGame) 68 return(ERR_BADHANDLE); 69 if(IsBadPtr(pR,sizeof(*pR),BADPTR_READ)) 70 return(ERR_BADPTR); 71 return(pGame->SetArena(pR)); 72} 73 74int GameSetControl(HGAME hGame, UINT PlayerID, UINT Key, UINT OnOff) { 75 Game *pGame= Game::Ptr(hGame); 76 if(!pGame) 77 return(ERR_BADHANDLE); 78 return(pGame->SetControl(PlayerID,Key,OnOff)); 79} 80 81int GameGetControl(HGAME hGame, UINT PlayerID, UINT *pCtrlState) { 82 Game *pGame= Game::Ptr(hGame); 83 if(!pGame) 84 return(ERR_BADHANDLE); 85 if(pCtrlState && IsBadPtr(pCtrlState,sizeof(*pCtrlState),BADPTR_WRITE)) 86 return(ERR_BADPTR); 87 return(pGame->GetControl(PlayerID,pCtrlState)); 88} 89 90int GameUpdate(HGAME hGame) { 91 Game *pGame= Game::Ptr(hGame); 92 if(!pGame) 93 return(ERR_BADHANDLE); 94 return(pGame->Update()); 95} 96 97int GameEvent(HGAME hGame, UINT EventID) { 98 Game *pGame= Game::Ptr(hGame); 99 if(!pGame) 100 return(ERR_BADHANDLE); 101 return(pGame->Event(EventID)); 102} 103 104/*************************************************************************/ 105/** Public internals **/ 106/*************************************************************************/ 107Game *Game::Ptr(HGAME hGame) { 108 Game *pGame= (Game*)hGame; 109 if(!hGame || IsBadPtr(pGame,sizeof(*pGame),BADPTR_RW) || pGame->Signature!=SIGNATURE_GAME) 110 pGame= 0; 111 return(pGame); 112} 113 114int Game::Create(HGAME *phGame) { 115 int Err= ERR_OK; 116 Game *pGame= new Game; 117 if(!pGame) { 118 Err= Error(ERR_NOMEM,__FUNCTION__": Unable to alloc %d.",sizeof(*pGame)); 119 } else if(IsErr(Err= pGame->Create2())) { 120 delete pGame; 121 } else { 122 *phGame= (HGAME)pGame; 123 } 124 return(Err); 125} 126 127int Game::Destroy(void) { 128 int Err= ERR_OK; 129 SoundDestroy(hSndFire); 130 SoundDestroy(hSndThrust); 131 SoundDestroy(hSndRockDestroyed); 132 delete this; 133 return(Err); 134} 135 136int Game::SetImage(HIMAGE hImg) { 137 int Err= ERR_OK; 138 this->hImg= hImg; 139 return(Err); 140} 141 142int Game::SetArena(const RECT *pR) { 143 int Err= ERR_OK; 144 rArena= *pR; 145 ItemsSetArena(hItems,&rArena); 146 return(Err); 147} 148 149#define SETBIT(Var,Bit,OnOff) { if(OnOff) { Var|= Bit; } else { Var&= ~Bit; } } 150 151int Game::SetControl(UINT PlayerID, UINT Key, UINT OnOff) { 152 int Err= ERR_OK; 153 switch(Key) { 154 case VK_LEFT: SETBIT(CtrlState,CTRL_LEFT,OnOff); break; 155 case VK_RIGHT: SETBIT(CtrlState,CTRL_RIGHT,OnOff); break; 156 case VK_DOWN: SETBIT(CtrlState,CTRL_THRUST,OnOff); break; 157 case VK_SPACE: SETBIT(CtrlState,CTRL_FIRE,OnOff); break; 158 } 159 return(Err); 160} 161 162int Game::GetControl(UINT PlayerID, UINT *pCtrlState) { 163 int Err= ERR_OK; 164 if(pCtrlState) 165 *pCtrlState= CtrlState; 166 else 167 Err= CtrlState; 168 return(Err); 169} 170 171int Game::Update(void) { 172 int Err= ERR_OK; 173 ItemsUpdate(hItems,GetTickCount()); 174 Sounds(); 175 ImgBegin(hImg); 176 ItemsDraw(hItems,hImg); 177 ImgPaint(hImg); 178 ImgEnd(hImg); 179 return(Err); 180} 181 182int Game::Event(UINT EventID) { 183 int Err= ERR_OK; 184 switch(EventID) { 185 case EVENT_ROCK_DESTROYED: SoundPlay(hSndRockDestroyed,0); break; 186 default: Err= ERR_BADARG2; 187 } 188 return(Err); 189} 190 191/*************************************************************************/ 192/** Private internals **/ 193/*************************************************************************/ 194Game::Game(void) { 195 memset(this,0,sizeof(*this)); 196 Signature= SIGNATURE_GAME; 197 SetRect(&rArena,0,0,1000,800); 198} 199 200Game::~Game(void) { 201 Signature|= SIGNATURE_INVALID; 202 ImgDestroy(hImg); 203} 204 205int Game::Create2(void) { 206 int Err2,Err= ERR_OK; 207 if(IsErr(Err2= SoundCreate(&hSndFire,"Resource\\Fire.wav"))) 208 Warn(Err2,"Game:Create2: Unable to create Fire sound."); 209 if(IsErr(Err2= SoundCreate(&hSndThrust,"Resource\\Thrust.wav"))) 210 Warn(Err2,"Game:Create2: Unable to create thrust sound."); 211 if(IsErr(Err2= SoundCreate(&hSndRockDestroyed,"Resource\\RockDestroyed.wav"))) 212 Warn(Err2,"Game:Create2: Unable to create RockDestroyed sound."); 213 if(IsErr(Err= ItemsCreate(&hItems,(HGAME)this))) { 214 Err= Error(Err,__FUNCTION__": Unable to create Items."); 215 } else if(IsErr(Err= CreateItems())) { 216 Err= Error(Err,__FUNCTION__": Unable to create starting items."); 217 } 218 return(Err); 219} 220 221int Game::CreateItems(void) { 222 int Err= ERR_OK; 223 UINT n1; 224 if(IsErr(Err= CreateItem(ITEM_ROCKET))) { 225 Err= Error(Err,__FUNCTION__": Unable to create rocket."); 226 } else { 227 for(n1=0;n1<ITEM_MAX;n1++) { 228 if(IsErr(Err= CreateItem(ITEM_ROCK))) { 229 Err= Warn(Err,__FUNCTION__": Unable to add Rock #%d",n1); 230 break; 231 } 232 } 233 } 234 return(Err); 235} 236 237int Game::CreateItem(UINT ItemID) { 238 int Err= ERR_OK; 239 HITEM hItem; 240 if(IsErr(Err= ItemCreate(&hItem,ItemID,0))) { 241 Err= Error(Err,__FUNCTION__": Unable to create ItemID %d",ItemID); 242 } else if(IsErr(Err= ItemsAdd(hItems,hItem))) { 243 Err= Error(Err,__FUNCTION__": Unable to add ItemID %d",ItemID); 244 } 245 return(Err); 246} 247 248void Game::Sounds(void) { 249 if(CtrlState & CTRL_FIRE) 250 SoundPlay(hSndFire,0); 251 if(CtrlState & CTRL_THRUST) 252 SoundPlay(hSndThrust,SNDPLAY_LOOP); 253 else 254 SoundStop(hSndThrust); 255} 256


WebV7 (C)2018 nlited | Rendered by tikope in 2476.480ms | 216.73.216.254