X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 128 (tree) |
|---|---|
| Time | 2016-04-24 17:00:16 |
| Author | |
マップに血が付着しない条件を追加(仕様改善)、および描画時のバグを修正。
| @@ -100,7 +100,7 @@ | ||
| 100 | 100 | int AddHumanIndex(pointdata data, pointdata infodata); |
| 101 | 101 | int AddWeaponIndex(pointdata data); |
| 102 | 102 | int AddSmallObjectIndex(pointdata data); |
| 103 | - void SetHumanBlood(float x, float y, float z, int damage); | |
| 103 | + void SetHumanBlood(float x, float y, float z, int damage, bool CollideMap); | |
| 104 | 104 | bool CollideHuman(human *in_humanA, human *in_humanB); |
| 105 | 105 | bool CollideBullet(bullet *in_bullet); |
| 106 | 106 | void HitBulletMap(float x, float y, float z); |
| @@ -334,6 +334,7 @@ | ||
| 334 | 334 | virtual void SetRxRy(float rx, float ry); |
| 335 | 335 | virtual int GetTextureID(); |
| 336 | 336 | virtual void GetMove(float *mx, float *my, float *mz); |
| 337 | + virtual bool GetCollideMapFlag(); | |
| 337 | 338 | virtual int RunFrame(float camera_rx, float camera_ry); |
| 338 | 339 | virtual void Render(class D3DGraphics *d3dg); |
| 339 | 340 | }; |
| @@ -363,7 +364,8 @@ | ||
| 363 | 364 | EFFECT_MAGNIFY = 0x08, //!< 拡大 |
| 364 | 365 | EFFECT_ROTATION = 0x10, //!< 回転 |
| 365 | 366 | EFFECT_FALL = 0x20, //!< 落下 |
| 366 | - EFFECT_NOBILLBOARD = 0x40 //!< ビルボード化しない | |
| 367 | + EFFECT_NOBILLBOARD = 0x40, //!< ビルボード化しない | |
| 368 | + EFFECT_COLLIDEMAP = 0x80 //!< マップとのあたり判定 | |
| 367 | 369 | }; |
| 368 | 370 | |
| 369 | 371 | #endif |
| \ No newline at end of file |
| @@ -516,8 +516,8 @@ | ||
| 516 | 516 | vz = data.material[face].vz; |
| 517 | 517 | |
| 518 | 518 | //角度を求める |
| 519 | - rx = atan2(vz, vx) + (float)M_PI; | |
| 520 | - ry = atan2(vy, sqrt(vx*vx + vz*vz)) + (float)M_PI; | |
| 519 | + rx = atan2(vz, vx)*-1 + (float)M_PI; | |
| 520 | + ry = atan2(vy, sqrt(vx*vx + vz*vz))*-1; | |
| 521 | 521 | |
| 522 | 522 | //エフェクト作成 |
| 523 | 523 | for(int i=0; i<MAX_EFFECT; i++){ |
| @@ -538,13 +538,23 @@ | ||
| 538 | 538 | //! @param y Y座標 |
| 539 | 539 | //! @param z Z座標 |
| 540 | 540 | //! @param damage ダメージ |
| 541 | -void ObjectManager::SetHumanBlood(float x, float y, float z, int damage) | |
| 541 | +//! @param CollideMap マップへの付着 | |
| 542 | +void ObjectManager::SetHumanBlood(float x, float y, float z, int damage, bool CollideMap) | |
| 542 | 543 | { |
| 544 | + int addtype; | |
| 545 | + | |
| 546 | + if( CollideMap == false ){ | |
| 547 | + addtype = EFFECT_NORMAL; | |
| 548 | + } | |
| 549 | + else{ | |
| 550 | + addtype = EFFECT_COLLIDEMAP; | |
| 551 | + } | |
| 552 | + | |
| 543 | 553 | if( GameConfig.GetBloodFlag() == true ){ |
| 544 | - AddEffect(x, y, z, 0.0f, 0.0f, 0.0f, 10.0f, DegreeToRadian(10)*GetRand(18), (int)(GAMEFPS * 0.4f), Resource->GetEffectBloodTexture(), EFFECT_DISAPPEAR | EFFECT_MAGNIFY | EFFECT_TRANSLUCENT); | |
| 554 | + AddEffect(x, y, z, 0.0f, 0.0f, 0.0f, 10.0f, DegreeToRadian(10)*GetRand(18), (int)(GAMEFPS * 0.4f), Resource->GetEffectBloodTexture(), EFFECT_DISAPPEAR | EFFECT_MAGNIFY | EFFECT_TRANSLUCENT | addtype); | |
| 545 | 555 | for(int i=0; i<(damage/10); i++){ |
| 546 | 556 | float rx = DegreeToRadian(10)*GetRand(36); |
| 547 | - AddEffect(x + cos(rx)*1.0f, y + (float)(GetRand(20)-10)/10, z + sin(rx)*1.0f, cos(rx)*0.5f, GetRand(5)*0.1f + 0.5f, sin(rx)*0.5f, 5.0f, DegreeToRadian(10)*GetRand(18), (int)(GAMEFPS * 0.5f), Resource->GetEffectBloodTexture(), EFFECT_FALL | EFFECT_TRANSLUCENT); | |
| 557 | + AddEffect(x + cos(rx)*1.0f, y + (float)(GetRand(20)-10)/10, z + sin(rx)*1.0f, cos(rx)*0.5f, GetRand(5)*0.1f + 0.5f, sin(rx)*0.5f, 5.0f, DegreeToRadian(10)*GetRand(18), (int)(GAMEFPS * 0.5f), Resource->GetEffectBloodTexture(), EFFECT_FALL | EFFECT_TRANSLUCENT | addtype); | |
| 548 | 558 | } |
| 549 | 559 | } |
| 550 | 560 | } |
| @@ -855,6 +865,9 @@ | ||
| 855 | 865 | void ObjectManager::HitBulletHuman(int HitHuman_id, int Hit_id, float x, float y, float z, float brx, int attacks, int Shothuman_id) |
| 856 | 866 | { |
| 857 | 867 | int damage = 0; |
| 868 | + int paramid; | |
| 869 | + HumanParameter Paraminfo; | |
| 870 | + bool NotRobot; | |
| 858 | 871 | |
| 859 | 872 | //使用されていないか、死亡していれば処理しない。 |
| 860 | 873 | if( HumanIndex[HitHuman_id].GetEnableFlag() == false ){ return; } |
| @@ -866,11 +879,21 @@ | ||
| 866 | 879 | if( Hit_id == 2 ){ HumanIndex[HitHuman_id].HitBulletLeg(attacks); } |
| 867 | 880 | HumanIndex[HitHuman_id].AddPosOrder(brx, 0.0f, 1.0f); |
| 868 | 881 | |
| 882 | + //ロボットかどうか判定 | |
| 883 | + HumanIndex[HitHuman_id].GetParamData(¶mid, NULL, NULL, NULL); | |
| 884 | + GameParamInfo->GetHuman(paramid, &Paraminfo); | |
| 885 | + if( Paraminfo.type == 1 ){ | |
| 886 | + NotRobot = false; | |
| 887 | + } | |
| 888 | + else{ | |
| 889 | + NotRobot = true; | |
| 890 | + } | |
| 891 | + | |
| 869 | 892 | //エフェクト(血)を表示 |
| 870 | 893 | if( Hit_id == 0 ){ damage = (int)((float)attacks * HUMAN_DAMAGE_HEAD); } |
| 871 | 894 | if( Hit_id == 1 ){ damage = (int)((float)attacks * HUMAN_DAMAGE_UP); } |
| 872 | 895 | if( Hit_id == 2 ){ damage = (int)((float)attacks * HUMAN_DAMAGE_LEG); } |
| 873 | - SetHumanBlood(x, y, z, damage); | |
| 896 | + SetHumanBlood(x, y, z, damage, NotRobot); | |
| 874 | 897 | |
| 875 | 898 | //効果音を再生 |
| 876 | 899 | GameSound->HitHuman(x, y, z); |
| @@ -987,7 +1010,7 @@ | ||
| 987 | 1010 | } |
| 988 | 1011 | |
| 989 | 1012 | //エフェクト(血)を表示 |
| 990 | - SetHumanBlood(hx, hy+15.0f, hz, total_damage); | |
| 1013 | + SetHumanBlood(hx, hy+15.0f, hz, total_damage, false); | |
| 991 | 1014 | |
| 992 | 1015 | //人と手榴弾の距離を算出 |
| 993 | 1016 | x = gx - hx; |
| @@ -1110,6 +1133,7 @@ | ||
| 1110 | 1133 | { |
| 1111 | 1134 | //無効なエフェクトならば処理しない |
| 1112 | 1135 | if( in_effect->GetEnableFlag() == false ){ return false; } |
| 1136 | + if( in_effect->GetCollideMapFlag() == false ){ return false; } | |
| 1113 | 1137 | if( in_effect->GetTextureID() != Resource->GetEffectBloodTexture() ){ return false; } |
| 1114 | 1138 | |
| 1115 | 1139 | //血が出ない設定なら処理しない |
| @@ -2021,15 +2045,28 @@ | ||
| 2021 | 2045 | if( EnemyHuman->GetHP() <= 0 ){ return; } |
| 2022 | 2046 | |
| 2023 | 2047 | float tx, ty, tz; |
| 2048 | + int paramid; | |
| 2049 | + HumanParameter Paraminfo; | |
| 2050 | + bool NotRobot; | |
| 2024 | 2051 | |
| 2025 | 2052 | EnemyHuman->GetPosData(&tx, &ty, &tz, NULL); |
| 2026 | 2053 | ty += VIEW_HEIGHT; |
| 2027 | 2054 | |
| 2055 | + //ロボットかどうか判定 | |
| 2056 | + EnemyHuman->GetParamData(¶mid, NULL, NULL, NULL); | |
| 2057 | + GameParamInfo->GetHuman(paramid, &Paraminfo); | |
| 2058 | + if( Paraminfo.type == 1 ){ | |
| 2059 | + NotRobot = false; | |
| 2060 | + } | |
| 2061 | + else{ | |
| 2062 | + NotRobot = true; | |
| 2063 | + } | |
| 2064 | + | |
| 2028 | 2065 | //ダメージなどを計算 |
| 2029 | 2066 | EnemyHuman->HitZombieAttack(); |
| 2030 | 2067 | |
| 2031 | 2068 | //エフェクト(血)を表示 |
| 2032 | - SetHumanBlood(tx, ty, tz, HUMAN_DAMAGE_ZOMBIEU); | |
| 2069 | + SetHumanBlood(tx, ty, tz, HUMAN_DAMAGE_ZOMBIEU, NotRobot); | |
| 2033 | 2070 | |
| 2034 | 2071 | //効果音を再生 |
| 2035 | 2072 | GameSound->HitHuman(tx, ty, tz); |
| @@ -2600,6 +2600,18 @@ | ||
| 2600 | 2600 | *mz = move_z; |
| 2601 | 2601 | } |
| 2602 | 2602 | |
| 2603 | +//! エフェクトのマップあたり判定フラグ取得 | |
| 2604 | +//! @return 有効:true 無効:false | |
| 2605 | +bool effect::GetCollideMapFlag() | |
| 2606 | +{ | |
| 2607 | + if( type&EFFECT_COLLIDEMAP ){ | |
| 2608 | + return true; | |
| 2609 | + } | |
| 2610 | + //else{ | |
| 2611 | + return false; | |
| 2612 | + //} | |
| 2613 | +} | |
| 2614 | + | |
| 2603 | 2615 | //! @brief 計算を実行(ビルボード化) |
| 2604 | 2616 | //! @param camera_rx カメラの横軸角度 |
| 2605 | 2617 | //! @param camera_ry カメラの縦軸角度 |