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