|
弾などの高速な管理方法(リスト構造) |
| ダウンロード : 弾管理プログラムサンプル(2005/03/20) |
|
// 弾管理構造体 struct TBullet { TBullet* pNext; // 双方向リストポインタ TBullet* pBack; CPoint pos; // 座標 EStatus status; // 状態 }; |
|
const DWORD c_dwMaxBullet = 10000; // 弾の最大数 TBullet g_bullet[c_dwMaxBullet]; // 弾の配列 TBullet* g_pBulletEmpty = NULL; // 未使用リストポインタ TBullet* g_pBulletUse = NULL; // 使用中リストポインタ |
|
// 初期化する void InitBullet() { // リストをつなぐ for (DWORD dwID = 0; dwID < c_dwMaxBullet; dwID++){ g_bullet[dwID].pNext = &g_bullet[dwID + 1]; g_bullet[dwID].pBack = &g_bullet[dwID - 1]; } // リストの終端設定 g_bullet[dwID - 1].pNext = g_bullet[0].pBack = NULL; g_pBulletEmpty = g_bullet; // 空きリストは配列の先頭から g_pBulletUse = NULL; // 最初は何も使っていない } |
|
// 弾発射登録用ポインタを取得する TBullet* GetEmptyBullet() { if (!g_pBulletEmpty) return NULL; // 空きがなければ終了する TBullet* pUse = g_pBulletEmpty; // 空きポインタを取得する g_pBulletEmpty = pUse->pNext; // 空きポインタは次の場所を先頭とする pUse->pNext = g_pBulletUse; // 次に現在の使用中ポインタを入れる pUse->pBack = NULL; // 新しい先頭ポインタとする g_pBulletUse = pUse; // 新しい使用中ポインタに更新する return pUse; // 使用するポインタを返却する } |
|
// 弾を未使用にする void ClearBullet(TBullet* pBullet) { // 自分を使用中リストから外す if (pBullet->pBack) // 後方ポインタがあるなら pBullet->pBack = pBullet->pNext; // 繋ぎ替える else // 無い(つまり先頭なら) g_pBulletUse = pBullet->pNext; // 先頭を次のポインタに変更する // 未使用ポインタリストに戻す pBullet->pNext = g_pBulletEmpty; // 自分の次を空きポインタの先頭とする pBullet->pBack = NULL; // 自分が先頭になるため前はない if (g_pBulletEmpty) // 今までの空きポインタがあるのなら g_pBulletEmpty->pBack = pBullet; // そのポインタの前を自分とする g_pBulletEmpty = pBullet; // 自分が新しい空きポインタの先頭とする } |
|
// 弾の処理 void MoveBullet() { TBullet* pNext; for (TBullet* pBullet = g_pBulletUse; pBullet; pBullet = pNext){ pNext = pBullet->pNext; // 先に次のポインタを取得しておく // 弾の処理を行う // 弾の消去タイミングなら ClearBullet(pBullet); とする } } |