X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 297 (tree) |
---|---|
Zeit | 2022-03-27 12:34:52 |
Autor | ![]() |
人とマップの当たり判定関連の仕様変更、足音処理の仕様変更、3Dリセット時のリソース管理改善、ほか戻り値やコメント修正
@@ -271,7 +271,8 @@ | ||
271 | 271 | //ポイントデータ初期化 |
272 | 272 | ObjMgr.Recovery(); |
273 | 273 | |
274 | - //背景空読み込み | |
274 | + //背景空初期化 | |
275 | + Resource.CleanupSkyModelTexture(); | |
275 | 276 | Resource.LoadSkyModelTexture(1); |
276 | 277 | |
277 | 278 | //opening_banner = d3dg->LoadTexture("banner.png", true, false); |
@@ -1943,7 +1944,8 @@ | ||
1943 | 1944 | //ポイントデータ初期化 |
1944 | 1945 | ObjMgr.Recovery(); |
1945 | 1946 | |
1946 | - //背景空読み込み | |
1947 | + //背景空初期化 | |
1948 | + Resource.CleanupSkyModelTexture(); | |
1947 | 1949 | Resource.LoadSkyModelTexture(SkyNumber); |
1948 | 1950 | |
1949 | 1951 | return 0; |
@@ -1430,7 +1430,10 @@ | ||
1430 | 1430 | //! @param inblockdata BlockDataInterfaceクラスのポインタ |
1431 | 1431 | //! @param AddCollisionFlag 追加の当たり判定フラグ |
1432 | 1432 | //! @param player 対象の人物がプレイヤーかどうか |
1433 | -void human::CollisionMap(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player) | |
1433 | +//! @param underblock_id 足元のブロックIDを受け取るポインタ(NULL可) | |
1434 | +//! @param underblock_face 足元のブロックの面番号を受け取るポインタ(NULL可) | |
1435 | +//! @attention 空中の場合など足元にブロックがない場合、ブロックIDと面番号は -1 を返します。 | |
1436 | +void human::CollisionMap(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, int *underblock_id, int *underblock_face) | |
1434 | 1437 | { |
1435 | 1438 | float pos_x2, pos_y2, pos_z2; |
1436 | 1439 | float dist_x, dist_y, dist_z; |
@@ -1438,6 +1441,10 @@ | ||
1438 | 1441 | float Dist; |
1439 | 1442 | bool FallFlag; |
1440 | 1443 | |
1444 | + //ブロックIDと面番号は、ひとまず -1 を用意をする。 | |
1445 | + if( underblock_id != NULL ){ *underblock_id = -1; } | |
1446 | + if( underblock_face != NULL ){ *underblock_face = -1; } | |
1447 | + | |
1441 | 1448 | //現時点の座標をバックアップ |
1442 | 1449 | pos_x2 = pos_x; |
1443 | 1450 | pos_y2 = pos_y; |
@@ -1624,11 +1631,15 @@ | ||
1624 | 1631 | if( (GetFlag(MoveFlag_lt, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT | MOVEFLAG_WALK)) == 0x00)&&(move_y_upper == 0) ){ flag = false; } |
1625 | 1632 | } |
1626 | 1633 | |
1627 | - if( flag == true ){ | |
1628 | - //足元の面の角度を取得 | |
1629 | - if( CollD->CheckALLBlockIntersectDummyRay(pos_x, pos_y + 2.5f, pos_z, 0.0f, -1.0f, 0.0f, NULL, NULL, &Dist, (2.5f + 1.0f)) == true ){ | |
1630 | - CollD->CheckALLBlockIntersectRay(pos_x, pos_y + 2.5f, pos_z, 0.0f, -1.0f, 0.0f, &id, &face, &Dist, (2.5f + 1.0f)); | |
1634 | + //足元のブロックと面番号を取得 | |
1635 | + if( CollD->CheckALLBlockIntersectDummyRay(pos_x, pos_y + 2.5f, pos_z, 0.0f, -1.0f, 0.0f, NULL, NULL, &Dist, (2.5f + 1.0f)) == true ){ | |
1636 | + CollD->CheckALLBlockIntersectRay(pos_x, pos_y + 2.5f, pos_z, 0.0f, -1.0f, 0.0f, &id, &face, &Dist, (2.5f + 1.0f)); | |
1631 | 1637 | |
1638 | + //ブロックIDと面番号を返す | |
1639 | + if( underblock_id != NULL ){ *underblock_id = id; } | |
1640 | + if( underblock_face != NULL ){ *underblock_face = face; } | |
1641 | + | |
1642 | + if( flag == true ){ | |
1632 | 1643 | inblockdata->Getdata(&bdata, id); |
1633 | 1644 | |
1634 | 1645 | //斜面に立っているならば、斜面を滑らせる処理 |
@@ -1764,8 +1775,11 @@ | ||
1764 | 1775 | //! @param AddCollisionFlag 追加の当たり判定フラグ |
1765 | 1776 | //! @param player 対象の人物がプレイヤーかどうか |
1766 | 1777 | //! @param F5mode 上昇機能(F5裏技)のフラグ (有効:true 無効:false) |
1778 | +//! @param underblock_id 足元のブロックIDを受け取るポインタ(NULL可) | |
1779 | +//! @param underblock_face 足元のブロックの面番号を受け取るポインタ(NULL可) | |
1780 | +//! @attention 空中の場合など足元にブロックがない場合、ブロックIDと面番号は -1 を返します。 | |
1767 | 1781 | //! @return 処理なし:0 通常処理:1 死亡して倒れ終わった直後:2 静止した死体:3 地形により死亡した直後:4 |
1768 | -int human::RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode) | |
1782 | +int human::RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode, int *underblock_id, int *underblock_face) | |
1769 | 1783 | { |
1770 | 1784 | if( CollD == NULL ){ return 0; } |
1771 | 1785 | if( EnableFlag == false ){ return 0; } |
@@ -1828,10 +1842,10 @@ | ||
1828 | 1842 | ControlProcess(); |
1829 | 1843 | |
1830 | 1844 | //マップとの当たり判定 |
1831 | - CollisionMap(CollD, inblockdata, AddCollisionFlag, player); | |
1845 | + CollisionMap(CollD, inblockdata, AddCollisionFlag, player, underblock_id, underblock_face); | |
1832 | 1846 | |
1833 | 1847 | //今回のマップとの当たり判定でHPがゼロになったなら、地形による死亡 |
1834 | - if( (hp_old >0)&&(hp <= 0) ){ | |
1848 | + if( (hp_old > 0)&&(hp <= 0) ){ | |
1835 | 1849 | return 4; |
1836 | 1850 | } |
1837 | 1851 |
@@ -1878,7 +1892,6 @@ | ||
1878 | 1892 | //! @param player 対象の人物がプレイヤーかどうか |
1879 | 1893 | //! @param NoModel モデル描画無効化 |
1880 | 1894 | //! @todo 腕の位置を行列で求める |
1881 | -//! @todo 死体の部位の高さ(Y軸)がおかしい | |
1882 | 1895 | void human::Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArmOnly, bool player, bool NoModel) |
1883 | 1896 | { |
1884 | 1897 | //未使用引数対策 |
@@ -175,7 +175,7 @@ | ||
175 | 175 | void GunsightErrorRange(); |
176 | 176 | int CheckAndProcessDead(class Collision *CollD); |
177 | 177 | void ControlProcess(); |
178 | - void CollisionMap(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player); | |
178 | + void CollisionMap(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, int *underblock_id, int *underblock_face); | |
179 | 179 | bool CollisionBlockScratch(class Collision *CollD, class BlockDataInterface *inblockdata, float *px, float *py, float *pz, float px_old, float py_old, float pz_old, float in_vx, float in_vy, float in_vz, int mode); |
180 | 180 | |
181 | 181 | public: |
@@ -227,7 +227,7 @@ | ||
227 | 227 | virtual void SetHitFlag(float rx); |
228 | 228 | virtual bool CheckHit(float *rx); |
229 | 229 | virtual float GetTotalMove(); |
230 | - virtual int RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode); | |
230 | + virtual int RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode, int *underblock_id, int *underblock_face); | |
231 | 231 | virtual int GetGunsightErrorRange(); |
232 | 232 | virtual void Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArmOnly, bool player, bool NoModel); |
233 | 233 | }; |
@@ -2641,6 +2641,7 @@ | ||
2641 | 2641 | for(int i=0; i<MAX_HUMAN; i++){ |
2642 | 2642 | bool cmdF5, player; |
2643 | 2643 | int rtn; |
2644 | + int block_id, block_face, block_textureid; | |
2644 | 2645 | int MoveMode; |
2645 | 2646 | |
2646 | 2647 | //プレイヤーかどうか判定 |
@@ -2658,7 +2659,7 @@ | ||
2658 | 2659 | cmdF5 = false; |
2659 | 2660 | } |
2660 | 2661 | |
2661 | - rtn = HumanIndex[i].RunFrame(CollD, BlockData, AddCollisionFlag, player, cmdF5); | |
2662 | + rtn = HumanIndex[i].RunFrame(CollD, BlockData, AddCollisionFlag, player, cmdF5, &block_id, &block_face); | |
2662 | 2663 | if( rtn == 2 ){ |
2663 | 2664 | //死亡時のエフェクト |
2664 | 2665 | DeadEffect(&(HumanIndex[i])); |
@@ -2676,13 +2677,13 @@ | ||
2676 | 2677 | |
2677 | 2678 | //足音 |
2678 | 2679 | MoveMode = HumanIndex[i].GetMovemode(false); |
2679 | - if( (2 <= MoveMode)&&(MoveMode <= 4) ){ | |
2680 | - //走る足音追加 | |
2680 | + if( (1 <= MoveMode)&&(MoveMode <= 4) ){ | |
2681 | + //足音追加 | |
2681 | 2682 | float posx, posy, posz; |
2682 | 2683 | int teamid; |
2683 | 2684 | HumanIndex[i].GetPosData(&posx, &posy, &posz, NULL); |
2684 | 2685 | HumanIndex[i].GetParamData(NULL, NULL, NULL, &teamid); |
2685 | - GameSound->SetFootsteps(posx, posy, posz, MoveMode - 2, teamid); | |
2686 | + GameSound->SetFootsteps(posx, posy, posz, MoveMode - 1, teamid); | |
2686 | 2687 | } |
2687 | 2688 | } |
2688 | 2689 |
@@ -605,7 +605,7 @@ | ||
605 | 605 | { |
606 | 606 | if( d3dg == NULL ){ return 1; } |
607 | 607 | if( SoundCtrl == NULL ){ return 1; } |
608 | - if( (id < 0)||(MAX_ADDSMALLOBJECT-1 < id) ){ return -1; } | |
608 | + if( (id < 0)||(MAX_ADDSMALLOBJECT-1 < id) ){ return 1; } | |
609 | 609 | |
610 | 610 | int dataid = TOTAL_PARAMETERINFO_SMALLOBJECT + id; |
611 | 611 | int cnt = 0; |
@@ -32,9 +32,9 @@ | ||
32 | 32 | #ifndef RESOURCE_H |
33 | 33 | #define RESOURCE_H |
34 | 34 | |
35 | -#define TOTAL_UPMODE 6 //!< 上半身の合計モデル | |
36 | -#define TOTAL_ARMMODE 3 //!< 腕の合計モデル | |
37 | -#define TOTAL_WALKMODE 8 //!< 足(歩き)の合計モデル | |
35 | +#define TOTAL_UPMODE 6 //!< 上半身の合計モデル | |
36 | +#define TOTAL_ARMMODE 3 //!< 腕の合計モデル | |
37 | +#define TOTAL_WALKMODE 8 //!< 足(歩き)の合計モデル | |
38 | 38 | #define TOTAL_RUNMODE 12 //!< 足(走り)の合計モデル |
39 | 39 | |
40 | 40 | #define MAX_LOADHUMANTEXTURE 10 //!< 人のテクスチャを読み込む最大枚数 |
@@ -238,7 +238,7 @@ | ||
238 | 238 | //! @param x 音源のX座標 |
239 | 239 | //! @param y 音源のY座標 |
240 | 240 | //! @param z 音源のZ座標 |
241 | -//! @param MoveMode 移動モード(前進:0 後退:1 左右:2) | |
241 | +//! @param MoveMode 移動モード(歩き:0 前進:1 後退:2 左右:3) | |
242 | 242 | //! @param teamID チーム番号 |
243 | 243 | //! @return 成功:true 失敗:false |
244 | 244 | bool SoundManager::SetFootsteps(float x, float y, float z, int MoveMode, int teamID) |
@@ -246,11 +246,12 @@ | ||
246 | 246 | soundlist *plist = NULL; |
247 | 247 | if( GetNewList(&plist) == false ){ return false; } |
248 | 248 | |
249 | - if( (MoveMode < 0)||(2 < MoveMode) ){ return false; } | |
249 | + if( (MoveMode < 0)||(3 < MoveMode) ){ return false; } | |
250 | 250 | |
251 | - if( MoveMode == 0 ){ plist->paramid = FOOTSTEPS_FORWARD; } | |
252 | - if( MoveMode == 1 ){ plist->paramid = FOOTSTEPS_BACK; } | |
253 | - if( MoveMode == 2 ){ plist->paramid = FOOTSTEPS_SIDE; } | |
251 | + if( MoveMode == 0 ){ plist->paramid = FOOTSTEPS_WALK; } | |
252 | + if( MoveMode == 1 ){ plist->paramid = FOOTSTEPS_FORWARD; } | |
253 | + if( MoveMode == 2 ){ plist->paramid = FOOTSTEPS_BACK; } | |
254 | + if( MoveMode == 3 ){ plist->paramid = FOOTSTEPS_SIDE; } | |
254 | 255 | plist->x = x; |
255 | 256 | plist->y = y; |
256 | 257 | plist->z = z; |
@@ -335,6 +336,9 @@ | ||
335 | 336 | if( getlist[i].paramid == HIT_HUMAN_ZOMBIE ){ |
336 | 337 | maxdist = 40.0f; |
337 | 338 | } |
339 | + if( getlist[i].paramid == FOOTSTEPS_WALK ){ | |
340 | + continue; | |
341 | + } | |
338 | 342 | if( getlist[i].paramid == FOOTSTEPS_FORWARD ){ |
339 | 343 | if( getlist[i].teamid == teamID ){ continue; } |
340 | 344 | else{ maxdist = 40.0f; } |
@@ -626,7 +630,8 @@ | ||
626 | 630 | volume = MAX_SOUNDHITGRENADE; |
627 | 631 | break; |
628 | 632 | |
629 | - case FOOTSTEPS_FORWARD: //足音・走る音 | |
633 | + case FOOTSTEPS_WALK: //足音 | |
634 | + case FOOTSTEPS_FORWARD: | |
630 | 635 | case FOOTSTEPS_BACK: |
631 | 636 | case FOOTSTEPS_SIDE: |
632 | 637 | //足音を再生する処理を書く |
@@ -59,6 +59,7 @@ | ||
59 | 59 | BULLET, //!< 銃弾の音・横切る音 |
60 | 60 | GRE_BOUND, //!< 手榴弾 バウンド音 |
61 | 61 | GRE_EXPLOSION, //!< 手榴弾 爆発音 |
62 | + FOOTSTEPS_WALK, //!< 足音・歩き | |
62 | 63 | FOOTSTEPS_FORWARD, //!< 足音・走る音(前進) |
63 | 64 | FOOTSTEPS_BACK, //!< 足音・走る音(後退) |
64 | 65 | FOOTSTEPS_SIDE, //!< 足音・走る音(左右) |