• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

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


Commit MetaInfo

Revision157 (tree)
Time2017-01-08 18:46:49
Authorxops-mikan

Log Message

humanクラスからモーション再生部分の分離を試みる(未完成)

Change Summary

Incremental Difference

--- trunk/object.cpp (revision 156)
+++ trunk/object.cpp (revision 157)
@@ -168,8 +168,6 @@
168168 EnableFlag = flag;
169169 rotation_y = 0.0f;
170170 armrotation_y = 0.0f;
171- reaction_y = 0.0f;
172- legrotation_x = 0.0f;
173171 point_dataid = dataid;
174172 point_p4 = p4;
175173 teamid = team;
@@ -189,17 +187,6 @@
189187 #endif
190188 add_ry = 0.0f;
191189 id_texture = -1;
192- id_upmodel = -1;
193- for(int i=0; i<TOTAL_ARMMODE; i++){
194- id_armmodel[i] = -1;
195- }
196- id_legmodel = -1;
197- for(int i=0; i<TOTAL_WALKMODE; i++){
198- id_walkmodel[i] = -1;
199- }
200- for(int i=0; i<TOTAL_RUNMODE; i++){
201- id_runmodel[i] = -1;
202- }
203190
204191 move_rx = 0.0f;
205192 MoveFlag = 0x00;
@@ -206,17 +193,28 @@
206193 MoveFlag_lt = MoveFlag;
207194 scopemode = 0;
208195 HitFlag = false;
209- walkcnt = 0;
210- runcnt = 0;
211196 totalmove = 0.0f;
212197 StateGunsightErrorRange = 0;
213198 ReactionGunsightErrorRange = 0;
199+
200+ MotionCtrl = new HumanMotionControl;
214201 }
215202
216203 //! @brief ディストラクタ
217204 human::~human()
218-{}
205+{
206+ delete MotionCtrl;
207+}
219208
209+//! @brief 設定値を管理するクラスを登録
210+//! @attention 各関数を使用する前に実行すること。
211+void human::SetParameterInfoClass(class ParameterInfo *in_Param)
212+{
213+ Param = in_Param;
214+
215+ MotionCtrl->SetParameterInfoClass(in_Param);
216+}
217+
220218 //! @brief 設定値を設定
221219 //! @param id_param 人の種類番号
222220 //! @param dataid ポイントのデータ番号
@@ -240,8 +238,6 @@
240238 move_y_flag = false;
241239 rotation_y = 0.0f;
242240 armrotation_y = DegreeToRadian(-30);
243- reaction_y = 0.0f;
244- legrotation_x = rotation_x;
245241
246242 for(int i=0; i<TOTAL_HAVEWEAPON; i++){
247243 weapon[i] = NULL;
@@ -263,6 +259,8 @@
263259 HitFlag = false;
264260 totalmove = 0.0f;
265261 Invincible = false;
262+
263+ MotionCtrl->Init(rotation_x);
266264 }
267265 }
268266
@@ -356,17 +354,7 @@
356354 //! @param runmodel[] 腕のモデルの配列(配列数:TOTAL_RUNMODE)
357355 void human::SetModel(int upmodel, int armmodel[], int legmodel, int walkmodel[], int runmodel[])
358356 {
359- id_upmodel = upmodel;
360- for(int i=0; i<TOTAL_ARMMODE; i++){
361- id_armmodel[i] = armmodel[i];
362- }
363- id_legmodel = legmodel;
364- for(int i=0; i<TOTAL_WALKMODE; i++){
365- id_walkmodel[i] = walkmodel[i];
366- }
367- for(int i=0; i<TOTAL_RUNMODE; i++){
368- id_runmodel[i] = runmodel[i];
369- }
357+ MotionCtrl->SetModel(upmodel, armmodel, legmodel, walkmodel, runmodel);
370358 }
371359
372360 //! @brief 武器を設定
@@ -410,7 +398,11 @@
410398 weapon[selectweapon] = in_weapon;
411399
412400 //腕の角度(反動)を設定
413- reaction_y = DegreeToRadian(-20);
401+ class weapon *nowweapon;
402+ int id_param = 0;
403+ nowweapon = weapon[selectweapon];
404+ nowweapon->GetParamData(&id_param, NULL, NULL);
405+ MotionCtrl->PickupWeapon(id_param);
414406
415407 //切り替え完了のカウント
416408 selectweaponcnt = 10;
@@ -456,8 +448,19 @@
456448 //スコープ表示を解除
457449 SetDisableScope();
458450
451+ //現在装備する武器のクラスを取得
452+ class weapon *nowweapon;
453+ nowweapon = weapon[selectweapon];
454+
459455 //腕の角度(反動)を設定
460- reaction_y = DegreeToRadian(-20);
456+ if( nowweapon == NULL ){ //手ぶら
457+ MotionCtrl->ChangeWeapon(ID_WEAPON_NONE);
458+ }
459+ else{
460+ int id_param = 0;
461+ nowweapon->GetParamData(&id_param, NULL, NULL);
462+ MotionCtrl->ChangeWeapon(id_param);
463+ }
461464
462465 //切り替え完了のカウント
463466 selectweaponcnt = 10;
@@ -565,12 +568,7 @@
565568 }
566569
567570 //腕に反動を伝える
568- if( param_id == ID_WEAPON_GRENADE ){
569- reaction_y = DegreeToRadian(20);
570- }
571- else{
572- reaction_y = DegreeToRadian(0.5f) * ParamData.reaction;
573- }
571+ MotionCtrl->ShotWeapon(param_id);
574572
575573 //武器が無くなっていれば、装備から外した扱いに。 (手榴弾用)
576574 if( weapon[selectweapon]->GetEnableFlag() == false ){
@@ -597,6 +595,14 @@
597595
598596 //スコープモードを解除
599597 SetDisableScope();
598+
599+ //モーション実行
600+ class weapon *nowweapon;
601+ int id_param = 0;
602+ nowweapon = weapon[selectweapon];
603+ nowweapon->GetParamData(&id_param, NULL, NULL);
604+ MotionCtrl->ReloadWeapon(id_param);
605+
600606 return true;
601607 }
602608 return false;
@@ -622,6 +628,9 @@
622628 //スコープモードを解除
623629 SetDisableScope();
624630
631+ //モーション実行
632+ MotionCtrl->DumpWeapon();
633+
625634 return true;
626635 }
627636
@@ -652,6 +661,10 @@
652661
653662 //設定を適用
654663 weapon[selectweapon]->SetParamData(ChangeWeapon, lnbs, nbs, false);
664+
665+ //モーション実行
666+ MotionCtrl->ChangeShotMode(ChangeWeapon);
667+
655668 return 0;
656669 }
657670
@@ -792,6 +805,9 @@
792805 if( move_y_flag == false ){
793806 if( move_y == 0.0f ){
794807 move_y = HUMAN_JUMP_SPEED;
808+
809+ //モーション実行
810+ MotionCtrl->Jump();
795811 return 0;
796812 }
797813 }
@@ -1203,61 +1219,41 @@
12031219 if( GetFlag(MoveFlag, MOVEFLAG_WALK) ){
12041220 move_rx = DegreeToRadian(0);
12051221 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSWALK_ACCELERATION);
1206- walkcnt += 1;
1207- runcnt = 0;
12081222 }
12091223 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_FORWARD ){
12101224 move_rx = DegreeToRadian(0);
12111225 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSRUN_ACCELERATION);
1212- walkcnt = 0;
1213- runcnt += 1;
12141226 }
12151227 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_BACK ){
12161228 move_rx = DegreeToRadian(180);
12171229 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_REGRESSRUN_ACCELERATION);
1218- walkcnt = 0;
1219- runcnt += 1;
12201230 }
12211231 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_LEFT ){
12221232 move_rx = DegreeToRadian(90);
12231233 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_SIDEWAYSRUN_ACCELERATION);
1224- walkcnt = 0;
1225- runcnt += 1;
12261234 }
12271235 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_RIGHT ){
12281236 move_rx = DegreeToRadian(-90);
12291237 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_SIDEWAYSRUN_ACCELERATION);
1230- walkcnt = 0;
1231- runcnt += 1;
12321238 }
12331239 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_FORWARD | MOVEFLAG_LEFT) ){
12341240 move_rx = DegreeToRadian(45);
12351241 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSRUN_SIDEWAYSRUN_ACCELERATION);
1236- walkcnt = 0;
1237- runcnt += 1;
12381242 }
12391243 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_BACK | MOVEFLAG_LEFT) ){
12401244 move_rx = DegreeToRadian(135);
12411245 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_REGRESSRUN_SIDEWAYSRUN_ACCELERATION);
1242- walkcnt = 0;
1243- runcnt += 1;
12441246 }
12451247 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_BACK | MOVEFLAG_RIGHT) ){
12461248 move_rx = DegreeToRadian(-135);
12471249 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_REGRESSRUN_SIDEWAYSRUN_ACCELERATION);
1248- walkcnt = 0;
1249- runcnt += 1;
12501250 }
12511251 else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_FORWARD | MOVEFLAG_RIGHT) ){
12521252 move_rx = DegreeToRadian(-45);
12531253 AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSRUN_SIDEWAYSRUN_ACCELERATION);
1254- walkcnt = 0;
1255- runcnt += 1;
12561254 }
12571255 else{
12581256 move_rx = 0.0f;
1259- walkcnt = 0;
1260- runcnt = 0;
12611257 }
12621258
12631259 //フラグをバックアップ
@@ -1534,9 +1530,10 @@
15341530 //! @param CollD Collisionのポインタ
15351531 //! @param inblockdata BlockDataInterfaceのポインタ
15361532 //! @param AddCollisionFlag 追加の当たり判定フラグ
1533+//! @param player 対象の人物がプレイヤーかどうか
15371534 //! @param F5mode 上昇機能(F5裏技)のフラグ (有効:true 無効:false)
15381535 //! @return 処理なし:0 通常処理:1 死亡して倒れ終わった直後:2 静止した死体:3
1539-int human::RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool F5mode)
1536+int human::RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode)
15401537 {
15411538 if( CollD == NULL ){ return 0; }
15421539 if( EnableFlag == false ){ return 0; }
@@ -1551,6 +1548,7 @@
15511548 }
15521549 #endif
15531550
1551+ int WeaponReloadCnt;
15541552 float FallDistance;
15551553 float nowmove_x, nowmove_z;
15561554 int CheckDead;
@@ -1560,42 +1558,12 @@
15601558 selectweaponcnt -= 1;
15611559 }
15621560
1563- //発砲による反動
1564- if( reaction_y > 0.0f ){
1565- if( reaction_y > DegreeToRadian(2) ){ reaction_y -= DegreeToRadian(2); }
1566- else{ reaction_y = 0.0f; }
1567- }
1568- if( reaction_y < 0.0f ){
1569- if( reaction_y < DegreeToRadian(2) ){ reaction_y += DegreeToRadian(2); }
1570- else{ reaction_y = 0.0f; }
1571- }
1572-
1573- //リロード中なら腕の角度を再設定
1561+ //リロードカウント取得
15741562 if( weapon[selectweapon] != NULL ){
1575- if( weapon[selectweapon]->GetReloadCnt() > 0 ){
1576- reaction_y = ARMRAD_RELOADWEAPON;
1577- }
1563+ WeaponReloadCnt = weapon[selectweapon]->GetReloadCnt();
15781564 }
1579-
1580- //足の角度を算出
1581- if( hp <= 0 ){
1582- legrotation_x = rotation_x;
1583- }
15841565 else{
1585- float move_rx2;
1586-
1587- //足の向きを求める
1588- if( fabs(move_rx) > DegreeToRadian(90)){
1589- move_rx2 = move_rx + (float)M_PI;
1590- }
1591- else{
1592- move_rx2 = move_rx;
1593- }
1594- for(; move_rx2 > (float)M_PI; move_rx2 -= (float)M_PI*2){}
1595- for(; move_rx2 < (float)M_PI*-1; move_rx2 += (float)M_PI*2){}
1596-
1597- //徐々にその向きに
1598- legrotation_x = legrotation_x*0.85f + (rotation_x + move_rx2*-1)*0.15f; // 3/4 + 1/4
1566+ WeaponReloadCnt = 0;
15991567 }
16001568
16011569 //照準の状態誤差の処理
@@ -1604,43 +1572,61 @@
16041572 //死亡判定と倒れる処理
16051573 CheckDead = CheckAndProcessDead(CollD);
16061574 if( CheckDead == 3 ){ return 2; }
1607- if( CheckDead != 0 ){ return 3; }
16081575
1609- //進行方向と速度を決定
1610- ControlProcess();
1576+ if( CheckDead == 0 ){
1577+ //進行方向と速度を決定
1578+ ControlProcess();
16111579
1612- //マップとの当たり判定
1613- MapCollisionDetection(CollD, inblockdata, AddCollisionFlag, &FallDistance, &nowmove_x, &nowmove_z);
1580+ //マップとの当たり判定
1581+ MapCollisionDetection(CollD, inblockdata, AddCollisionFlag, &FallDistance, &nowmove_x, &nowmove_z);
16141582
1615- //移動するなら
1616- if( (nowmove_x*nowmove_x + nowmove_z*nowmove_z) > 0.0f * 0.0f ){
1617- totalmove += sqrt(nowmove_x*nowmove_x + nowmove_z*nowmove_z);
1583+ //移動するなら
1584+ if( (nowmove_x*nowmove_x + nowmove_z*nowmove_z) > 0.0f * 0.0f ){
1585+ totalmove += sqrt(nowmove_x*nowmove_x + nowmove_z*nowmove_z);
1586+ }
1587+
1588+ //座標移動
1589+ pos_x += nowmove_x;
1590+ pos_z += nowmove_z;
1591+
1592+ //移動量を減衰
1593+ move_x *= HUMAN_ATTENUATION;
1594+ move_z *= HUMAN_ATTENUATION;
1595+
1596+ //F5を使用していなければ、計算結果を反映
1597+ if( F5mode == false ){
1598+ pos_y += FallDistance;
1599+ }
1600+ else{
1601+ move_y = 0.0f;
1602+ pos_y += 5.0f; //使用していれば、強制的に上昇
1603+ }
1604+
1605+
1606+ //-100.0より下に落ちたら、死亡
1607+ if( pos_y < HUMAN_DEADLINE ){
1608+ pos_y = HUMAN_DEADLINE;
1609+ hp = 0;
1610+ }
16181611 }
16191612
1620- //座標移動
1621- pos_x += nowmove_x;
1622- pos_z += nowmove_z;
16231613
1624- //移動量を減衰
1625- move_x *= HUMAN_ATTENUATION;
1626- move_z *= HUMAN_ATTENUATION;
1614+ //現在装備する武器のクラスを取得
1615+ class weapon *nowweapon;
1616+ int weapon_paramid;
1617+ nowweapon = weapon[selectweapon];
16271618
1628- //F5を使用していなければ、計算結果を反映
1629- if( F5mode == false ){
1630- pos_y += FallDistance;
1619+ if( nowweapon == NULL ){ //手ぶら
1620+ weapon_paramid = ID_WEAPON_NONE;
16311621 }
1632- else{
1633- move_y = 0.0f;
1634- pos_y += 5.0f; //使用していれば、強制的に上昇
1622+ else{ //何か武器を持っている
1623+ nowweapon->GetParamData(&weapon_paramid, NULL, NULL);
16351624 }
16361625
1626+ //モーション計算
1627+ MotionCtrl->RunFrame(rotation_x, armrotation_y, weapon_paramid, WeaponReloadCnt, MoveFlag_lt, hp, player);
16371628
1638- //-100.0より下に落ちたら、死亡
1639- if( pos_y < HUMAN_DEADLINE ){
1640- pos_y = HUMAN_DEADLINE;
1641- hp = 0;
1642- }
1643-
1629+ if( CheckDead != 0 ){ return 3; }
16441630 return 1;
16451631 }
16461632
@@ -1659,43 +1645,32 @@
16591645 //! @todo 死体の部位の高さ(Y軸)がおかしい
16601646 void human::Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArm, bool player)
16611647 {
1648+ //未使用引数対策
1649+ UNREFERENCED_PARAMETER(player);
1650+
16621651 //正しく初期化されていなければ、処理しない
16631652 if( d3dg == NULL ){ return; }
16641653 if( EnableFlag == false ){ return; }
16651654
1666- //現在装備する武器のクラスを取得
1667- class weapon *nowweapon;
1668- nowweapon = weapon[selectweapon];
1655+ //モーション取得
1656+ int upmodel, armmodel, legmodel;
1657+ float armry, legrx;
1658+ MotionCtrl->GetRenderMotion(&armry, &legrx, &upmodel, &armmodel, &legmodel);
16691659
16701660 if( DrawArm == false ){
1671- int legmodelid;
1672-
16731661 //上半身を描画
16741662 d3dg->SetWorldTransform(pos_x, pos_y - 1.0f, pos_z, rotation_x + (float)M_PI, rotation_y, upmodel_size);
1675- d3dg->RenderModel(id_upmodel, id_texture);
1663+ d3dg->RenderModel(upmodel, id_texture);
16761664
1677- //足のモデルを設定
1678- legmodelid = id_legmodel; //立ち止まり
1679- if( GetFlag(MoveFlag_lt, MOVEFLAG_WALK) ){
1680- legmodelid = id_walkmodel[ (walkcnt/3 % TOTAL_WALKMODE) ]; //歩き
1681- }
1682- else{
1683- if( GetFlag(MoveFlag_lt, (MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) ){
1684- legmodelid = id_runmodel[ (runcnt/3 % TOTAL_RUNMODE) ]; //左右走り
1685- }
1686- if( GetFlag(MoveFlag_lt, MOVEFLAG_FORWARD) ){
1687- legmodelid = id_runmodel[ (runcnt/2 % TOTAL_RUNMODE) ]; //前走り
1688- }
1689- if( GetFlag(MoveFlag_lt, MOVEFLAG_BACK) ){
1690- legmodelid = id_runmodel[ (runcnt/4 % TOTAL_RUNMODE) ]; //後ろ走り
1691- }
1692- }
1693-
16941665 //足を描画
1695- d3dg->SetWorldTransform(pos_x, pos_y, pos_z, legrotation_x + (float)M_PI, rotation_y, legmodel_size);
1696- d3dg->RenderModel(legmodelid, id_texture);
1666+ d3dg->SetWorldTransform(pos_x, pos_y, pos_z, legrx + (float)M_PI, rotation_y, legmodel_size);
1667+ d3dg->RenderModel(legmodel, id_texture);
16971668 }
16981669
1670+ //現在装備する武器のクラスを取得
1671+ class weapon *nowweapon;
1672+ nowweapon = weapon[selectweapon];
1673+
16991674 //腕を描画
17001675 if( rotation_y != 0.0f ){ //死亡して倒れている or 倒れ始めた
17011676 float x = pos_x + cos(rotation_x*-1 - (float)M_PI/2)*sin(rotation_y)*16.0f;
@@ -1702,50 +1677,27 @@
17021677 float y = pos_y + cos(rotation_y)*16.0f;
17031678 float z = pos_z + sin(rotation_x*-1 - (float)M_PI/2)*sin(rotation_y)*16.0f;
17041679 d3dg->SetWorldTransform(x, y, z, rotation_x + (float)M_PI, armrotation_y + rotation_y, armmodel_size);
1705- d3dg->RenderModel(id_armmodel[0], id_texture);
1680+ d3dg->RenderModel(armmodel, id_texture);
17061681 }
17071682 else if( nowweapon == NULL ){ //手ぶら
1708- float ry;
1709- if( player == true ){
1710- ry = ARMRAD_NOWEAPON;
1711- }
1712- else{
1713- ry = armrotation_y;
1714- }
1715- d3dg->SetWorldTransform(pos_x, pos_y + 16.0f, pos_z, rotation_x + (float)M_PI, ry, armmodel_size);
1716- d3dg->RenderModel(id_armmodel[0], id_texture);
1683+ d3dg->SetWorldTransform(pos_x, pos_y + 16.0f, pos_z, rotation_x + (float)M_PI, armry, armmodel_size);
1684+ d3dg->RenderModel(armmodel, id_texture);
17171685 }
17181686 else{ //何か武器を持っている
17191687 //武器のモデルとテクスチャを取得
17201688 int id_param;
1721- int armmodelid = 0;
17221689 WeaponParameter paramdata;
17231690 int model, texture;
1724- float ry = 0.0f;
17251691 nowweapon->GetParamData(&id_param, NULL, NULL);
17261692 Param->GetWeapon(id_param, &paramdata);
17271693 Resource->GetWeaponModelTexture(id_param, &model, &texture);
17281694
1729- //腕の形と角度を決定
1730- if( paramdata.WeaponP == 0 ){
1731- armmodelid = 1;
1732- ry = armrotation_y + reaction_y;
1733- }
1734- if( paramdata.WeaponP == 1 ){
1735- armmodelid = 2;
1736- ry = armrotation_y + reaction_y;
1737- }
1738- if( paramdata.WeaponP == 2 ){
1739- armmodelid = 0;
1740- ry = ARMRAD_NOWEAPON;
1741- }
1742-
17431695 //腕を描画
1744- d3dg->SetWorldTransform(pos_x, pos_y + 16.0f, pos_z, rotation_x + (float)M_PI, ry, armmodel_size);
1745- d3dg->RenderModel(id_armmodel[armmodelid], id_texture);
1696+ d3dg->SetWorldTransform(pos_x, pos_y + 16.0f, pos_z, rotation_x + (float)M_PI, armry, armmodel_size);
1697+ d3dg->RenderModel(armmodel, id_texture);
17461698
17471699 //武器を描画
1748- d3dg->SetWorldTransformHumanWeapon(pos_x, pos_y + 16.0f, pos_z, paramdata.mx/10*-1, paramdata.my/10, paramdata.mz/10*-1, rotation_x + (float)M_PI, ry, paramdata.size);
1700+ d3dg->SetWorldTransformHumanWeapon(pos_x, pos_y + 16.0f, pos_z, paramdata.mx/10*-1, paramdata.my/10, paramdata.mz/10*-1, rotation_x + (float)M_PI, armry, paramdata.size);
17491701 d3dg->RenderModel(model, texture);
17501702 }
17511703 }
@@ -2759,4 +2711,296 @@
27592711 //描画
27602712 d3dg->SetWorldTransformEffect(pos_x, pos_y, pos_z, rotation_x, rotation_y, rotation_texture, model_size);
27612713 d3dg->RenderBoard(id_texture, alpha);
2714+}
2715+
2716+//! @brief コンストラクタ
2717+HumanMotionControl::HumanMotionControl(class ParameterInfo *in_Param)
2718+{
2719+ Param = in_Param;
2720+
2721+ id_upmodel = -1;
2722+ for(int i=0; i<TOTAL_ARMMODE; i++){
2723+ id_armmodel[i] = -1;
2724+ }
2725+ id_legmodel = -1;
2726+ for(int i=0; i<TOTAL_WALKMODE; i++){
2727+ id_walkmodel[i] = -1;
2728+ }
2729+ for(int i=0; i<TOTAL_RUNMODE; i++){
2730+ id_runmodel[i] = -1;
2731+ }
2732+
2733+ reaction_y = 0.0f;
2734+ armmodel_rotation_y = 0.0f;
2735+ legrotation_x = 0.0f;
2736+ walkcnt = 0;
2737+ runcnt = 0;
2738+}
2739+
2740+//! @brief ディストラクタ
2741+HumanMotionControl::~HumanMotionControl()
2742+{}
2743+
2744+//! @brief 設定値を管理するクラスを登録
2745+//! @attention 各関数を使用する前に実行すること。
2746+void HumanMotionControl::SetParameterInfoClass(class ParameterInfo *in_Param)
2747+{
2748+ Param = in_Param;
2749+}
2750+
2751+//! @brief モデルデータを設定
2752+//! @param upmodel 上半身のモデル
2753+//! @param armmodel[] 腕のモデルの配列(配列数:TOTAL_ARMMODE)
2754+//! @param legmodel 足(静止状態)のモデル
2755+//! @param walkmodel[] 腕のモデルの配列(配列数:TOTAL_WALKMODE)
2756+//! @param runmodel[] 腕のモデルの配列(配列数:TOTAL_RUNMODE)
2757+void HumanMotionControl::SetModel(int upmodel, int armmodel[], int legmodel, int walkmodel[], int runmodel[])
2758+{
2759+ id_upmodel = upmodel;
2760+ for(int i=0; i<TOTAL_ARMMODE; i++){
2761+ id_armmodel[i] = armmodel[i];
2762+ }
2763+ id_legmodel = legmodel;
2764+ for(int i=0; i<TOTAL_WALKMODE; i++){
2765+ id_walkmodel[i] = walkmodel[i];
2766+ }
2767+ for(int i=0; i<TOTAL_RUNMODE; i++){
2768+ id_runmodel[i] = runmodel[i];
2769+ }
2770+}
2771+
2772+//! @brief 初期化系関数
2773+//! @param rx 回転角度
2774+void HumanMotionControl::Init(float rx)
2775+{
2776+ reaction_y = 0.0f;
2777+ armmodel_rotation_y = 0.0f;
2778+ legrotation_x = rx;
2779+ walkcnt = 0;
2780+ runcnt = 0;
2781+}
2782+
2783+//! @brief 武器を拾う
2784+//! @param weapon_paramid 武器の種類番号
2785+void HumanMotionControl::PickupWeapon(int weapon_paramid)
2786+{
2787+ //未使用引数対策
2788+ UNREFERENCED_PARAMETER(weapon_paramid);
2789+
2790+ //腕の角度(反動)を設定
2791+ reaction_y = DegreeToRadian(-20);
2792+}
2793+
2794+//! @brief 武器を切り替える(持ち替える)
2795+//! @param weapon_paramid 武器の種類番号
2796+void HumanMotionControl::ChangeWeapon(int weapon_paramid)
2797+{
2798+ //未使用引数対策
2799+ UNREFERENCED_PARAMETER(weapon_paramid);
2800+
2801+ //腕の角度(反動)を設定
2802+ reaction_y = DegreeToRadian(-20);
2803+}
2804+
2805+//! @brief 発砲処理
2806+//! @param weapon_paramid 武器の種類番号
2807+void HumanMotionControl::ShotWeapon(int weapon_paramid)
2808+{
2809+ //腕に反動を伝える
2810+ if( weapon_paramid == ID_WEAPON_GRENADE ){
2811+ reaction_y = DegreeToRadian(20);
2812+ }
2813+ else{
2814+ //武器の設定値を取得
2815+ WeaponParameter ParamData;
2816+ if( Param->GetWeapon(weapon_paramid, &ParamData) != 0 ){ return; }
2817+
2818+ reaction_y = DegreeToRadian(0.5f) * ParamData.reaction;
2819+ }
2820+}
2821+
2822+//! @brief リロード
2823+//! @param weapon_paramid 武器の種類番号
2824+//! @attention この関数は拡張用のダミー関数です。
2825+void HumanMotionControl::ReloadWeapon(int weapon_paramid)
2826+{
2827+ //未使用引数対策
2828+ UNREFERENCED_PARAMETER(weapon_paramid);
2829+}
2830+
2831+//! @brief 武器を捨てる
2832+//! @attention この関数は拡張用のダミー関数です。
2833+void HumanMotionControl::DumpWeapon()
2834+{
2835+ //
2836+}
2837+
2838+//! @brief 武器のショットモード切り替え
2839+//! @param weapon_paramid 武器の種類番号
2840+//! @attention この関数は拡張用のダミー関数です。
2841+void HumanMotionControl::ChangeShotMode(int weapon_paramid)
2842+{
2843+ //未使用引数対策
2844+ UNREFERENCED_PARAMETER(weapon_paramid);
2845+}
2846+
2847+//! @brief ジャンプ
2848+//! @attention この関数は拡張用のダミー関数です。
2849+void HumanMotionControl::Jump()
2850+{
2851+ //
2852+}
2853+
2854+//! @brief モーション計算を実行
2855+//! @attention rotation_x 体全体の回転角度
2856+//! @attention armrotation_y 腕の回転角度
2857+//! @attention weapon_paramid 武器の種類番号
2858+//! @attention ReloadCnt 武器のリロードカウント
2859+//! @attention MoveFlag 移動方向を表すフラグ
2860+//! @attention hp 体力
2861+//! @attention PlayerFlag プレイヤーかどうか
2862+void HumanMotionControl::RunFrame(float rotation_x, float armrotation_y, int weapon_paramid, int ReloadCnt, int MoveFlag, int hp, bool PlayerFlag)
2863+{
2864+ int ArmModelID;
2865+ float move_rx;
2866+
2867+ //発砲などによる反動
2868+ if( reaction_y > 0.0f ){
2869+ if( reaction_y > DegreeToRadian(2) ){ reaction_y -= DegreeToRadian(2); }
2870+ else{ reaction_y = 0.0f; }
2871+ }
2872+ if( reaction_y < 0.0f ){
2873+ if( reaction_y < DegreeToRadian(2) ){ reaction_y += DegreeToRadian(2); }
2874+ else{ reaction_y = 0.0f; }
2875+ }
2876+
2877+ //リロード中なら腕の角度を再設定
2878+ if( ReloadCnt > 0 ){
2879+ reaction_y = ARMRAD_RELOADWEAPON;
2880+ }
2881+
2882+ if( weapon_paramid == ID_WEAPON_NONE ){ //手ぶら
2883+ if( PlayerFlag == true ){
2884+ armmodel_rotation_y = ARMRAD_NOWEAPON;
2885+ }
2886+ else{
2887+ armmodel_rotation_y = armrotation_y;
2888+ }
2889+ ArmModelID = 0;
2890+ }
2891+ else{ //何か武器を持っている
2892+ //武器の情報を取得
2893+ WeaponParameter paramdata;
2894+ Param->GetWeapon(weapon_paramid, &paramdata);
2895+
2896+ armmodel_rotation_y = 0.0f;
2897+ ArmModelID = 0;
2898+
2899+ //腕の形と角度を決定
2900+ if( paramdata.WeaponP == 0 ){
2901+ armmodel_rotation_y = armrotation_y + reaction_y;
2902+ ArmModelID = 1;
2903+ }
2904+ if( paramdata.WeaponP == 1 ){
2905+ armmodel_rotation_y = armrotation_y + reaction_y;
2906+ ArmModelID = 2;
2907+ }
2908+ if( paramdata.WeaponP == 2 ){
2909+ armmodel_rotation_y = ARMRAD_NOWEAPON;
2910+ ArmModelID = 0;
2911+ }
2912+ }
2913+
2914+ //進行方向を決定
2915+ if( GetFlag(MoveFlag, MOVEFLAG_WALK) ){
2916+ move_rx = DegreeToRadian(0);
2917+ }
2918+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_FORWARD ){
2919+ move_rx = DegreeToRadian(0);
2920+ }
2921+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_BACK ){
2922+ move_rx = DegreeToRadian(180);
2923+ }
2924+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_LEFT ){
2925+ move_rx = DegreeToRadian(90);
2926+ }
2927+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_RIGHT ){
2928+ move_rx = DegreeToRadian(-90);
2929+ }
2930+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_FORWARD | MOVEFLAG_LEFT) ){
2931+ move_rx = DegreeToRadian(45);
2932+ }
2933+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_BACK | MOVEFLAG_LEFT) ){
2934+ move_rx = DegreeToRadian(135);
2935+ }
2936+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_BACK | MOVEFLAG_RIGHT) ){
2937+ move_rx = DegreeToRadian(-135);
2938+ }
2939+ else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_FORWARD | MOVEFLAG_RIGHT) ){
2940+ move_rx = DegreeToRadian(-45);
2941+ }
2942+ else{
2943+ move_rx = 0.0f;
2944+ }
2945+
2946+ //足の角度を算出
2947+ if( hp <= 0 ){
2948+ legrotation_x = rotation_x;
2949+ }
2950+ else{
2951+ float move_rx2;
2952+
2953+ //足の向きを求める
2954+ if( fabs(move_rx) > DegreeToRadian(90)){
2955+ move_rx2 = move_rx + (float)M_PI;
2956+ }
2957+ else{
2958+ move_rx2 = move_rx;
2959+ }
2960+ for(; move_rx2 > (float)M_PI; move_rx2 -= (float)M_PI*2){}
2961+ for(; move_rx2 < (float)M_PI*-1; move_rx2 += (float)M_PI*2){}
2962+
2963+ //徐々にその向きに
2964+ legrotation_x = legrotation_x*0.85f + (rotation_x + move_rx2*-1)*0.15f; // 3/4 + 1/4
2965+ }
2966+
2967+ //腕のモデル設定
2968+ armmodelid = id_armmodel[ArmModelID];
2969+
2970+ //足のモデル設定
2971+ legmodelid = id_legmodel; //立ち止まり
2972+ if( GetFlag(MoveFlag, MOVEFLAG_WALK) ){
2973+ legmodelid = id_walkmodel[ (walkcnt/3 % TOTAL_WALKMODE) ]; //歩き
2974+ walkcnt += 1;
2975+ runcnt = 0;
2976+ }
2977+ else{
2978+ if( GetFlag(MoveFlag, (MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) ){
2979+ legmodelid = id_runmodel[ (runcnt/3 % TOTAL_RUNMODE) ]; //左右走り
2980+ }
2981+ if( GetFlag(MoveFlag, MOVEFLAG_FORWARD) ){
2982+ legmodelid = id_runmodel[ (runcnt/2 % TOTAL_RUNMODE) ]; //前走り
2983+ }
2984+ if( GetFlag(MoveFlag, MOVEFLAG_BACK) ){
2985+ legmodelid = id_runmodel[ (runcnt/4 % TOTAL_RUNMODE) ]; //後ろ走り
2986+ }
2987+ walkcnt = 0;
2988+ runcnt += 1;
2989+ }
2990+}
2991+
2992+//! @brief モーション取得
2993+//! @param arm_rotation_y 腕の角度を取得するポインタ
2994+//! @param leg_rotation_x 足の角度を取得するポインタ
2995+//! @param upmodel 上半身のモデル認識番号を取得するポインタ
2996+//! @param armmodel 腕のモデル認識番号を取得するポインタ
2997+//! @param legmodel 足のモデル認識番号を取得するポインタ
2998+void HumanMotionControl::GetRenderMotion(float *arm_rotation_y, float *leg_rotation_x, int *upmodel, int *armmodel, int *legmodel)
2999+{
3000+ *arm_rotation_y = armmodel_rotation_y;
3001+ *leg_rotation_x = legrotation_x;
3002+
3003+ *upmodel = id_upmodel;
3004+ *armmodel = armmodelid;
3005+ *legmodel = legmodelid;
27623006 }
\ No newline at end of file
--- trunk/object.h (revision 156)
+++ trunk/object.h (revision 157)
@@ -129,10 +129,8 @@
129129 float move_y; //!< Y軸(落下)速度
130130 float move_z; //!< Z軸速度
131131 bool move_y_flag; //!< Y軸移動フラグ
132- float rotation_y; //!< 全体の回転角度
132+ float rotation_y; //!< 全体の回転角度
133133 float armrotation_y; //!< 腕の回転角度
134- float reaction_y; //!< 腕を上げ下げする角度
135- float legrotation_x; //!< 足の回転角度
136134 float upmodel_size; //!< 上半身描画サイズ
137135 float armmodel_size; //!< 腕描画サイズ
138136 float legmodel_size; //!< 足描画サイズ
@@ -141,26 +139,21 @@
141139 int selectweaponcnt; //!< 武器の切り替えカウント
142140 int hp; //!< 体力
143141 #ifdef HUMAN_DEADBODY_COLLISION
144- int deadstate; //!< 死体になっているか
142+ int deadstate; //!< 死体になっているか
145143 #endif
146- float add_ry; //!< 死体の倒れる加速度
147- int id_upmodel; //!< 上半身
148- int id_armmodel[TOTAL_ARMMODE]; //!< 腕
149- int id_legmodel; //!< 足(静止)
150- int id_walkmodel[TOTAL_WALKMODE]; //!< 足(歩く)
151- int id_runmodel[TOTAL_RUNMODE]; //!< 足(走る)
152- float move_rx; //!< 移動角度
153- int MoveFlag; //!< 移動方向を表すフラグ
154- int MoveFlag_lt; //!< (前回の)移動方向を表すフラグ
155- int scopemode; //!< スコープ使用モード
156- bool HitFlag; //!< 被弾を表すフラグ
157- int walkcnt; //!< 歩くモーションのカウント
158- int runcnt; //!< 走るモーションのカウント
159- float totalmove; //!< 合計移動量
144+ float add_ry; //!< 死体の倒れる加速度
145+ float move_rx; //!< 移動角度
146+ int MoveFlag; //!< 移動方向を表すフラグ
147+ int MoveFlag_lt; //!< (前回の)移動方向を表すフラグ
148+ int scopemode; //!< スコープ使用モード
149+ bool HitFlag; //!< 被弾を表すフラグ
150+ float totalmove; //!< 合計移動量
160151 int StateGunsightErrorRange; //!< 照準の状態誤差
161152 int ReactionGunsightErrorRange; //!< 照準の反動誤差
162- bool Invincible; //!< 無敵フラグ
153+ bool Invincible; //!< 無敵フラグ
163154
155+ class HumanMotionControl *MotionCtrl; //!< モーションを制御するクラスへのポインタ
156+
164157 void GunsightErrorRange();
165158 int CheckAndProcessDead(class Collision *CollD);
166159 void ControlProcess();
@@ -169,6 +162,7 @@
169162 public:
170163 human(class ParameterInfo *in_Param = NULL, float x = 0.0f, float y = 0.0f, float z = 0.0f, float rx = 0.0f, int id_param = -1, int dataid = 0, signed char p4 = 0, int team = 0, bool flag = false);
171164 ~human();
165+ virtual void SetParameterInfoClass(class ParameterInfo *in_Param);
172166 virtual void SetParamData(int id_param, int dataid, signed char p4, int team, bool init);
173167 virtual void GetParamData(int *id_param, int *dataid, signed char *p4, int *team);
174168 virtual void GetMovePos(float *x, float *y, float *z);
@@ -212,7 +206,7 @@
212206 virtual void SetHitFlag();
213207 virtual bool CheckHit();
214208 virtual float GetTotalMove();
215- virtual int RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool F5mode);
209+ virtual int RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode);
216210 virtual int GetGunsightErrorRange();
217211 virtual void Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArm, bool player);
218212 };
@@ -345,6 +339,42 @@
345339 virtual void Render(class D3DGraphics *d3dg);
346340 };
347341
342+//! @brief 人モーション制御クラス
343+//! @details 人のモーション(アニメーション)制御を行うクラスです。humanクラス内で使用します。
344+//! @attention 本クラスに人が死亡した際の倒れるモーションは実装されていません。
345+class HumanMotionControl
346+{
347+ class ParameterInfo *Param; //!< 設定値を管理するクラスへのポインタ
348+ int id_upmodel; //!< 上半身
349+ int id_armmodel[TOTAL_ARMMODE]; //!< 腕
350+ int id_legmodel; //!< 足(静止)
351+ int id_walkmodel[TOTAL_WALKMODE]; //!< 足(歩く)
352+ int id_runmodel[TOTAL_RUNMODE]; //!< 足(走る)
353+ float reaction_y; //!< 腕を上げ下げする相対角度
354+ float armmodel_rotation_y; //!< 腕の回転角度
355+ float legrotation_x; //!< 足の回転角度
356+ int walkcnt; //!< 歩くモーションのカウント
357+ int runcnt; //!< 走るモーションのカウント
358+ int armmodelid; //!< 描画する腕のモデル
359+ int legmodelid; //!< 描画する足のモデル
360+
361+public:
362+ HumanMotionControl(class ParameterInfo *in_Param = NULL);
363+ ~HumanMotionControl();
364+ void SetParameterInfoClass(class ParameterInfo *in_Param);
365+ void SetModel(int upmodel, int armmodel[], int legmodel, int walkmodel[], int runmodel[]);
366+ void Init(float rx);
367+ void PickupWeapon(int weapon_paramid);
368+ void ChangeWeapon(int weapon_paramid);
369+ void ShotWeapon(int weapon_paramid);
370+ void ReloadWeapon(int weapon_paramid);
371+ void DumpWeapon();
372+ void ChangeShotMode(int weapon_paramid);
373+ void Jump();
374+ void RunFrame(float rotation_x, float armrotation_y, int weapon_paramid, int ReloadCnt, int MoveFlag, int hp, bool PlayerFlag);
375+ void GetRenderMotion(float *arm_rotation_y, float *leg_rotation_x, int *upmodel, int *armmodel, int *legmodel);
376+};
377+
348378 //! 人の足の状態を示す定数
349379 enum Human_LegState {
350380 LEG_STOP = 0,
--- trunk/objectmanager.cpp (revision 156)
+++ trunk/objectmanager.cpp (revision 157)
@@ -2432,8 +2432,16 @@
24322432
24332433 //人オブジェクトの処理
24342434 for(int i=0; i<MAX_HUMAN; i++){
2435- bool cmdF5;
2435+ bool cmdF5, player;
24362436
2437+ //プレイヤーかどうか判定
2438+ if( Player_HumanID == i ){
2439+ player = true;
2440+ }
2441+ else{
2442+ player = false;
2443+ }
2444+
24372445 if( i == cmdF5id ){
24382446 cmdF5 = true;
24392447 }
@@ -2441,7 +2449,7 @@
24412449 cmdF5 = false;
24422450 }
24432451
2444- if( HumanIndex[i].RunFrame(CollD, BlockData, AddCollisionFlag, cmdF5) == 2 ){
2452+ if( HumanIndex[i].RunFrame(CollD, BlockData, AddCollisionFlag, player, cmdF5) == 2 ){
24452453 //死亡時のエフェクト
24462454 DeadEffect(&(HumanIndex[i]));
24472455 }