ページ 1 / 1
ゲームの当たり判定
Posted: 2011年9月12日(月) 23:43
by いつの間にか中年
これはコードの書き方というよりもゲームの設計?のような話なのですが
この前、このサイトを見ていてゲームを作りたいな~と思ったものですので
昔、懐かしの「スパルタンX」のコピー作品を作ろうとしています(C歴は1か月ですね)
そこで質問なのですが
当たり判定ってありますよね・・・それの矩形か丸、どちらの当たり判定を使おうか迷っていまして
丸だと縦に長い人型の当たり判定を作れないので矩形を使おうとしています
しかし、矩形だと例えばキャラの足だけに当たり判定をつけようとして場合、
必要な情報が多すぎてごちゃごちゃになってしまいます
自分が考えたのはキャラの体と足と腕は別々のオブジェクトにして後で
座標指定してくっつけてやるというやり方です
(これならば縦の大きさ、横の大きさを求めるだけでいいですからね)
皆さんならどのような形の当たり判定をどのように使いますか?
前述したとおりスパルタンXの様なゲームを作ろうとしていて足だけに当たり判定をつけたいです
Re: ゲームの当たり判定
Posted: 2011年9月13日(火) 21:35
by いつの間にか中年
昨日、かきわs
Re: ゲームの当たり判定
Posted: 2011年9月13日(火) 21:40
by softya(ソフト屋)
当たり判定は、体、手、足だけで矩形の当たり判定で十分だと思います。
回転させる必要もなくて、動きに合わせて矩形の当たり判定を発生させたり大きさを変えるだけで良いのでは無いでしょうか?
Re: ゲームの当たり判定
Posted: 2011年9月13日(火) 21:51
by いつの間にか中年
ソフト屋さん、回答ありがとうございます
別々の画像として後からくっつけるというやり方ということですよね
それと回転や大きさを変化させるとはどういうことでしょうか?
スパルタンにそんな動きをする者はなかった気がしますし、
私の文にもそんな言葉を入れた覚えはありませんがどういう意味でしょうか?
(なんか反論してケンカ売ってるみたいに聞こえますけど違いますからね すいません;)
Re: ゲームの当たり判定
Posted: 2011年9月13日(火) 22:06
by softya(ソフト屋)
私の考え方は、絵と当たり判定は別のデータです。
なので、絵で手足をバラバラにする必要はありません。
Re: ゲームの当たり判定
Posted: 2011年9月13日(火) 22:20
by いつの間にか中年
何度もごめんなさい 最後にしますので
矩形の当たり判定でオブジェクト全体を当たり判定にするときはこんな変数を作ります↓
左上の座標x,y 右下の座標x+15,y+15
でも腕だけに又は足だけに当たり判定をつけようと思うと
左上の座標x+3,y+4 右下の座標x+13,y+11
とこんな感じの足し算ばかりになって見にくくなりますが
これは仕様がないことなのでしょうか?
Re: ゲームの当たり判定
Posted: 2011年9月13日(火) 22:59
by softya(ソフト屋)
プログラムで直値を書くのではなく、フーレム毎の矩形の当たり判定を配列でもった方がシンプルになると思います。
Re: ゲームの当たり判定
Posted: 2011年9月14日(水) 19:18
by いつの間にか中年
またまたすみません
当たり判定を配列でもつというのはどういうことでしょうか?
物わかりが悪いのは自覚しております
Re: ゲームの当たり判定
Posted: 2011年9月14日(水) 19:33
by softya(ソフト屋)
コンパイルして検証してませんので、間違っているかも知れません。
データの定義です。
コード:
// 当たり判定構造体
typedef struct {
int ofs_x,ofs_y; //相対位置
int size_x,size_y; //サイズ
} CollisionData_t;
// 当たりフレーム構造体
typedef struct {
int frame; //発生フレーム。次のフレームが出るまではこの当たりが継続する。
int num; //当たり数
CollisionData_t data[3]; //当たりは1フレームあたり最大3つまで。
} CollisionFrame_t;
// 当たりデータ。アニメフレームで変化。
CollisionFrame_t CollisionFrame[] = {
{0, 1, { {0,0,12,32} } }, //0~14フレーム目、当たり判定は1つの矩形
{15,2, { {0,0,12,32},{-5,-5,9,8} }},//15フレーム目、当たり判定は2つの矩形
};
使う時は
左上の座標x+CollisionFrame[fno].data[no].ofs_x,y+CollisionFrame[fno].data[no].ofs_y
右下の座標x+CollisionFrame[fno].data[no].ofs_x+CollisionFrame[fno].data[no].size_x,y+CollisionFrame[fno].data[no].ofs_y+CollisionFrame[fno].data[no].size_y
となります。
あくまで例ですので、これ以外にも方法は沢山あります。
Re: ゲームの当たり判定
Posted: 2011年9月14日(水) 20:15
by いつの間にか中年
私はまだまだプログラムに慣れていないひよっこですので間違っているかもしれないですが
当たり数という変数はいるのでしょうか?どこで使うのですか?
Re: ゲームの当たり判定
Posted: 2011年9月14日(水) 20:35
by softya(ソフト屋)
当たり数と言うか当たり判定の数ですから、CollisionData_t data[3];の何個が有効なのかわ表す数値です。
このフレーム当たり判定数と言ったほうが良いでしょうか。
Re: ゲームの当たり判定
Posted: 2011年9月14日(水) 22:11
by いつの間にか中年
また疑問が湧いたので
当たり数はdateが何個有効か表すとおっしゃいましたが
dateの記述数を変えればいいのでは?2コ必要なときは3個目を書かないでおけばいいのでは?
すいません
Re: ゲームの当たり判定
Posted: 2011年9月14日(水) 22:41
by softya(ソフト屋)
C言語では構造体に含まれる配列dataの個数は固定せねばなりません。他の言語では可変個数にすることも出来ますがC言語は簡単ではありません。
C言語でdataの部分を可変個数にするにはポインタリストとか面倒なことが必要で初心者向けじゃありませんし、シンプルに初期化することも出来ません。
なので、最大の個数を固定値として選択しました。
固定する以上は有効個数を書くのは自然な成り行きだと思います。
個数を見なくてもsize_x,size_yが0で不要なデータと判定する方法もあります(初期値がない部分は0に初期化されますので)。
ただ、こちらの方が処理は少し面倒な処理になります。