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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
ptolemy
記事: 258
登録日時: 12年前

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

#1

投稿記事 by ptolemy » 12年前

前回のジャンプ範囲の書き方の質問をさせていただきようやくジャンプができるようになりました。

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

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

コード:

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


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

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

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

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 12年前

「接触したら」は、「プレイヤーと敵のx座標の差の絶対値が閾値以下 かつ プレイヤーと敵のy座標の差の絶対値が閾値以下」
「踏んだ場合」は、「接触した かつ プレイヤーの速度の鉛直成分が下向き」
というのが基本です。
「踏んだ場合」は、「プレイヤーが敵よりある程度上にいる」という判定もあるとさらに良くなると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 12年前

ところで、プレイヤーを消すのはDeleteGraphで本当にいいのですか?
あ、きっとDXライブラリは使っていないから大丈夫なんですよね。(添付ファイルは見ていません)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#4

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

座標だけで判定するとこうなります。
つまり、完全に重ならないと当たりと見做されない訳です。そう組んでいるわけですからね。

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

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

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

踏んだらの件は、これらが出来てからのほうが良さそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#5

投稿記事 by ptolemy » 12年前

すいません。
投稿時使用していたブラウザーでは、返信のリンクが表示されなかったというのと無線ルーターの調子が悪くつながらなかったので遅れました。

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


softya(ソフト屋)さん

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

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

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

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

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

#6

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

>この四角を作るプログラムを使い、キャラクター画像の上に四角があるような感じにすればいいんですよね?

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

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

これの考え方そのものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#7

投稿記事 by みけCAT » 12年前

ptolemy さんが書きました:"いきち"というものは、何ですか。
[search=google]閾値[/search]
この場合、「この距離以下に近づいたら当たったとみなす」という距離のことです。
例えば、x方向についてプレイヤーのサイズが32、敵のサイズが64だったら、(32/2+64/2)すなわち48がいいでしょう。
y方向についても同様です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#8

投稿記事 by ptolemy » 12年前

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さん
具体例ありがとうございます。
 
明日、書いて試してみます。

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

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

#9

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

元の言語はC言語ではないので、そのままは導入できません。考え方を吸収してC言語に置き換えないと行きません。
理解していれば、このような書き方にはならないはずです。

X1,X2などの意味や式を理解されていないのでは無いでしょうか?
そこのわからない所を質問して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#10

投稿記事 by ptolemy » 12年前

すいません。

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

コード:

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

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

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

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

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

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

#11

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

申し訳ないですがプログラムとして成立していません。
if文自体をよく分かってないみたいですが、C言語をどのぐらい理解されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#12

投稿記事 by ptolemy » 12年前

http://9cguide.appspot.com/index.html
こちらのサイトで一通り読んだくらいしか勉強は、していません。

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

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

#13

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

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

他に気になることは、敵の移動、プレーヤーとの衝突判定、プレヤーの移動、敵との衝突判定などなどの流れそのものが出来ていないと思われます。
X2<=X1+W1;が「プレイヤーと同じ動作するプログラム↓」の前にある意味は説明できますでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#14

投稿記事 by ptolemy » 12年前

X2<=X1+W1
は、仮空の四角の場所を表すプログラムの定義で間違いないですか?

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



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

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


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

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

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

#15

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

X2<=X1+W1ですが、X2とX1+W1がそれぞれ頂点の座標で、<=は比較演算子です。
1つ四角形が4つの頂点座標で表す事が出来ると言う事はご存知ですよね?
たとえ知らなくても理解できると思います。
つまり分かっていなかったのに質問されなかったと言うことでしょうか?

> プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?
ptolemy さんが考えているモノが、どの様なモノか私には分からないです。
敵のことですか? ここにある「プレイヤーと同じ動きをするプログラム」が何の意味があるのか分からないからお尋ねした次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#16

投稿記事 by ptolemy » 12年前

すみません。
いろいろと事情があり、ゲームを速く完成したくて、急ぎ足になり、
リンクサイトをしっかりと理解せずに質問してしまいました。
本当にすみません。

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

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

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


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


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

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

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

#17

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

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

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

【補足】
私は四六時中回答できませんので、急いでいる時は自分で確認して先に先にすすまないと間に合いませんよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#18

投稿記事 by ptolemy » 12年前

今僕が持っている知識だけでいうと

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

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

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

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#19

投稿記事 by ptolemy » 12年前

分かりました。

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

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

#20

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

ptolemy さんが書きました:今僕が持っている知識だけでいうと

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

と書いたらジャンプしてもプレイヤーは消えませんよね?
yの範囲でも当たり判定しないと1ピクセルでもジャンプしたら敵を避けれますね。見た目には当たってます。
ptolemy さんが書きました: また、一次元の当たり判定を利用して、y座標の範囲を決めても 踏む には、なりませんよね?
当たっている事は分かっても、踏む(攻撃している)と衝突(攻撃されている)を区別しないと行けないですね。
[補足]当たった時に落下中であれば踏んだことにすることは出来ます。処理判定のタイミング次第では横から衝突を踏んだことにする可能性がありますが時間がないのでアバウトに済ますなら条件はこれだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#21

投稿記事 by ptolemy » 12年前

時間がないので
地面についていたらプレイヤー消

落下中なら敵消

にします。

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

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#22

投稿記事 by ptolemy » 12年前

一次元のあたり判定を利用して踏めないけどジャンプして避けるというコンセプトでゲームが完成しました。


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

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

コード:

 
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;


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

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

#23

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

条件式内で()の対応を強引に帳尻合わせをしているので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;

by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#24

投稿記事 by ISLe » 12年前

DXライブラリ前提なら、Windows APIのIntersectRect関数を使ってはいかがですか。
矩形同士の重なりを判定していると、ひと目で分かるようにコードを書くことは重要だと思います。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#25

投稿記事 by ptolemy » 12年前

http://homepage2.nifty.com/natupaji/DxL ... re1_6.html

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

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#26

投稿記事 by ptolemy » 12年前

interSectRect関数ですか。

検索して勉強してみます。
最後に編集したユーザー ptolemy on 2013年11月12日(火) 18:49 [ 編集 1 回目 ]

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

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

#27

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

ネットに上がっているからといってバグっていない保証はありません。
まず理解しないとバグを自分で取れないので、なんでもサンプルに頼るのは思考停止でしかありません。
思考停止するなら、既成作品で済ませて自分で作らないほうが建設的だと思いませんか?
私は自分で作るとは、自分で考える事だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#28

投稿記事 by ptolemy » 12年前

すみません。

自分で考えてみました。

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

コード:

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){
//敵消
}

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#29

投稿記事 by ptolemy » 12年前

lSLeさん

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

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

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

#30

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

これは、検証されていないですね。
これに次のパターンのデータを当てはめて計算してみて下さい。

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)は何番でしょうか?全部あげて下さい。
それとご自身のプログラムでは、ちゃんと衝突しますか?

プログラム作る時は、ちゃんと数値で検証しましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#31

投稿記事 by ISLe » 12年前

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

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#32

投稿記事 by ptolemy » 12年前

lSLeさん
ありがとうございます。
interSectRect関数を勉強してみます。

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

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

です。

アバター
ptolemy
記事: 258
登録日時: 12年前

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

#33

投稿記事 by ptolemy » 12年前

無事、成功しました。

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

閉鎖

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