• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#objective-cqt誰得windowscocoapythonphprubygameguibathyscaphec翻訳omegat計画中(planning stage)frameworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision300 (tree)
Zeit2022-04-02 16:13:55
Autorxops-mikan

Log Message

足音再生への拡張性を強化

Ändern Zusammenfassung

Diff

--- trunk/object.cpp (revision 299)
+++ trunk/object.cpp (revision 300)
@@ -170,6 +170,7 @@
170170 move_z = 0.0f;
171171 move_y_flag = false;
172172 move_y_upper = 0;
173+ move_y_landing = false;
173174 rotation_x = rx;
174175 id_parameter = id_param;
175176 upmodel_size = 9.4f;
@@ -253,6 +254,7 @@
253254 move_z = 0.0f;
254255 move_y_flag = false;
255256 move_y_upper = 0;
257+ move_y_landing = false;
256258 rotation_y = 0.0f;
257259 armrotation_y = DegreeToRadian(-30);
258260
@@ -945,6 +947,30 @@
945947 SetFlag(MoveFlag, MOVEFLAG_JUMP);
946948 }
947949
950+//! @brief ジャンプ・着地の取得
951+//! @param nowdata 現在の値を取得:true 前フレームの値を使用:false
952+//! @return ジャンプ:1 着地:2 それ以外:0
953+//! @attention 着地の判定は常に現在の値を取得します。前フレームの状態は取得しません。
954+//! @note 足音再生判定用
955+int human::GetJumpLanding(bool nowdata)
956+{
957+ //使用されていないか、処理されていなければ終了
958+ if( EnableFlag == false ){ return 0; }
959+ if( hp <= 0 ){ return 0; }
960+
961+ if( nowdata == false ){ //前のデータ
962+ if( move_y_landing == true ){ return 2; }
963+ if( GetFlag(MoveFlag_lt, MOVEFLAG_JUMP) ){ return 1; }
964+ }
965+ else{
966+ if( move_y_landing == true ){ return 2; }
967+ if( GetFlag(MoveFlag, MOVEFLAG_JUMP) ){ return 1; }
968+ }
969+
970+ //ジャンプしていない
971+ return 0;
972+}
973+
948974 //! @brief 押しだす・力を加える
949975 //! @param rx 横軸
950976 //! @param ry 縦軸
@@ -1034,6 +1060,13 @@
10341060 return totalmove;
10351061 }
10361062
1063+//! @brief 歩き・走りモーションのカウント値取得
1064+//! @return カウント値
1065+int human::GetMoveMotionCount()
1066+{
1067+ return MotionCtrl->GetMoveMotionCnt();
1068+}
1069+
10371070 //! @brief 照準の状態誤差の処理
10381071 //! @attention ControlProcess()より前で処理すること
10391072 void human::GunsightErrorRange()
@@ -1606,6 +1639,8 @@
16061639 move_y_flag = true;
16071640 }
16081641
1642+ move_y_landing = false;
1643+
16091644 //地面に接地している場合の処理
16101645 if( FallFlag == true ){
16111646 int id, face;
@@ -1612,6 +1647,8 @@
16121647 struct blockdata bdata;
16131648 bool flag = true;
16141649
1650+ if( move_y < HUMAN_MAPCOLLISION_GROUND_HEIGHT ){ move_y_landing = true; }
1651+
16151652 //落下ダメージを与える
16161653 if( move_y < HUMAN_DAMAGE_MINSPEED ){
16171654 //hp -= GetRand(6) + (int)( fabsf(move_y + HUMAN_DAMAGE_MINSPEED)*37.5f );
@@ -3304,4 +3341,12 @@
33043341 *upmodel = id_upmodel;
33053342 *armmodel = armmodelid;
33063343 *legmodel = legmodelid;
3344+}
3345+
3346+//! @brief 歩き・走りモーションのカウント値取得
3347+//! @return カウント値
3348+int HumanMotionControl::GetMoveMotionCnt()
3349+{
3350+ if( walkcnt > 0 ){ return walkcnt; }
3351+ return runcnt;
33073352 }
\ No newline at end of file
--- trunk/object.h (revision 299)
+++ trunk/object.h (revision 300)
@@ -143,6 +143,7 @@
143143 float move_z; //!< Z軸速度
144144 bool move_y_flag; //!< Y軸移動フラグ
145145 int move_y_upper; //!< Y軸上昇禁止カウンター
146+ bool move_y_landing; //!< 着地フラグ
146147 float rotation_y; //!< 全体の回転角度
147148 float armrotation_y; //!< 腕の回転角度
148149 float upmodel_size; //!< 上半身描画サイズ
@@ -218,6 +219,7 @@
218219 virtual void SetRxRy(float rx, float ry);
219220 virtual float GetDeadRy();
220221 virtual void Jump();
222+ virtual int GetJumpLanding(bool nowdata);
221223 virtual void AddPosOrder(float rx, float ry, float speed);
222224 virtual void HitBulletHead(int attacks);
223225 virtual void HitBulletUp(int attacks);
@@ -227,6 +229,7 @@
227229 virtual void SetHitFlag(float rx);
228230 virtual bool CheckHit(float *rx);
229231 virtual float GetTotalMove();
232+ virtual int GetMoveMotionCount();
230233 virtual int RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode, int *underblock_id, int *underblock_face);
231234 virtual int GetGunsightErrorRange();
232235 virtual void Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArmOnly, bool player, bool NoModel);
@@ -397,6 +400,7 @@
397400 void Jump();
398401 void RunFrame(float rotation_x, float armrotation_y, int weapon_paramid, int ReloadCnt, int ChangeWeaponIDCnt, int MoveFlag, int hp, bool PlayerFlag);
399402 void GetRenderMotion(float *arm_rotation_y, float *leg_rotation_x, int *upmodel, int *armmodel, int *legmodel);
403+ int GetMoveMotionCnt();
400404 };
401405
402406 //! 人の足の状態を示す定数
--- trunk/objectmanager.cpp (revision 299)
+++ trunk/objectmanager.cpp (revision 300)
@@ -2643,7 +2643,9 @@
26432643 int rtn;
26442644 int block_id = -1;
26452645 int block_face = -1;
2646+ int block_textureid = -1;
26462647 int MoveMode;
2648+ int JumpLandingMode;
26472649
26482650 //プレイヤーかどうか判定
26492651 if( Player_HumanID == i ){
@@ -2676,16 +2678,51 @@
26762678
26772679 HumanIndex[i].SetDarkModelFlag(screen);
26782680
2681+ //足元にあるブロックのテクスチャー番号を取得する
2682+ if( block_id != -1 ){
2683+ struct blockdata bdata;
2684+ BlockData->Getdata(&bdata, block_id);
2685+ block_textureid = bdata.material[block_face].textureID;
2686+ }
2687+ else{
2688+ block_textureid = -1;
2689+ }
2690+
2691+ MoveMode = HumanIndex[i].GetMovemode(false);
2692+ JumpLandingMode = HumanIndex[i].GetJumpLanding(false);
2693+
26792694 //足音
2680- MoveMode = HumanIndex[i].GetMovemode(false);
26812695 if( (1 <= MoveMode)&&(MoveMode <= 4) ){
26822696 //足音追加
2697+ // ※足元にあるブロックのテクスチャー番号を、足音の種類番号とする。
26832698 float posx, posy, posz;
26842699 int teamid;
2700+ int cnt;
26852701 HumanIndex[i].GetPosData(&posx, &posy, &posz, NULL);
26862702 HumanIndex[i].GetParamData(NULL, NULL, NULL, &teamid);
2687- GameSound->SetFootsteps(posx, posy, posz, MoveMode - 1, teamid);
2703+ cnt = HumanIndex[i].GetMoveMotionCount();
2704+ GameSound->SetFootsteps(posx, posy, posz, block_textureid, MoveMode - 1, teamid, cnt);
26882705 }
2706+
2707+ //ジャンプする音
2708+ if( JumpLandingMode == 1 ){
2709+ //足音追加
2710+ float posx, posy, posz;
2711+ int teamid;
2712+ HumanIndex[i].GetPosData(&posx, &posy, &posz, NULL);
2713+ HumanIndex[i].GetParamData(NULL, NULL, NULL, &teamid);
2714+ GameSound->SetFootsteps(posx, posy, posz, block_textureid, 4, teamid, 0);
2715+ }
2716+
2717+ //着地する音
2718+ if( JumpLandingMode == 2 ){
2719+ //足音追加
2720+ float posx, posy, posz;
2721+ int teamid;
2722+ HumanIndex[i].GetPosData(&posx, &posy, &posz, NULL);
2723+ HumanIndex[i].GetParamData(NULL, NULL, NULL, &teamid);
2724+ GameSound->SetFootsteps(posx, posy, posz, block_textureid, 5, teamid, 0);
2725+ }
26892726 }
26902727
26912728 //武器オブジェクトの処理
--- trunk/soundmanager.cpp (revision 299)
+++ trunk/soundmanager.cpp (revision 300)
@@ -238,24 +238,31 @@
238238 //! @param x 音源のX座標
239239 //! @param y 音源のY座標
240240 //! @param z 音源のZ座標
241-//! @param MoveMode 移動モード(歩き:0 前進:1 後退:2 左右:3)
241+//! @param id 足音の種類番号
242+//! @param MoveMode 移動モード(歩き:0 前進:1 後退:2 左右:3 ジャンプ:4 着地:5)
242243 //! @param teamID チーム番号
244+//! @param cnt カウント値
243245 //! @return 成功:true 失敗:false
244-bool SoundManager::SetFootsteps(float x, float y, float z, int MoveMode, int teamID)
246+bool SoundManager::SetFootsteps(float x, float y, float z, int id, int MoveMode, int teamID, int cnt)
245247 {
246248 soundlist *plist = NULL;
247249 if( GetNewList(&plist) == false ){ return false; }
248250
249- if( (MoveMode < 0)||(3 < MoveMode) ){ return false; }
250-
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; }
251+ switch(MoveMode){
252+ case 0: plist->paramid = FOOTSTEPS_WALK; break;
253+ case 1: plist->paramid = FOOTSTEPS_FORWARD; break;
254+ case 2: plist->paramid = FOOTSTEPS_BACK; break;
255+ case 3: plist->paramid = FOOTSTEPS_SIDE; break;
256+ case 4: plist->paramid = FOOTSTEPS_JUMP; break;
257+ case 5: plist->paramid = FOOTSTEPS_LANDING; break;
258+ default: return false;
259+ }
260+ plist->dataid = id;
255261 plist->x = x;
256262 plist->y = y;
257263 plist->z = z;
258264 plist->teamid = teamID;
265+ plist->cnt = cnt;
259266
260267 return true;
261268 }
@@ -351,6 +358,9 @@
351358 if( getlist[i].teamid == teamID ){ continue; }
352359 else{ maxdist = 35.0f; }
353360 }
361+ if( (getlist[i].paramid == FOOTSTEPS_JUMP)||(getlist[i].paramid == FOOTSTEPS_LANDING) ){
362+ continue;
363+ }
354364 if( getlist[i].paramid == GRE_BOUND ){
355365 continue;
356366 }
@@ -635,8 +645,17 @@
635645 case FOOTSTEPS_BACK:
636646 case FOOTSTEPS_SIDE:
637647 //足音を再生する処理を書く
648+ // 別途足音のサウンドデータを読み込んだ上で、
649+ // plist->cnt(移動モーションのカウント値)を元に一定間隔で、
650+ // plist->dataid(足音の種類番号)に合わせた音を再生すればよい。
638651 //break;
652+ return; //何も再生せずに返す
639653
654+ case FOOTSTEPS_JUMP: //ジャンプ時の音
655+ case FOOTSTEPS_LANDING: //着地時の音
656+ //ジャンプ音・着地音を再生する処理を書く
657+ // plist->dataid(足音の種類番号)も参照できる。
658+ //break;
640659 return; //何も再生せずに返す
641660
642661 case WEAPON_RELOAD: //リロード音
--- trunk/soundmanager.h (revision 299)
+++ trunk/soundmanager.h (revision 300)
@@ -63,6 +63,8 @@
6363 FOOTSTEPS_FORWARD, //!< 足音・走る音(前進)
6464 FOOTSTEPS_BACK, //!< 足音・走る音(後退)
6565 FOOTSTEPS_SIDE, //!< 足音・走る音(左右)
66+ FOOTSTEPS_JUMP, //!< 足音・ジャンプ
67+ FOOTSTEPS_LANDING, //!< 足音・着地音
6668 WEAPON_RELOAD //!< リロード音
6769 };
6870
@@ -77,6 +79,7 @@
7779 float move_y; //!< 1フレーム後の Y座標移動量
7880 float move_z; //!< 1フレーム後の Z座標移動量
7981 int teamid; //!< チーム番号
82+ int cnt; //!< カウント値
8083 };
8184
8285 //! @brief サウンド管理クラス
@@ -109,7 +112,7 @@
109112 bool PassingBullet(float x, float y, float z, float move_x, float move_y, float move_z, int teamID);
110113 bool GrenadeBound(float x, float y, float z, int teamID);
111114 bool GrenadeExplosion(float x, float y, float z, int teamID);
112- bool SetFootsteps(float x, float y, float z, int MoveMode, int teamID);
115+ bool SetFootsteps(float x, float y, float z, int id, int MoveMode, int teamID, int cnt);
113116 bool ReloadWeapon(float x, float y, float z, int teamID);
114117 int GetTotalSoundList();
115118 int GetWorldSound(float pos_x, float pos_y, float pos_z, int teamID, soundlist *psoundlist);