X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 157 (tree) |
|---|---|
| Time | 2017-01-08 18:46:49 |
| Author | |
humanクラスからモーション再生部分の分離を試みる(未完成)
| @@ -168,8 +168,6 @@ | ||
| 168 | 168 | EnableFlag = flag; |
| 169 | 169 | rotation_y = 0.0f; |
| 170 | 170 | armrotation_y = 0.0f; |
| 171 | - reaction_y = 0.0f; | |
| 172 | - legrotation_x = 0.0f; | |
| 173 | 171 | point_dataid = dataid; |
| 174 | 172 | point_p4 = p4; |
| 175 | 173 | teamid = team; |
| @@ -189,17 +187,6 @@ | ||
| 189 | 187 | #endif |
| 190 | 188 | add_ry = 0.0f; |
| 191 | 189 | 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 | - } | |
| 203 | 190 | |
| 204 | 191 | move_rx = 0.0f; |
| 205 | 192 | MoveFlag = 0x00; |
| @@ -206,17 +193,28 @@ | ||
| 206 | 193 | MoveFlag_lt = MoveFlag; |
| 207 | 194 | scopemode = 0; |
| 208 | 195 | HitFlag = false; |
| 209 | - walkcnt = 0; | |
| 210 | - runcnt = 0; | |
| 211 | 196 | totalmove = 0.0f; |
| 212 | 197 | StateGunsightErrorRange = 0; |
| 213 | 198 | ReactionGunsightErrorRange = 0; |
| 199 | + | |
| 200 | + MotionCtrl = new HumanMotionControl; | |
| 214 | 201 | } |
| 215 | 202 | |
| 216 | 203 | //! @brief ディストラクタ |
| 217 | 204 | human::~human() |
| 218 | -{} | |
| 205 | +{ | |
| 206 | + delete MotionCtrl; | |
| 207 | +} | |
| 219 | 208 | |
| 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 | + | |
| 220 | 218 | //! @brief 設定値を設定 |
| 221 | 219 | //! @param id_param 人の種類番号 |
| 222 | 220 | //! @param dataid ポイントのデータ番号 |
| @@ -240,8 +238,6 @@ | ||
| 240 | 238 | move_y_flag = false; |
| 241 | 239 | rotation_y = 0.0f; |
| 242 | 240 | armrotation_y = DegreeToRadian(-30); |
| 243 | - reaction_y = 0.0f; | |
| 244 | - legrotation_x = rotation_x; | |
| 245 | 241 | |
| 246 | 242 | for(int i=0; i<TOTAL_HAVEWEAPON; i++){ |
| 247 | 243 | weapon[i] = NULL; |
| @@ -263,6 +259,8 @@ | ||
| 263 | 259 | HitFlag = false; |
| 264 | 260 | totalmove = 0.0f; |
| 265 | 261 | Invincible = false; |
| 262 | + | |
| 263 | + MotionCtrl->Init(rotation_x); | |
| 266 | 264 | } |
| 267 | 265 | } |
| 268 | 266 |
| @@ -356,17 +354,7 @@ | ||
| 356 | 354 | //! @param runmodel[] 腕のモデルの配列(配列数:TOTAL_RUNMODE) |
| 357 | 355 | void human::SetModel(int upmodel, int armmodel[], int legmodel, int walkmodel[], int runmodel[]) |
| 358 | 356 | { |
| 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); | |
| 370 | 358 | } |
| 371 | 359 | |
| 372 | 360 | //! @brief 武器を設定 |
| @@ -410,7 +398,11 @@ | ||
| 410 | 398 | weapon[selectweapon] = in_weapon; |
| 411 | 399 | |
| 412 | 400 | //腕の角度(反動)を設定 |
| 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); | |
| 414 | 406 | |
| 415 | 407 | //切り替え完了のカウント |
| 416 | 408 | selectweaponcnt = 10; |
| @@ -456,8 +448,19 @@ | ||
| 456 | 448 | //スコープ表示を解除 |
| 457 | 449 | SetDisableScope(); |
| 458 | 450 | |
| 451 | + //現在装備する武器のクラスを取得 | |
| 452 | + class weapon *nowweapon; | |
| 453 | + nowweapon = weapon[selectweapon]; | |
| 454 | + | |
| 459 | 455 | //腕の角度(反動)を設定 |
| 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 | + } | |
| 461 | 464 | |
| 462 | 465 | //切り替え完了のカウント |
| 463 | 466 | selectweaponcnt = 10; |
| @@ -565,12 +568,7 @@ | ||
| 565 | 568 | } |
| 566 | 569 | |
| 567 | 570 | //腕に反動を伝える |
| 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); | |
| 574 | 572 | |
| 575 | 573 | //武器が無くなっていれば、装備から外した扱いに。 (手榴弾用) |
| 576 | 574 | if( weapon[selectweapon]->GetEnableFlag() == false ){ |
| @@ -597,6 +595,14 @@ | ||
| 597 | 595 | |
| 598 | 596 | //スコープモードを解除 |
| 599 | 597 | 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 | + | |
| 600 | 606 | return true; |
| 601 | 607 | } |
| 602 | 608 | return false; |
| @@ -622,6 +628,9 @@ | ||
| 622 | 628 | //スコープモードを解除 |
| 623 | 629 | SetDisableScope(); |
| 624 | 630 | |
| 631 | + //モーション実行 | |
| 632 | + MotionCtrl->DumpWeapon(); | |
| 633 | + | |
| 625 | 634 | return true; |
| 626 | 635 | } |
| 627 | 636 |
| @@ -652,6 +661,10 @@ | ||
| 652 | 661 | |
| 653 | 662 | //設定を適用 |
| 654 | 663 | weapon[selectweapon]->SetParamData(ChangeWeapon, lnbs, nbs, false); |
| 664 | + | |
| 665 | + //モーション実行 | |
| 666 | + MotionCtrl->ChangeShotMode(ChangeWeapon); | |
| 667 | + | |
| 655 | 668 | return 0; |
| 656 | 669 | } |
| 657 | 670 |
| @@ -792,6 +805,9 @@ | ||
| 792 | 805 | if( move_y_flag == false ){ |
| 793 | 806 | if( move_y == 0.0f ){ |
| 794 | 807 | move_y = HUMAN_JUMP_SPEED; |
| 808 | + | |
| 809 | + //モーション実行 | |
| 810 | + MotionCtrl->Jump(); | |
| 795 | 811 | return 0; |
| 796 | 812 | } |
| 797 | 813 | } |
| @@ -1203,61 +1219,41 @@ | ||
| 1203 | 1219 | if( GetFlag(MoveFlag, MOVEFLAG_WALK) ){ |
| 1204 | 1220 | move_rx = DegreeToRadian(0); |
| 1205 | 1221 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSWALK_ACCELERATION); |
| 1206 | - walkcnt += 1; | |
| 1207 | - runcnt = 0; | |
| 1208 | 1222 | } |
| 1209 | 1223 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_FORWARD ){ |
| 1210 | 1224 | move_rx = DegreeToRadian(0); |
| 1211 | 1225 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSRUN_ACCELERATION); |
| 1212 | - walkcnt = 0; | |
| 1213 | - runcnt += 1; | |
| 1214 | 1226 | } |
| 1215 | 1227 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_BACK ){ |
| 1216 | 1228 | move_rx = DegreeToRadian(180); |
| 1217 | 1229 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_REGRESSRUN_ACCELERATION); |
| 1218 | - walkcnt = 0; | |
| 1219 | - runcnt += 1; | |
| 1220 | 1230 | } |
| 1221 | 1231 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_LEFT ){ |
| 1222 | 1232 | move_rx = DegreeToRadian(90); |
| 1223 | 1233 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_SIDEWAYSRUN_ACCELERATION); |
| 1224 | - walkcnt = 0; | |
| 1225 | - runcnt += 1; | |
| 1226 | 1234 | } |
| 1227 | 1235 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == MOVEFLAG_RIGHT ){ |
| 1228 | 1236 | move_rx = DegreeToRadian(-90); |
| 1229 | 1237 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_SIDEWAYSRUN_ACCELERATION); |
| 1230 | - walkcnt = 0; | |
| 1231 | - runcnt += 1; | |
| 1232 | 1238 | } |
| 1233 | 1239 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_FORWARD | MOVEFLAG_LEFT) ){ |
| 1234 | 1240 | move_rx = DegreeToRadian(45); |
| 1235 | 1241 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSRUN_SIDEWAYSRUN_ACCELERATION); |
| 1236 | - walkcnt = 0; | |
| 1237 | - runcnt += 1; | |
| 1238 | 1242 | } |
| 1239 | 1243 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_BACK | MOVEFLAG_LEFT) ){ |
| 1240 | 1244 | move_rx = DegreeToRadian(135); |
| 1241 | 1245 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_REGRESSRUN_SIDEWAYSRUN_ACCELERATION); |
| 1242 | - walkcnt = 0; | |
| 1243 | - runcnt += 1; | |
| 1244 | 1246 | } |
| 1245 | 1247 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_BACK | MOVEFLAG_RIGHT) ){ |
| 1246 | 1248 | move_rx = DegreeToRadian(-135); |
| 1247 | 1249 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_REGRESSRUN_SIDEWAYSRUN_ACCELERATION); |
| 1248 | - walkcnt = 0; | |
| 1249 | - runcnt += 1; | |
| 1250 | 1250 | } |
| 1251 | 1251 | else if( GetFlag(MoveFlag, (MOVEFLAG_FORWARD | MOVEFLAG_BACK | MOVEFLAG_LEFT | MOVEFLAG_RIGHT)) == (MOVEFLAG_FORWARD | MOVEFLAG_RIGHT) ){ |
| 1252 | 1252 | move_rx = DegreeToRadian(-45); |
| 1253 | 1253 | AddPosOrder(rotation_x*-1 + move_rx + (float)M_PI/2, 0.0f, HUMAN_PROGRESSRUN_SIDEWAYSRUN_ACCELERATION); |
| 1254 | - walkcnt = 0; | |
| 1255 | - runcnt += 1; | |
| 1256 | 1254 | } |
| 1257 | 1255 | else{ |
| 1258 | 1256 | move_rx = 0.0f; |
| 1259 | - walkcnt = 0; | |
| 1260 | - runcnt = 0; | |
| 1261 | 1257 | } |
| 1262 | 1258 | |
| 1263 | 1259 | //フラグをバックアップ |
| @@ -1534,9 +1530,10 @@ | ||
| 1534 | 1530 | //! @param CollD Collisionのポインタ |
| 1535 | 1531 | //! @param inblockdata BlockDataInterfaceのポインタ |
| 1536 | 1532 | //! @param AddCollisionFlag 追加の当たり判定フラグ |
| 1533 | +//! @param player 対象の人物がプレイヤーかどうか | |
| 1537 | 1534 | //! @param F5mode 上昇機能(F5裏技)のフラグ (有効:true 無効:false) |
| 1538 | 1535 | //! @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) | |
| 1540 | 1537 | { |
| 1541 | 1538 | if( CollD == NULL ){ return 0; } |
| 1542 | 1539 | if( EnableFlag == false ){ return 0; } |
| @@ -1551,6 +1548,7 @@ | ||
| 1551 | 1548 | } |
| 1552 | 1549 | #endif |
| 1553 | 1550 | |
| 1551 | + int WeaponReloadCnt; | |
| 1554 | 1552 | float FallDistance; |
| 1555 | 1553 | float nowmove_x, nowmove_z; |
| 1556 | 1554 | int CheckDead; |
| @@ -1560,42 +1558,12 @@ | ||
| 1560 | 1558 | selectweaponcnt -= 1; |
| 1561 | 1559 | } |
| 1562 | 1560 | |
| 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 | + //リロードカウント取得 | |
| 1574 | 1562 | if( weapon[selectweapon] != NULL ){ |
| 1575 | - if( weapon[selectweapon]->GetReloadCnt() > 0 ){ | |
| 1576 | - reaction_y = ARMRAD_RELOADWEAPON; | |
| 1577 | - } | |
| 1563 | + WeaponReloadCnt = weapon[selectweapon]->GetReloadCnt(); | |
| 1578 | 1564 | } |
| 1579 | - | |
| 1580 | - //足の角度を算出 | |
| 1581 | - if( hp <= 0 ){ | |
| 1582 | - legrotation_x = rotation_x; | |
| 1583 | - } | |
| 1584 | 1565 | 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; | |
| 1599 | 1567 | } |
| 1600 | 1568 | |
| 1601 | 1569 | //照準の状態誤差の処理 |
| @@ -1604,43 +1572,61 @@ | ||
| 1604 | 1572 | //死亡判定と倒れる処理 |
| 1605 | 1573 | CheckDead = CheckAndProcessDead(CollD); |
| 1606 | 1574 | if( CheckDead == 3 ){ return 2; } |
| 1607 | - if( CheckDead != 0 ){ return 3; } | |
| 1608 | 1575 | |
| 1609 | - //進行方向と速度を決定 | |
| 1610 | - ControlProcess(); | |
| 1576 | + if( CheckDead == 0 ){ | |
| 1577 | + //進行方向と速度を決定 | |
| 1578 | + ControlProcess(); | |
| 1611 | 1579 | |
| 1612 | - //マップとの当たり判定 | |
| 1613 | - MapCollisionDetection(CollD, inblockdata, AddCollisionFlag, &FallDistance, &nowmove_x, &nowmove_z); | |
| 1580 | + //マップとの当たり判定 | |
| 1581 | + MapCollisionDetection(CollD, inblockdata, AddCollisionFlag, &FallDistance, &nowmove_x, &nowmove_z); | |
| 1614 | 1582 | |
| 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 | + } | |
| 1618 | 1611 | } |
| 1619 | 1612 | |
| 1620 | - //座標移動 | |
| 1621 | - pos_x += nowmove_x; | |
| 1622 | - pos_z += nowmove_z; | |
| 1623 | 1613 | |
| 1624 | - //移動量を減衰 | |
| 1625 | - move_x *= HUMAN_ATTENUATION; | |
| 1626 | - move_z *= HUMAN_ATTENUATION; | |
| 1614 | + //現在装備する武器のクラスを取得 | |
| 1615 | + class weapon *nowweapon; | |
| 1616 | + int weapon_paramid; | |
| 1617 | + nowweapon = weapon[selectweapon]; | |
| 1627 | 1618 | |
| 1628 | - //F5を使用していなければ、計算結果を反映 | |
| 1629 | - if( F5mode == false ){ | |
| 1630 | - pos_y += FallDistance; | |
| 1619 | + if( nowweapon == NULL ){ //手ぶら | |
| 1620 | + weapon_paramid = ID_WEAPON_NONE; | |
| 1631 | 1621 | } |
| 1632 | - else{ | |
| 1633 | - move_y = 0.0f; | |
| 1634 | - pos_y += 5.0f; //使用していれば、強制的に上昇 | |
| 1622 | + else{ //何か武器を持っている | |
| 1623 | + nowweapon->GetParamData(&weapon_paramid, NULL, NULL); | |
| 1635 | 1624 | } |
| 1636 | 1625 | |
| 1626 | + //モーション計算 | |
| 1627 | + MotionCtrl->RunFrame(rotation_x, armrotation_y, weapon_paramid, WeaponReloadCnt, MoveFlag_lt, hp, player); | |
| 1637 | 1628 | |
| 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; } | |
| 1644 | 1630 | return 1; |
| 1645 | 1631 | } |
| 1646 | 1632 |
| @@ -1659,43 +1645,32 @@ | ||
| 1659 | 1645 | //! @todo 死体の部位の高さ(Y軸)がおかしい |
| 1660 | 1646 | void human::Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArm, bool player) |
| 1661 | 1647 | { |
| 1648 | + //未使用引数対策 | |
| 1649 | + UNREFERENCED_PARAMETER(player); | |
| 1650 | + | |
| 1662 | 1651 | //正しく初期化されていなければ、処理しない |
| 1663 | 1652 | if( d3dg == NULL ){ return; } |
| 1664 | 1653 | if( EnableFlag == false ){ return; } |
| 1665 | 1654 | |
| 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); | |
| 1669 | 1659 | |
| 1670 | 1660 | if( DrawArm == false ){ |
| 1671 | - int legmodelid; | |
| 1672 | - | |
| 1673 | 1661 | //上半身を描画 |
| 1674 | 1662 | 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); | |
| 1676 | 1664 | |
| 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 | - | |
| 1694 | 1665 | //足を描画 |
| 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); | |
| 1697 | 1668 | } |
| 1698 | 1669 | |
| 1670 | + //現在装備する武器のクラスを取得 | |
| 1671 | + class weapon *nowweapon; | |
| 1672 | + nowweapon = weapon[selectweapon]; | |
| 1673 | + | |
| 1699 | 1674 | //腕を描画 |
| 1700 | 1675 | if( rotation_y != 0.0f ){ //死亡して倒れている or 倒れ始めた |
| 1701 | 1676 | float x = pos_x + cos(rotation_x*-1 - (float)M_PI/2)*sin(rotation_y)*16.0f; |
| @@ -1702,50 +1677,27 @@ | ||
| 1702 | 1677 | float y = pos_y + cos(rotation_y)*16.0f; |
| 1703 | 1678 | float z = pos_z + sin(rotation_x*-1 - (float)M_PI/2)*sin(rotation_y)*16.0f; |
| 1704 | 1679 | 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); | |
| 1706 | 1681 | } |
| 1707 | 1682 | 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); | |
| 1717 | 1685 | } |
| 1718 | 1686 | else{ //何か武器を持っている |
| 1719 | 1687 | //武器のモデルとテクスチャを取得 |
| 1720 | 1688 | int id_param; |
| 1721 | - int armmodelid = 0; | |
| 1722 | 1689 | WeaponParameter paramdata; |
| 1723 | 1690 | int model, texture; |
| 1724 | - float ry = 0.0f; | |
| 1725 | 1691 | nowweapon->GetParamData(&id_param, NULL, NULL); |
| 1726 | 1692 | Param->GetWeapon(id_param, ¶mdata); |
| 1727 | 1693 | Resource->GetWeaponModelTexture(id_param, &model, &texture); |
| 1728 | 1694 | |
| 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 | - | |
| 1743 | 1695 | //腕を描画 |
| 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); | |
| 1746 | 1698 | |
| 1747 | 1699 | //武器を描画 |
| 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); | |
| 1749 | 1701 | d3dg->RenderModel(model, texture); |
| 1750 | 1702 | } |
| 1751 | 1703 | } |
| @@ -2759,4 +2711,296 @@ | ||
| 2759 | 2711 | //描画 |
| 2760 | 2712 | d3dg->SetWorldTransformEffect(pos_x, pos_y, pos_z, rotation_x, rotation_y, rotation_texture, model_size); |
| 2761 | 2713 | 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, ¶mdata); | |
| 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; | |
| 2762 | 3006 | } |
| \ No newline at end of file |
| @@ -129,10 +129,8 @@ | ||
| 129 | 129 | float move_y; //!< Y軸(落下)速度 |
| 130 | 130 | float move_z; //!< Z軸速度 |
| 131 | 131 | bool move_y_flag; //!< Y軸移動フラグ |
| 132 | - float rotation_y; //!< 全体の回転角度 | |
| 132 | + float rotation_y; //!< 全体の回転角度 | |
| 133 | 133 | float armrotation_y; //!< 腕の回転角度 |
| 134 | - float reaction_y; //!< 腕を上げ下げする角度 | |
| 135 | - float legrotation_x; //!< 足の回転角度 | |
| 136 | 134 | float upmodel_size; //!< 上半身描画サイズ |
| 137 | 135 | float armmodel_size; //!< 腕描画サイズ |
| 138 | 136 | float legmodel_size; //!< 足描画サイズ |
| @@ -141,26 +139,21 @@ | ||
| 141 | 139 | int selectweaponcnt; //!< 武器の切り替えカウント |
| 142 | 140 | int hp; //!< 体力 |
| 143 | 141 | #ifdef HUMAN_DEADBODY_COLLISION |
| 144 | - int deadstate; //!< 死体になっているか | |
| 142 | + int deadstate; //!< 死体になっているか | |
| 145 | 143 | #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; //!< 合計移動量 | |
| 160 | 151 | int StateGunsightErrorRange; //!< 照準の状態誤差 |
| 161 | 152 | int ReactionGunsightErrorRange; //!< 照準の反動誤差 |
| 162 | - bool Invincible; //!< 無敵フラグ | |
| 153 | + bool Invincible; //!< 無敵フラグ | |
| 163 | 154 | |
| 155 | + class HumanMotionControl *MotionCtrl; //!< モーションを制御するクラスへのポインタ | |
| 156 | + | |
| 164 | 157 | void GunsightErrorRange(); |
| 165 | 158 | int CheckAndProcessDead(class Collision *CollD); |
| 166 | 159 | void ControlProcess(); |
| @@ -169,6 +162,7 @@ | ||
| 169 | 162 | public: |
| 170 | 163 | 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); |
| 171 | 164 | ~human(); |
| 165 | + virtual void SetParameterInfoClass(class ParameterInfo *in_Param); | |
| 172 | 166 | virtual void SetParamData(int id_param, int dataid, signed char p4, int team, bool init); |
| 173 | 167 | virtual void GetParamData(int *id_param, int *dataid, signed char *p4, int *team); |
| 174 | 168 | virtual void GetMovePos(float *x, float *y, float *z); |
| @@ -212,7 +206,7 @@ | ||
| 212 | 206 | virtual void SetHitFlag(); |
| 213 | 207 | virtual bool CheckHit(); |
| 214 | 208 | 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); | |
| 216 | 210 | virtual int GetGunsightErrorRange(); |
| 217 | 211 | virtual void Render(class D3DGraphics *d3dg, class ResourceManager *Resource, bool DrawArm, bool player); |
| 218 | 212 | }; |
| @@ -345,6 +339,42 @@ | ||
| 345 | 339 | virtual void Render(class D3DGraphics *d3dg); |
| 346 | 340 | }; |
| 347 | 341 | |
| 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 | + | |
| 348 | 378 | //! 人の足の状態を示す定数 |
| 349 | 379 | enum Human_LegState { |
| 350 | 380 | LEG_STOP = 0, |
| @@ -2432,8 +2432,16 @@ | ||
| 2432 | 2432 | |
| 2433 | 2433 | //人オブジェクトの処理 |
| 2434 | 2434 | for(int i=0; i<MAX_HUMAN; i++){ |
| 2435 | - bool cmdF5; | |
| 2435 | + bool cmdF5, player; | |
| 2436 | 2436 | |
| 2437 | + //プレイヤーかどうか判定 | |
| 2438 | + if( Player_HumanID == i ){ | |
| 2439 | + player = true; | |
| 2440 | + } | |
| 2441 | + else{ | |
| 2442 | + player = false; | |
| 2443 | + } | |
| 2444 | + | |
| 2437 | 2445 | if( i == cmdF5id ){ |
| 2438 | 2446 | cmdF5 = true; |
| 2439 | 2447 | } |
| @@ -2441,7 +2449,7 @@ | ||
| 2441 | 2449 | cmdF5 = false; |
| 2442 | 2450 | } |
| 2443 | 2451 | |
| 2444 | - if( HumanIndex[i].RunFrame(CollD, BlockData, AddCollisionFlag, cmdF5) == 2 ){ | |
| 2452 | + if( HumanIndex[i].RunFrame(CollD, BlockData, AddCollisionFlag, player, cmdF5) == 2 ){ | |
| 2445 | 2453 | //死亡時のエフェクト |
| 2446 | 2454 | DeadEffect(&(HumanIndex[i])); |
| 2447 | 2455 | } |