dev.nlited.com

>>

ItemList.cpp

<<<< prev
next >>>>

2016-01-27 00:51:34 chip Page 1546 📢 PUBLIC


WinMain.c: 1/*************************************************************************/ 2/** ItemList.cpp: Manages the list of game items. **/ 3/** (C)2013 nlited systems, Chip Doran **/ 4/*************************************************************************/ 5#include <Windows.h> 6#include <d2d1.h> 7#include <math.h> 8#include "Util.h" 9#include "MyD2D.h" 10#include "Sprite.h" 11#include "Globals.h" 12 13 14#define ITEM_MAX 1000 //Limit the number of game items at any one time. 15 16using namespace D2D1; //Direct2D version 1 17 18class ItemList { 19 typedef int (ItemList::*LISTFUNC)(HITEM hItem); 20public: 21 static ItemList *Ptr(HITEMS hItems); 22 static int Create(HITEMS *phItems, HGAME hGame); 23 int Destroy(void); 24 int SetArena(const RECT *prArena); 25 int GetArena(RECT *prArena); 26 int GetControl(UINT PlayerID, UINT *pCtrlState); 27 int Add(HITEM hItem); 28 int Remove(HITEM hItem); 29 int GetNext(HITEM hItem, HITEM *phNext); 30 int Update(UINT Tick); 31 int Draw(HIMAGE hImg); 32 //Data 33 UINT32 Signature; 34private: 35 ItemList(void); 36 ~ItemList(void); 37 int Create2(HGAME hGame); 38 int Iterate(const char *Tag, LISTFUNC pFunc); 39 int IterateUpdate(HITEM hItem); 40 int IterateCollision(HITEM hItem); 41 int IterateDraw(HITEM hItem); 42 //Data 43 HGAME hGame; 44 HIMAGE hImg; 45 UINT Tick; 46 RECT rArena; 47 struct ItemLink_s *pListHead; 48 struct ItemLink_s *pListTail; 49}; 50 51static struct ItemLink_s *ItemPtr(HITEM hItem) { 52 struct ItemLink_s *pItem= (struct ItemLink_s*)hItem; 53 if(!hItem || IsBadPtr(pItem,sizeof(*pItem),BADPTR_RW) || pItem->Signature!=SIGNATURE_ITEM) 54 pItem= 0; 55 return(pItem); 56} 57 58/*************************************************************************/ 59/** Public interface **/ 60/*************************************************************************/ 61int ItemsCreate(HITEMS *phItems, HGAME hGame) { 62 if(IsBadPtr(phItems,sizeof(*phItems),BADPTR_WRITE)) 63 return(ERR_BADPTR); 64 return(ItemList::Create(phItems,hGame)); 65} 66 67int ItemsDestroy(HITEMS hItems) { 68 ItemList *pItems= ItemList::Ptr(hItems); 69 if(!pItems) 70 return(ERR_BADHANDLE); 71 return(pItems->Destroy()); 72} 73 74int ItemsSetArena(HITEMS hItems, const RECT *prArena) { 75 ItemList *pItems= ItemList::Ptr(hItems); 76 if(!pItems) 77 return(ERR_BADHANDLE); 78 if(IsBadPtr(prArena,sizeof(*prArena),BADPTR_READ)) 79 return(ERR_BADPTR); 80 return(pItems->SetArena(prArena)); 81} 82 83int ItemsGetArena(HITEMS hItems, RECT *prArena) { 84 ItemList *pItems= ItemList::Ptr(hItems); 85 if(!pItems) 86 return(ERR_BADHANDLE); 87 if(IsBadPtr(prArena,sizeof(*prArena),BADPTR_WRITE)) 88 return(ERR_BADPTR); 89 return(pItems->GetArena(prArena)); 90} 91 92int ItemsGetControl(HITEMS hItems, UINT PlayerID, UINT *pCtrlState) { 93 ItemList *pItems= ItemList::Ptr(hItems); 94 if(!pItems) 95 return(ERR_BADHANDLE); 96 if(pCtrlState && IsBadPtr(pCtrlState,sizeof(*pCtrlState),BADPTR_WRITE)) 97 return(ERR_BADPTR); 98 return(pItems->GetControl(PlayerID,pCtrlState)); 99} 100 101int ItemsAdd(HITEMS hItems, HITEM hItem) { 102 ItemList *pItems= ItemList::Ptr(hItems); 103 if(!pItems) 104 return(ERR_BADHANDLE); 105 return(pItems->Add(hItem)); 106} 107 108int ItemsRemove(HITEMS hItems, HITEM hItem) { 109 ItemList *pItems= ItemList::Ptr(hItems); 110 if(!pItems) 111 return(ERR_BADHANDLE); 112 return(pItems->Remove(hItem)); 113} 114 115int ItemsGetNext(HITEMS hItems, HITEM hItem, HITEM *phNext) { 116 ItemList *pItems= ItemList::Ptr(hItems); 117 if(!pItems) 118 return(ERR_BADHANDLE); 119 if(IsBadPtr(phNext,sizeof(*phNext),BADPTR_WRITE)) 120 return(ERR_BADPTR); 121 return(pItems->GetNext(hItem,phNext)); 122} 123 124int ItemsUpdate(HITEMS hItems, UINT Tick) { 125 ItemList *pItems= ItemList::Ptr(hItems); 126 if(!pItems) 127 return(ERR_BADHANDLE); 128 return(pItems->Update(Tick)); 129} 130 131int ItemsDraw(HITEMS hItems, HIMAGE hImg) { 132 ItemList *pItems= ItemList::Ptr(hItems); 133 if(!pItems) 134 return(ERR_BADHANDLE); 135 return(pItems->Draw(hImg)); 136} 137 138/*************************************************************************/ 139/** Public internals **/ 140/*************************************************************************/ 141ItemList *ItemList::Ptr(HITEMS hItems) { 142 ItemList *pItems= (ItemList*)hItems; 143 if(!hItems || IsBadPtr(pItems,sizeof(*pItems),BADPTR_RW) || pItems->Signature!=SIGNATURE_ITEMS) 144 pItems= 0; 145 return(pItems); 146} 147 148int ItemList::Create(HITEMS *phItems, HGAME hGame) { 149 int Err= ERR_OK; 150 ItemList *pItems= new ItemList; 151 if(!pItems) { 152 Err= Error(ERR_NOMEM,__FUNCTION__": Unable to alloc %d.",sizeof(*pItems)); 153 } else if(IsErr(Err= pItems->Create2(hGame))) { 154 delete pItems; 155 } else { 156 *phItems= (HITEMS)pItems; 157 } 158 return(Err); 159} 160 161int ItemList::Destroy(void) { 162 int Err= ERR_OK; 163 delete this; 164 return(Err); 165} 166 167int ItemList::SetArena(const RECT *prArena) { 168 rArena= *prArena; 169 return(ERR_OK); 170} 171 172int ItemList::GetArena(RECT *prArena) { 173 *prArena= rArena; 174 return(ERR_OK); 175} 176 177int ItemList::GetControl(UINT PlayerID, UINT *pCtrlState) { 178 return(GameGetControl(hGame,PlayerID,pCtrlState)); 179} 180 181int ItemList::Add(HITEM hItem) { 182 int Err= ERR_OK; 183 struct ItemLink_s *pLink= ItemGetLink(hItem); 184 if(!pLink) { 185 Err= Error(ERR_BADHANDLE,__FUNCTION__": Bad hItem[%X]",hItem); 186 } else { 187 if(!pListHead) { 188 pListHead= pListTail= pLink; 189 } else { 190 pLink->pPrev= pListTail; 191 pListTail->pNext= pLink; 192 pListTail= pLink; 193 } 194 } 195 return(Err); 196} 197 198int ItemList::Remove(HITEM hItem) { 199 int Err= ERR_OK; 200 struct ItemLink_s *pLink= ItemGetLink(hItem); 201 if(!pLink) { 202 Err= Error(ERR_BADHANDLE,__FUNCTION__": Bad hItem[%X]",hItem); 203 } else { 204 if(pLink==pListHead) 205 pListHead= pLink->pNext; 206 else 207 pLink->pPrev->pNext= pLink->pNext; 208 if(pLink==pListTail) 209 pListTail= pLink->pPrev; 210 else 211 pLink->pNext->pPrev= pLink->pPrev; 212 } 213 return(Err); 214} 215 216int ItemList::GetNext(HITEM hItem, HITEM *phNext) { 217 int Err= ERR_OK; 218 struct ItemLink_s *pLink= ItemGetLink(hItem); 219 if(!hItem) { 220 *phNext= pListHead ? pListHead->hItem:0; 221 } else if(!pLink) { 222 Err= Warn(ERR_BADHANDLE,__FUNCTION__": Bad hItem[%X]",hItem); 223 } else { 224 *phNext= pLink->pNext ? pLink->pNext->hItem:0; 225 } 226 return(Err); 227} 228 229int ItemList::Update(UINT Tick) { 230 int Err= ERR_OK; 231 this->Tick= Tick; 232 if(IsErr(Err= Iterate("Move",&ItemList::IterateUpdate))) 233 Err= Warn(Err,__FUNCTION__": ItemUpdate() failed."); 234 if(IsErr(Err= Iterate("Collision",&ItemList::IterateCollision))) 235 Err= Warn(Err,__FUNCTION__": ItemCollision() failed."); 236 return(Err); 237} 238 239int ItemList::Draw(HIMAGE hImg) { 240 int Err= ERR_OK; 241 LISTFUNC pDraw= &ItemList::IterateDraw; 242 this->hImg= hImg; 243 Err= Iterate("Draw",pDraw); 244 return(Err); 245} 246 247/*************************************************************************/ 248/** Private internals **/ 249/*************************************************************************/ 250ItemList::ItemList(void) { 251 memset(this,0,sizeof(*this)); 252 Signature= SIGNATURE_ITEMS; 253} 254 255ItemList::~ItemList(void) { 256 struct ItemLink_s *pItem,*pNext; 257 Signature|= SIGNATURE_INVALID; 258 for(pItem=pListHead;pItem;pItem=pNext) { 259 pNext= pItem->pNext; 260 MemFree(pItem); 261 } 262} 263 264int ItemList::Create2(HGAME hGame) { 265 int Err= ERR_OK; 266 this->hGame= hGame; 267 return(Err); 268} 269 270int ItemList::Iterate(const char *Tag, LISTFUNC pFunc) { 271 int Err2,Err= ERR_OK; 272 struct ItemLink_s *pItem,*pNext; 273 for(pItem=pListHead;pItem;pItem=pNext) { 274 pNext= pItem->pNext; 275 Err2= (this->*pFunc)(pItem->hItem); //Overly-clever C++ syntax 276 if(IsErr(Err2)) { 277 Err= Warn(Err2,__FUNCTION__": %s failed on item %X",Tag,pItem); 278 } 279 } 280 return(Err); 281} 282 283/*************************************************************************/ 284/** Individual items **/ 285/*************************************************************************/ 286int ItemList::IterateUpdate(HITEM hItem) { 287 int Err= ERR_OK; 288 if(IsErr(Err= ItemUpdate(hItem,(HITEMS)this,Tick))) 289 Warn(Err,__FUNCTION__": Update on item [%X] failed.",hItem); 290 return(Err); 291} 292 293int ItemList::IterateCollision(HITEM hItem) { 294 int Err= ERR_OK; 295 if(IsErr(Err= ItemCollision(hItem,(HITEMS)this))) 296 Warn(Err,__FUNCTION__": Collision on item [%X] failed.",hItem); 297 return(Err); 298} 299 300int ItemList::IterateDraw(HITEM hItem) { 301 int Err= ERR_OK; 302 if(IsErr(Err= ItemDraw(hItem,hImg))) 303 Warn(Err,__FUNCTION__": Draw on item [%X] failed.",hItem); 304 return(Err); 305} 306


WebV7 (C)2018 nlited | Rendered by tikope in 57.440ms | 216.73.216.25