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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
てら

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

#1

投稿記事 by てら » 13年前

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

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

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

#2

投稿記事 by Tatu » 13年前

当たり判定は敵と自機が当たった時、ミスになるというものですか?

プログラムの書き方は

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

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

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

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

どこまでわかりますか?

てら

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

#3

投稿記事 by てら » 13年前

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)を敵と接触の場合、どのように変更すればいいのでしょうか?

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

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

#4

投稿記事 by Tatu » 13年前

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: 敵と自機の接触に当たり判定を付けたい

#5

投稿記事 by てら » 13年前

詳しい解説ありがとうございます。
処理について大体把握出来たのですが、自機の当たり判定の範囲を設定する方法が分かりません。
どのようにすればいいでしょうか?

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

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

#6

投稿記事 by Tatu » 13年前

自機の当たり判定はdefine.hで
#define CRANGE 2.0
と定義しています。

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

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

てら

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

#7

投稿記事 by てら » 13年前

コード:

//敵と自機が当たったかどうかを判定する
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 個の引数を指定できません。
と表示され実行出来ません。

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

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

#8

投稿記事 by Tatu » 13年前

関数を呼び出す時にその関数の定義と引数の数や型が合わない場合、
その関数を利用することはできません。

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

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

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

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#9

投稿記事 by softya(ソフト屋) » 13年前

今までのお話を見させていただいた限りC言語の知識が不十分に感じられますが、どの様なサイトや書籍でどのぐらいの期間C言語を学習されましたでしょうか?
龍神録のコードを自分の思うように書き換えるためには平行でも構いませんのでC言語は必ず勉強する必要があります。
どの程度の知識か教えて頂ければ、適切なサイトや書籍をご案内します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てら

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

#10

投稿記事 by てら » 13年前

なんとか当たり判定を実装する事が出来ました。ありがとうございます。
たしかにC言語は勉強不足なのでもう少し勉強したいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る