ページ 11

敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月27日(水) 19:30
by てら
龍神録を使用してゲームを作成しているんですが、自機と敵が接触しても通り抜けてしまいます。
なので当たり判定を付けたいのですが、どのようにプログラムを書けばいいんでしょうか?
out.cppを見てもあまり理解出来ず、外部のサイトを参考にしても中々実装出来ず困っています。

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月27日(水) 21:09
by Tatu
当たり判定は敵と自機が当たった時、ミスになるというものですか?

プログラムの書き方は

(1)雑魚と自機が当たったかを判定する処理と
ボスと自機が当たったかを判定する処理をつくる。

(2)次にこれらの処理を使って自機と敵の処理をまとめる。
自機、敵ともに衝突可能な状態の時に当たったかを判定し、当たっていたらミスにする。
ミスにするときの処理は敵のショットが自機に当たった時の処理を参考にする。

(3)当たり判定メインに作成した自機と敵の処理を追加する。

という風にすればよいのではないでしょうか。

どこまでわかりますか?

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月27日(水) 22:06
by てら
out.cpp

コード:

//敵と自機ショットが当たったかどうかを判定する
int out_judge_cshot(int i,int s){
    if(cshot[i].cnt>0){//ショットの軌道が1度でも計算されていたら
        if(out_judge(cshot[i].x,cshot[i].y,enemy[s].x,enemy[s].y,
            cshot_range[cshot[i].knd],enemy_range[enemy[s].knd],
            cshot[i].spd,cshot[i].angle)){
                return 1;
        }
    }
    return 0;
}
例えばこのif(out_judge(...の部分ではどのような処理をしてるのでしょうか?
また if(cshot.cnt>0)を敵と接触の場合、どのように変更すればいいのでしょうか?

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月27日(水) 23:33
by Tatu
out_judgeは二つの物体が当たっているかを判定する関数です。
物体1の座標を(x1,y1)、物体1の当たり判定をrange1
物体2の座標を(x2,y2)、物体2の当たり判定をrange2
として二つの物体の距離がrange1+range2よりも小さい時、当たっていると判定しています。

二つの物体の距離は三平方の定理(ピタゴラスの定理)により求められます。

旧ゲームプログラミングの館 s11も参考にしてみてください。
http://dixq.net/g/54.html

ただし、ショットが速い場合、当たっているはずなのにすり抜けることがあります。
そのため、物体1をショットとするときに、速度と角度をそれぞれspd1、angle1として
中間を計算する処理が入っています。

中間の計算ではショットの座標を1フレーム前に戻し、
すこしずつすすめて自機と当たっていないかを調べています。

敵の速度がそんなに大きくならない場合は中間の計算は
なくても問題になりません。

自機と敵の判定をする場合はこれらを物体1、物体2にあてはめ、
対応するパラメータを引数に入れてください。

中間の計算をしない場合はspd1、angle1は0にしてもかまいません。


次に衝突するための条件について
自機は通常状態で無敵ではないときに衝突する。
敵は出現している状態ならば衝突する。
ボスは出現していて、描画されており、ショット中であるときに衝突する。

if(cshot.cnt>0)については
ショットは出現したフレームでは動かないため、計算する必要がないとしているのと
速いショットの場合、一度後ろに戻して計算するため、
ショットの出現時に自機がショットの真後ろにいた場合に当たるのを防ぐためのものです。
そのため、速い敵を出現させない、または敵の出現位置と自機が重なることがあり得ないのであれば
この条件式は必要ありません。

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月28日(木) 00:23
by てら
詳しい解説ありがとうございます。
処理について大体把握出来たのですが、自機の当たり判定の範囲を設定する方法が分かりません。
どのようにすればいいでしょうか?

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月28日(木) 01:50
by Tatu
自機の当たり判定はdefine.hで
#define CRANGE 2.0
と定義しています。

当たり判定のサイズが気に入らないならば数値を変更する。
ショットに対する当たり判定と敵に対する当たり判定で値を変えたいのなら
敵に対する当たり判定を別に用意するという方法が考えられます。

あとでアイテムなどで当たり判定のサイズが変わるようにしたくなった場合は
当たり判定のサイズを変数にする
当たり判定のサイズをいくつかの定数(配列)でもっておいて、状況に応じて使う値を切り替える
基本値と変化を表す変数を組み合わせる
といった方法が使えるでしょう。

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月28日(木) 07:33
by てら

コード:

//敵と自機が当たったかどうかを判定する
int out_judge_enemy(int s){
	if(out_judge(ch.x,ch.y,enemy[s].x,enemy[s].y,
		CRANGE,enemy_range[enemy[s].knd])){
		return 1;
	}
return 0;
}
このように作ってみたのですが、
>error C2660: 'out_judge' : 関数に 6 個の引数を指定できません。
と表示され実行出来ません。

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月28日(木) 08:33
by Tatu
関数を呼び出す時にその関数の定義と引数の数や型が合わない場合、
その関数を利用することはできません。

out_judgeについて
中間の計算をしない場合、spd1,angle1を0にしてもかまいませんが
そのまま省略することはできません。

spd1,angle1の値を入れるのが嫌ならば

別の名前(例えばout_judge2など)で引数が6個(spd1,angle1がない)の
当たり判定用の関数を作る

C++では同じ名前の関数であっても
引数が違えば(型の違いのみであっても)定義が可能です。
これを関数のオーバーロード機能と言います。
この機能を利用し、out_judgeという元と同じ名前で書く

C++の場合、引数のデフォルト値を使う

という方法が考えられます。

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月28日(木) 11:44
by softya(ソフト屋)
今までのお話を見させていただいた限りC言語の知識が不十分に感じられますが、どの様なサイトや書籍でどのぐらいの期間C言語を学習されましたでしょうか?
龍神録のコードを自分の思うように書き換えるためには平行でも構いませんのでC言語は必ず勉強する必要があります。
どの程度の知識か教えて頂ければ、適切なサイトや書籍をご案内します。

Re: 敵と自機の接触に当たり判定を付けたい

Posted: 2012年6月28日(木) 15:50
by てら
なんとか当たり判定を実装する事が出来ました。ありがとうございます。
たしかにC言語は勉強不足なのでもう少し勉強したいと思います。