ページ 11

横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 21:14
by ptolemy
前回のジャンプ範囲の書き方の質問をさせていただきようやくジャンプができるようになりました。

しかし、敵と当たったらプレイヤーが消え、敵をマリオみたいに踏んだ場合は、敵が消えるというプログラムがどうしても書けません。

一応、敵のx座標とプレイヤーのx座標が同じになると敵を消滅すると書いてみました。
(プレイヤーのy座標は、200です。)

コード:

if(player_x==teki1_x&&player_y==200){
 DeleteGraph(player);
}
と書いてみたところ消えたには消えましたが、重ならないと消えません。


また、踏んだ場合のプログラムは、さっぱり分かりません。

どうか
・敵と接触したらプレイヤーが消える
プログラムと
・敵を踏んだ場合は、敵が消える
というプログラムについて教えてください。

また、まだ未完成ですが、作っているものを添付します。
絵心がなく絵が下手です。

とても困っているので宜しくお願いします。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 21:19
by みけCAT
「接触したら」は、「プレイヤーと敵のx座標の差の絶対値が閾値以下 かつ プレイヤーと敵のy座標の差の絶対値が閾値以下」
「踏んだ場合」は、「接触した かつ プレイヤーの速度の鉛直成分が下向き」
というのが基本です。
「踏んだ場合」は、「プレイヤーが敵よりある程度上にいる」という判定もあるとさらに良くなると思います。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 21:21
by みけCAT
ところで、プレイヤーを消すのはDeleteGraphで本当にいいのですか?
あ、きっとDXライブラリは使っていないから大丈夫なんですよね。(添付ファイルは見ていません)

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 21:27
by softya(ソフト屋)
座標だけで判定するとこうなります。
つまり、完全に重ならないと当たりと見做されない訳です。そう組んでいるわけですからね。

なので、当たりの範囲と言う考えを採用します。これには自分の四角形と敵の四角形が重なっているかと言うのを調べます。
中学生でも分かる程度の難しい数学ではないので、よく考えれば分かります。
「当たり判定」
http://www.interq.or.jp/moonstone/person/del/atari.htm

それと当たり範囲は画像より小さ目で調整すことが多いです。余白の部分まで当たって欲しく無いですからね。

DeleteGraph(player);はマズイので、必ず存在フラグを持つようにしてください。

踏んだらの件は、これらが出来てからのほうが良さそうです。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 23:23
by ptolemy
すいません。
投稿時使用していたブラウザーでは、返信のリンクが表示されなかったというのと無線ルーターの調子が悪くつながらなかったので遅れました。

みけCATさん
速い返信ありがとうございます。
DXライブラリを使っております。
初歩的な質問ですが、
"いきち"というものは、何ですか。


softya(ソフト屋)さん

返信ありがとうございます。

リンクサイトの
//四角領域どうしの判定
の四角を作るプログラムを使い、
キャラクター画像の上に四角があるような感じにすればいいんですよね?

また、四角同士がくっついたかどうかを判定するやり方がいまいち分かりません。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 23:28
by softya(ソフト屋)
>この四角を作るプログラムを使い、キャラクター画像の上に四角があるような感じにすればいいんですよね?

表示する四角を作るんじゃないですよ。表示しない仮想的な四角があると仮定して2つの四角が部分的に重なり合っているか判定する仕組みです。

>また、四角同士がくっついたかどうかを判定するやり方がいまいち分かりません。

これの考え方そのものです。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月09日(土) 23:31
by みけCAT
ptolemy さんが書きました:"いきち"というものは、何ですか。
[search=google]閾値[/search]
この場合、「この距離以下に近づいたら当たったとみなす」という距離のことです。
例えば、x方向についてプレイヤーのサイズが32、敵のサイズが64だったら、(32/2+64/2)すなわち48がいいでしょう。
y方向についても同様です。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 00:52
by ptolemy
softya(ソフト屋)さん

コード:

fanction AriaAriaHit01(X1,Y2,W1,H1,X2,Y2,W2,H2:integer):Boolean;
begin

Result:=false;
if(X2<=X1+W1)and
  (X1<=X2+W2)and
  (Y2<=Y1+H1)and
  (Y1<=Y2+H2)then Result:=true;
end

int X1=○,X2=○,Y1=○,Y2=○,W1=○,W2=○,H1=○,H2=○;

//プレイヤーと同じ動きをする。プログラム 
~

if(△△){
//プレイヤーを消す
}
一応作ってみました。
こんな感じで△の場所の敵とプレイヤーの四角系が接触していることを
どう表せばいいんですかね?


みけCATさん
具体例ありがとうございます。
 
明日、書いて試してみます。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 00:58
by softya(ソフト屋)
元の言語はC言語ではないので、そのままは導入できません。考え方を吸収してC言語に置き換えないと行きません。
理解していれば、このような書き方にはならないはずです。

X1,X2などの意味や式を理解されていないのでは無いでしょうか?
そこのわからない所を質問して下さい。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 11:38
by ptolemy
すいません。

リンクサイトがC言語かと勘違いしました。

コード:

int X1=○,Y1=○,W1=○,H1=○;
int X2=○,Y2=○,W2=○,H2=○;

X2<=X1+W1;
X1<=X2+W2;
Y2<=Y1+H1;
Y1<=X2+H2;

//プレイヤーと同じ動作するプログラム↓
[        ]

if(△){
//プレイヤーを消す
}
でいいんですかね?

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 18:25
by softya(ソフト屋)
申し訳ないですがプログラムとして成立していません。
if文自体をよく分かってないみたいですが、C言語をどのぐらい理解されていますか?

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 18:50
by ptolemy
http://9cguide.appspot.com/index.html
こちらのサイトで一通り読んだくらいしか勉強は、していません。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 19:04
by softya(ソフト屋)
例えば、X2<=X1+W1;この式は条件式ですがif文で使うか結果を代入しない限り意味がありません。
なのでC言語の理解度も不十分だと思うのですが、そもそもの「四角領域どうしの判定」の仕組みそのものを理解されていると思えないわけです。

他に気になることは、敵の移動、プレーヤーとの衝突判定、プレヤーの移動、敵との衝突判定などなどの流れそのものが出来ていないと思われます。
X2<=X1+W1;が「プレイヤーと同じ動作するプログラム↓」の前にある意味は説明できますでしょうか。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 19:40
by ptolemy
X2<=X1+W1
は、仮空の四角の場所を表すプログラムの定義で間違いないですか?

しかし、X2<=X1+W1などの意味が分からないです。



プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?

//プレイヤーと同じ動きをするプログラム↓
のような書き方をした理由はそのプログラムを下の[]に書くという意味で書きました。


意味不明なことばっかり書いてすみません。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 20:29
by softya(ソフト屋)
X2<=X1+W1ですが、X2とX1+W1がそれぞれ頂点の座標で、<=は比較演算子です。
1つ四角形が4つの頂点座標で表す事が出来ると言う事はご存知ですよね?
たとえ知らなくても理解できると思います。
つまり分かっていなかったのに質問されなかったと言うことでしょうか?

> プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?
ptolemy さんが考えているモノが、どの様なモノか私には分からないです。
敵のことですか? ここにある「プレイヤーと同じ動きをするプログラム」が何の意味があるのか分からないからお尋ねした次第です。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 21:12
by ptolemy
すみません。
いろいろと事情があり、ゲームを速く完成したくて、急ぎ足になり、
リンクサイトをしっかりと理解せずに質問してしまいました。
本当にすみません。

また、プレイヤーと同じ動きをするプログラムというのは、
仮空の四角は、常にプレイヤーに重なっていないといけないと思いました。

しかし、
四角の座標=プレイヤーの座標
と書くことで別になくてもいいと気がつきました。

なので最初の//プレイヤーと同じ動きをするプログラムは、ただのミスです。


以下のサイトを見たら少し違う考え方で理解できました。
http://www11.ocn.ne.jp/~fregenan/s-atari.html


まだ、敵の範囲を決めてませんが、
一応、上のリンクを元に作ってみました。
 
このような当たり判定ならokですか? 

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 21:33
by softya(ソフト屋)
キャラに余白が多くない場合で、ジャンプしなければ大丈夫でしょう。コードを見てないのではっきりは断言できません。
たぶん同じだと1次元(X座標系)でしか判定していないと思います。

時間がないなら踏むとか難易度の高いのは避けてはどうでしょうか。

【補足】
私は四六時中回答できませんので、急いでいる時は自分で確認して先に先にすすまないと間に合いませんよ。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 21:55
by ptolemy
今僕が持っている知識だけでいうと

・地面についた状態でプレイヤーが敵の横範囲に達したら消える。

と書いたらジャンプしてもプレイヤーは消えませんよね?

また、一次元の当たり判定を利用して、y座標の範囲を決めても 踏む には、なりませんよね?

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 21:59
by ptolemy
分かりました。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 22:01
by softya(ソフト屋)
ptolemy さんが書きました:今僕が持っている知識だけでいうと

・地面についた状態でプレイヤーが敵の横範囲に達したら消える。

と書いたらジャンプしてもプレイヤーは消えませんよね?
yの範囲でも当たり判定しないと1ピクセルでもジャンプしたら敵を避けれますね。見た目には当たってます。
ptolemy さんが書きました: また、一次元の当たり判定を利用して、y座標の範囲を決めても 踏む には、なりませんよね?
当たっている事は分かっても、踏む(攻撃している)と衝突(攻撃されている)を区別しないと行けないですね。
[補足]当たった時に落下中であれば踏んだことにすることは出来ます。処理判定のタイミング次第では横から衝突を踏んだことにする可能性がありますが時間がないのでアバウトに済ますなら条件はこれだけです。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月10日(日) 23:18
by ptolemy
時間がないので
地面についていたらプレイヤー消

落下中なら敵消

にします。

もともと
J-ジャンプ
←→-移動
という簡単なゲームなので落下中ということでOKです。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月11日(月) 23:47
by ptolemy
一次元のあたり判定を利用して踏めないけどジャンプして避けるというコンセプトでゲームが完成しました。


それで少し時間が余ったので踏むということをつけようかと思いまして、四角のあたり判定をできるだけ理解しました。

以下のプログラムでいいんですかね?

コード:

 
int player_x,player_y;
int teki_x,teki_y;

if(○○&&
((player_x>teki_x&&player_x<teki_x+32)||
(teki_x>player_x&&teki_x <player_x+32)&&
((player_y>teki_y&&player_y<teki_y+32)||
(teki_y>player_y&&teki_y<player_y+32)))
{
//地面についているときプレイヤー消
//地面から離れているとき敵消
}

//○=player_y=0;か
 player_y>0;


Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 00:15
by softya(ソフト屋)
条件式内で()の対応を強引に帳尻合わせをしているのでNGです。
間違っているのは、条件式の&&や||の組み合わせの意味が理解できていないのでは?と思います。
あとcodeタグを失敗しているようなのでプレビューで必ず表示確認して下さい。
ptolemy さんが書きました:一次元のあたり判定を利用して踏めないけどジャンプして避けるというコンセプトでゲームが完成しました。


それで少し時間が余ったので踏むということをつけようかと思いまして、四角のあたり判定をできるだけ理解しました。

以下のプログラムでいいんですかね?

コード:

 
int player_x,player_y;
int teki_x,teki_y;

if(○○&&
((player_x>teki_x&&player_x<teki_x+32)||
(teki_x>player_x&&teki_x <player_x+32)&&
((player_y>teki_y&&player_y<teki_y+32)||
(teki_y>player_y&&teki_y<player_y+32)))
{
//地面についているときプレイヤー消
//地面から離れているとき敵消
}

//○=player_y=0;か
 player_y>0;


Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 17:31
by ISLe
DXライブラリ前提なら、Windows APIのIntersectRect関数を使ってはいかがですか。
矩形同士の重なりを判定していると、ひと目で分かるようにコードを書くことは重要だと思います。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 18:30
by ptolemy
http://homepage2.nifty.com/natupaji/DxL ... re1_6.html

こちらで勉強したんですが、ここではそういう書き方をしていました。
どうなんでしょうか。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 18:31
by ptolemy
interSectRect関数ですか。

検索して勉強してみます。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 18:35
by softya(ソフト屋)
ネットに上がっているからといってバグっていない保証はありません。
まず理解しないとバグを自分で取れないので、なんでもサンプルに頼るのは思考停止でしかありません。
思考停止するなら、既成作品で済ませて自分で作らないほうが建設的だと思いませんか?
私は自分で作るとは、自分で考える事だと思います。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 19:26
by ptolemy
すみません。

自分で考えてみました。

少し、リンクサイトの考えが入っていますが、これならどうでしょうか。

コード:

if(player_y==0&&player_x>teki_x&&player_x<teki_x+32){
//プレイヤー消
}
if(player_y>0&&player_x>teki_x&&player_x<teki_x+32&&player_y+32<teki_y){
//敵消
}

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 20:31
by ptolemy
lSLeさん

interSectRect関数は、以下のテキストを全て理解した方がいいですか?
http://wisdom.sakura.ne.jp/system/winap ... index.html

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 20:50
by softya(ソフト屋)
これは、検証されていないですね。
これに次のパターンのデータを当てはめて計算してみて下さい。

Player ( 64,32 )
Enemy1( 40,10 )
Enemy2( 31,10 )
Enemy3( 90,10 )
Enemy4( 40,64 )
Enemy5( 40,60 )
Enemy6( 96,10 )
Enemy7( 90,60 )
Enemy8( 90,64 )
衝突する敵(Enemy)は何番でしょうか?全部あげて下さい。
それとご自身のプログラムでは、ちゃんと衝突しますか?

プログラム作る時は、ちゃんと数値で検証しましょう。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月12日(火) 22:16
by ISLe
ptolemy さんが書きました:interSectRect関数は、以下のテキストを全て理解した方がいいですか?
ひとつも理解する必要ありません。
DXライブラリを使っているなら何の準備をせずともIntersectRect関数を利用できます。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月13日(水) 00:06
by ptolemy
lSLeさん
ありがとうございます。
interSectRect関数を勉強してみます。

softya(ソフト屋)さん
今、PCが使えないのでPCでは検証していません。

計算してみました。
答え Enemy1,Enemy5

です。

Re: 横スクロールでの敵との接触判定

Posted: 2013年11月16日(土) 19:31
by ptolemy
無事、成功しました。

ありがとうございました。