Re: 弾の当たり判定 ( No.1 ) |
- 名前:SUIMA 日時:2015/12/31 21:04
はじめまして、初心者 Nさん
ソースコードの方を見させていただきました。
コードを見ている中で、気になる点がありましたので、お知らせいたします。
View.cpp
Line 540 〜 Line 580
弾の発射処理
の部分で、コードに強い違和感を覚えました。
Line 552
int Shots_Life[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
フラグとして、変数を利用されているようですが、ローカル変数ですので1フレーム毎に初期化されています。よって、フラグとして期待した結果は、得られていないと思います。
//参考情報
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01068.html
Line 558 ~ 577
for (int j = 0; j < 10; j++){
Player1->PI.ShotModelHandleCoordinate = Player1->PI.PlayerModelHandleCoordinate;//弾の位置を設定
Player1->PI.ShotModelHandleCoordinate.y = Player1->PI.ShotModelHandleCoordinate.y + 5;//弾の位置を調整
Player1->PI.ShotModelHandleCoordinate.z = Player1->PI.ShotModelHandleCoordinate.z - 30;//弾の位置を調整
Player1->PCmr.ShotAngle = Player1->PCmr.HoutouAngle;
if (Shots_Life[j] == 0){//未発射の弾を見つけたら
Shots_Life[j] = 1;//発射済みにして
for (int ia = 1; ia <= 1000; ia++){
Player1->PI.ShotModelHandleCoordinate.x += sin(Player1->PCmr.HoutouAngle.y) * -0.5f;//Houtouの角度を基準として弾が
Player1->PI.ShotModelHandleCoordinate.z += cos(Player1->PCmr.HoutouAngle.y) * -0.5f;//飛んでいく方向を決める
}
Player1->PI.Reload = 10;//リロード時間を元に戻す
Player1->PI.ShotModelHandleCoordinate = Player1->PI.PlayerModelHandleCoordinate;//弾の位置を戻す
Player1->PI.ShotModelHandleCoordinate.y = Player1->PI.ShotModelHandleCoordinate.y + 5;//弾の位置を戻す
Player1->PI.ShotModelHandleCoordinate.z = Player1->PI.ShotModelHandleCoordinate.z - 30;//弾の位置を戻す
Player1->PCmr.ShotAngle = Player1->PCmr.HoutouAngle;
break;//発射する弾は一つでいいので強制終了
}
}
Player1->PI.PlayerModelHandleCoordinateに対し、何度も代入処理を行っており、意図が読めません。もう一度、処理を見なおしてください。
最後に、弾の初期位置を決める処理はありましたが、弾を移動させる処理が存在してい無いように思います。
「弾の速度が速い」と考えてデバック中なのでしょうが、「弾が移動していない」可能性も考慮して、コードを見直してみてはいかがでしょうか?
|
Re: 弾の当たり判定 ( No.2 ) |
- 名前:管理人 日時:2016/01/02 06:21
プログラムを拝見いたしました
現状があまりにも初心者 N さんが意図されているであろう動作から掛け離れているので、
ちょっとご助言しただけで正常な動作にすることは難しいです
> 弾の速度が速いのか当たっていると思うのですがヒット判定が出ません
SUIMAさんも仰られていますが、ヒット判定の前に、まず弾が飛んでいません
現状で弾が何処に表示されているか把握されていますでしょうか?
弾のサイズをこちらの行でスケール0.5fにして小さくしていますが、
MV1SetScale(Player1->PS.ModelHandleShot, VGet(0.5f, 0.5f, 0.5f));
こちらを以下のようにスケール2.5fに変更して
MV1SetScale(Player1->PS.ModelHandleShot, VGet(2.5f, 2.5f, 2.5f));
大きく表示されるようにしてみてください、現在弾が何処にあるかわかるようになります
その上で、まずは弾が飛んでいくようにしてみてください
当たり判定の正常さを考えるのはそれからにしましょう
|
Re: 弾の当たり判定 ( No.3 ) |
- 名前:初心者 N 日時:2016/01/02 09:19
SUIMAさん,管理人さんありがとうございます。
言われてみるとそうですね毎回毎回繰り返されるので弾が飛ばないはずですよね...
弾が早すぎて飛んでいるように見えないのかなとかってに判断していたので飛んで行っていないという判断をしていませんでした。
|
Re: 弾の当たり判定 ( No.4 ) |
- 名前:初心者 N 日時:2016/01/02 10:37
弾を飛んでいるように修正をしましたが、当たり判定が正常にできていないようです(3Dモデルが弾を撃った時に移動すると弾も移動してしまうのは気にしないでください)
リンクはこちらになりますが見てもらってもよろしいでしょう?パスは同じです
ttp://fast-uploader.com/file/7007253824438/
当たり判定は円同士で行っているので、ShotHitFlagとRearHitFlagの値が当たった時に1以上になると思っていたのですが、現状円同士が接触しても0のまま変化なしという状況となっています。
|
Re: 弾の当たり判定 ( No.5 ) |
- 名前:管理人 日時:2016/01/03 23:22
アップしていただいたプログラムを拝見しました
弾が飛んでいくのを確認しました
現在、弾と敵との当たり判定はどこで行っているのでしょうか?
あと、Player1->HF.FrontShotHitPoly は何処にも使われていないようですが、
こちらは使わなくても良いのでしょうか?
|
Re: 弾の当たり判定 ( No.6 ) |
- 名前:初心者 N 日時:2016/01/05 15:00
弾と敵との当たり判定なのですが、まずプログラムに修正などを加えてしまったのでこちらのリンクに上げました お手数をかけます.. パスは同じです
ttp://fast-uploader.com/file/7007528868832/
次に当たり判定はPlayer1->HF.FrontShotHitPoly = MV1CollCheck_Sphere(
Player1->PS.ModelHandleShot, // モデルのハンドル
3, // コリジョンの情報を更新するフレームの番号
Player2->HF.FrontStartPos, // 当たり判定で使用する始点
7.0f // 当たり判定で使用する球半径?
);
Player1->HF.RearShotHitPoly = MV1CollCheck_Sphere(
Player1->PS.ModelHandleShot, // モデルのハンドル
3, // コリジョンの情報を更新するフレームの番号
Player2->HF.RearStartPos, // 当たり判定で使用する始点
7.0f // 当たり判定で使用する球半径?
);
のコードで設定をして確認を
DrawFormatString(0, 225, GetColor(255, 255, 255), "FrontHitFlag = %d RearHitFlag = %d", Player1->HF.FrontShotHitPoly.HitNum, Player1->HF.RearShotHitPoly.HitNum);
ここで当たり判定が出れば1以上の数値が出るはずかなと思っています。
|
Re: 弾の当たり判定 ( No.7 ) |
- 名前:管理人 日時:2016/01/10 02:56
すみません、ご返信が遅くなりました
当たり判定の箇所のご説明ありがとうございます
MV1CollCheck_Sphere に渡す2番目の引数がどちらも 3 になっていますが、
こちらはなぜ 3 にされたのでしょうか?
弾のモデルはフレーム番号 2 までしかないので『存在しないフレーム番号が指定された』
ということでエラーとなり何も処理がされずに関数が終了してしまっていました
よろしければ2番目の引数は -1 にして試してみてください
あと、弾のモデルのコリジョン情報の更新がされていませんでしたので、MV1CollCheck_Sphere を
使用する前に以下の処理を実行するようにしてください
MV1RefreshCollInfo( Player1->PS.ModelHandleShot, -1 );
要約しますと
・フレーム番号を 3 から -1 に変更する
・MV1RefreshCollInfo を使ってコリジョン情報の更新を行う
こちらの二つを行うことで FrontHitFlag = ?? と RearHitFlag = ?? の数値が 1 以上になることを確認できました
よろしければお試しください
|
Re: 弾の当たり判定 ( No.8 ) |
- 名前:初心者 N 日時:2016/01/10 11:34
ありがとうございます。変更した結果上手くいきました。
引数が2までということを確認せずに使っていたのが原因だったということに恥ずかしい思いです。
|
|