横スクロールでの敵との接触判定
横スクロールでの敵との接触判定
前回のジャンプ範囲の書き方の質問をさせていただきようやくジャンプができるようになりました。
しかし、敵と当たったらプレイヤーが消え、敵をマリオみたいに踏んだ場合は、敵が消えるというプログラムがどうしても書けません。
一応、敵のx座標とプレイヤーのx座標が同じになると敵を消滅すると書いてみました。
(プレイヤーのy座標は、200です。) と書いてみたところ消えたには消えましたが、重ならないと消えません。
また、踏んだ場合のプログラムは、さっぱり分かりません。
どうか
・敵と接触したらプレイヤーが消える
プログラムと
・敵を踏んだ場合は、敵が消える
というプログラムについて教えてください。
また、まだ未完成ですが、作っているものを添付します。
絵心がなく絵が下手です。
とても困っているので宜しくお願いします。
しかし、敵と当たったらプレイヤーが消え、敵をマリオみたいに踏んだ場合は、敵が消えるというプログラムがどうしても書けません。
一応、敵のx座標とプレイヤーのx座標が同じになると敵を消滅すると書いてみました。
(プレイヤーのy座標は、200です。) と書いてみたところ消えたには消えましたが、重ならないと消えません。
また、踏んだ場合のプログラムは、さっぱり分かりません。
どうか
・敵と接触したらプレイヤーが消える
プログラムと
・敵を踏んだ場合は、敵が消える
というプログラムについて教えてください。
また、まだ未完成ですが、作っているものを添付します。
絵心がなく絵が下手です。
とても困っているので宜しくお願いします。
Re: 横スクロールでの敵との接触判定
「接触したら」は、「プレイヤーと敵のx座標の差の絶対値が閾値以下 かつ プレイヤーと敵のy座標の差の絶対値が閾値以下」
「踏んだ場合」は、「接触した かつ プレイヤーの速度の鉛直成分が下向き」
というのが基本です。
「踏んだ場合」は、「プレイヤーが敵よりある程度上にいる」という判定もあるとさらに良くなると思います。
「踏んだ場合」は、「接触した かつ プレイヤーの速度の鉛直成分が下向き」
というのが基本です。
「踏んだ場合」は、「プレイヤーが敵よりある程度上にいる」という判定もあるとさらに良くなると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 横スクロールでの敵との接触判定
ところで、プレイヤーを消すのはDeleteGraphで本当にいいのですか?
あ、きっとDXライブラリは使っていないから大丈夫なんですよね。(添付ファイルは見ていません)
あ、きっとDXライブラリは使っていないから大丈夫なんですよね。(添付ファイルは見ていません)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
座標だけで判定するとこうなります。
つまり、完全に重ならないと当たりと見做されない訳です。そう組んでいるわけですからね。
なので、当たりの範囲と言う考えを採用します。これには自分の四角形と敵の四角形が重なっているかと言うのを調べます。
中学生でも分かる程度の難しい数学ではないので、よく考えれば分かります。
「当たり判定」
http://www.interq.or.jp/moonstone/person/del/atari.htm
それと当たり範囲は画像より小さ目で調整すことが多いです。余白の部分まで当たって欲しく無いですからね。
DeleteGraph(player);はマズイので、必ず存在フラグを持つようにしてください。
踏んだらの件は、これらが出来てからのほうが良さそうです。
つまり、完全に重ならないと当たりと見做されない訳です。そう組んでいるわけですからね。
なので、当たりの範囲と言う考えを採用します。これには自分の四角形と敵の四角形が重なっているかと言うのを調べます。
中学生でも分かる程度の難しい数学ではないので、よく考えれば分かります。
「当たり判定」
http://www.interq.or.jp/moonstone/person/del/atari.htm
それと当たり範囲は画像より小さ目で調整すことが多いです。余白の部分まで当たって欲しく無いですからね。
DeleteGraph(player);はマズイので、必ず存在フラグを持つようにしてください。
踏んだらの件は、これらが出来てからのほうが良さそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
すいません。
投稿時使用していたブラウザーでは、返信のリンクが表示されなかったというのと無線ルーターの調子が悪くつながらなかったので遅れました。
みけCATさん
速い返信ありがとうございます。
DXライブラリを使っております。
初歩的な質問ですが、
"いきち"というものは、何ですか。
softya(ソフト屋)さん
返信ありがとうございます。
リンクサイトの
//四角領域どうしの判定
の四角を作るプログラムを使い、
キャラクター画像の上に四角があるような感じにすればいいんですよね?
また、四角同士がくっついたかどうかを判定するやり方がいまいち分かりません。
投稿時使用していたブラウザーでは、返信のリンクが表示されなかったというのと無線ルーターの調子が悪くつながらなかったので遅れました。
みけCATさん
速い返信ありがとうございます。
DXライブラリを使っております。
初歩的な質問ですが、
"いきち"というものは、何ですか。
softya(ソフト屋)さん
返信ありがとうございます。
リンクサイトの
//四角領域どうしの判定
の四角を作るプログラムを使い、
キャラクター画像の上に四角があるような感じにすればいいんですよね?
また、四角同士がくっついたかどうかを判定するやり方がいまいち分かりません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
>この四角を作るプログラムを使い、キャラクター画像の上に四角があるような感じにすればいいんですよね?
表示する四角を作るんじゃないですよ。表示しない仮想的な四角があると仮定して2つの四角が部分的に重なり合っているか判定する仕組みです。
>また、四角同士がくっついたかどうかを判定するやり方がいまいち分かりません。
これの考え方そのものです。
表示する四角を作るんじゃないですよ。表示しない仮想的な四角があると仮定して2つの四角が部分的に重なり合っているか判定する仕組みです。
>また、四角同士がくっついたかどうかを判定するやり方がいまいち分かりません。
これの考え方そのものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
[search=google]閾値[/search]ptolemy さんが書きました:"いきち"というものは、何ですか。
この場合、「この距離以下に近づいたら当たったとみなす」という距離のことです。
例えば、x方向についてプレイヤーのサイズが32、敵のサイズが64だったら、(32/2+64/2)すなわち48がいいでしょう。
y方向についても同様です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 横スクロールでの敵との接触判定
softya(ソフト屋)さん
一応作ってみました。
こんな感じで△の場所の敵とプレイヤーの四角系が接触していることを
どう表せばいいんですかね?
みけCATさん
具体例ありがとうございます。
明日、書いて試してみます。
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: 横スクロールでの敵との接触判定
元の言語はC言語ではないので、そのままは導入できません。考え方を吸収してC言語に置き換えないと行きません。
理解していれば、このような書き方にはならないはずです。
X1,X2などの意味や式を理解されていないのでは無いでしょうか?
そこのわからない所を質問して下さい。
理解していれば、このような書き方にはならないはずです。
X1,X2などの意味や式を理解されていないのでは無いでしょうか?
そこのわからない所を質問して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
申し訳ないですがプログラムとして成立していません。
if文自体をよく分かってないみたいですが、C言語をどのぐらい理解されていますか?
if文自体をよく分かってないみたいですが、C言語をどのぐらい理解されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
http://9cguide.appspot.com/index.html
こちらのサイトで一通り読んだくらいしか勉強は、していません。
こちらのサイトで一通り読んだくらいしか勉強は、していません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
例えば、X2<=X1+W1;この式は条件式ですがif文で使うか結果を代入しない限り意味がありません。
なのでC言語の理解度も不十分だと思うのですが、そもそもの「四角領域どうしの判定」の仕組みそのものを理解されていると思えないわけです。
他に気になることは、敵の移動、プレーヤーとの衝突判定、プレヤーの移動、敵との衝突判定などなどの流れそのものが出来ていないと思われます。
X2<=X1+W1;が「プレイヤーと同じ動作するプログラム↓」の前にある意味は説明できますでしょうか。
なのでC言語の理解度も不十分だと思うのですが、そもそもの「四角領域どうしの判定」の仕組みそのものを理解されていると思えないわけです。
他に気になることは、敵の移動、プレーヤーとの衝突判定、プレヤーの移動、敵との衝突判定などなどの流れそのものが出来ていないと思われます。
X2<=X1+W1;が「プレイヤーと同じ動作するプログラム↓」の前にある意味は説明できますでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
X2<=X1+W1
は、仮空の四角の場所を表すプログラムの定義で間違いないですか?
しかし、X2<=X1+W1などの意味が分からないです。
プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?
//プレイヤーと同じ動きをするプログラム↓
のような書き方をした理由はそのプログラムを下の[]に書くという意味で書きました。
意味不明なことばっかり書いてすみません。
は、仮空の四角の場所を表すプログラムの定義で間違いないですか?
しかし、X2<=X1+W1などの意味が分からないです。
プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?
//プレイヤーと同じ動きをするプログラム↓
のような書き方をした理由はそのプログラムを下の[]に書くという意味で書きました。
意味不明なことばっかり書いてすみません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
X2<=X1+W1ですが、X2とX1+W1がそれぞれ頂点の座標で、<=は比較演算子です。
1つ四角形が4つの頂点座標で表す事が出来ると言う事はご存知ですよね?
たとえ知らなくても理解できると思います。
つまり分かっていなかったのに質問されなかったと言うことでしょうか?
> プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?
ptolemy さんが考えているモノが、どの様なモノか私には分からないです。
敵のことですか? ここにある「プレイヤーと同じ動きをするプログラム」が何の意味があるのか分からないからお尋ねした次第です。
1つ四角形が4つの頂点座標で表す事が出来ると言う事はご存知ですよね?
たとえ知らなくても理解できると思います。
つまり分かっていなかったのに質問されなかったと言うことでしょうか?
> プレイヤーと同じ動きをするプログラムは、必要がなく、代入でいんですか?
ptolemy さんが考えているモノが、どの様なモノか私には分からないです。
敵のことですか? ここにある「プレイヤーと同じ動きをするプログラム」が何の意味があるのか分からないからお尋ねした次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
すみません。
いろいろと事情があり、ゲームを速く完成したくて、急ぎ足になり、
リンクサイトをしっかりと理解せずに質問してしまいました。
本当にすみません。
また、プレイヤーと同じ動きをするプログラムというのは、
仮空の四角は、常にプレイヤーに重なっていないといけないと思いました。
しかし、
四角の座標=プレイヤーの座標
と書くことで別になくてもいいと気がつきました。
なので最初の//プレイヤーと同じ動きをするプログラムは、ただのミスです。
以下のサイトを見たら少し違う考え方で理解できました。
http://www11.ocn.ne.jp/~fregenan/s-atari.html
まだ、敵の範囲を決めてませんが、
一応、上のリンクを元に作ってみました。
このような当たり判定ならokですか?
いろいろと事情があり、ゲームを速く完成したくて、急ぎ足になり、
リンクサイトをしっかりと理解せずに質問してしまいました。
本当にすみません。
また、プレイヤーと同じ動きをするプログラムというのは、
仮空の四角は、常にプレイヤーに重なっていないといけないと思いました。
しかし、
四角の座標=プレイヤーの座標
と書くことで別になくてもいいと気がつきました。
なので最初の//プレイヤーと同じ動きをするプログラムは、ただのミスです。
以下のサイトを見たら少し違う考え方で理解できました。
http://www11.ocn.ne.jp/~fregenan/s-atari.html
まだ、敵の範囲を決めてませんが、
一応、上のリンクを元に作ってみました。
このような当たり判定ならokですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
キャラに余白が多くない場合で、ジャンプしなければ大丈夫でしょう。コードを見てないのではっきりは断言できません。
たぶん同じだと1次元(X座標系)でしか判定していないと思います。
時間がないなら踏むとか難易度の高いのは避けてはどうでしょうか。
【補足】
私は四六時中回答できませんので、急いでいる時は自分で確認して先に先にすすまないと間に合いませんよ。
たぶん同じだと1次元(X座標系)でしか判定していないと思います。
時間がないなら踏むとか難易度の高いのは避けてはどうでしょうか。
【補足】
私は四六時中回答できませんので、急いでいる時は自分で確認して先に先にすすまないと間に合いませんよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
今僕が持っている知識だけでいうと
・地面についた状態でプレイヤーが敵の横範囲に達したら消える。
と書いたらジャンプしてもプレイヤーは消えませんよね?
また、一次元の当たり判定を利用して、y座標の範囲を決めても 踏む には、なりませんよね?
・地面についた状態でプレイヤーが敵の横範囲に達したら消える。
と書いたらジャンプしてもプレイヤーは消えませんよね?
また、一次元の当たり判定を利用して、y座標の範囲を決めても 踏む には、なりませんよね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
yの範囲でも当たり判定しないと1ピクセルでもジャンプしたら敵を避けれますね。見た目には当たってます。ptolemy さんが書きました:今僕が持っている知識だけでいうと
・地面についた状態でプレイヤーが敵の横範囲に達したら消える。
と書いたらジャンプしてもプレイヤーは消えませんよね?
当たっている事は分かっても、踏む(攻撃している)と衝突(攻撃されている)を区別しないと行けないですね。ptolemy さんが書きました: また、一次元の当たり判定を利用して、y座標の範囲を決めても 踏む には、なりませんよね?
[補足]当たった時に落下中であれば踏んだことにすることは出来ます。処理判定のタイミング次第では横から衝突を踏んだことにする可能性がありますが時間がないのでアバウトに済ますなら条件はこれだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
時間がないので
地面についていたらプレイヤー消
落下中なら敵消
にします。
もともと
J-ジャンプ
←→-移動
という簡単なゲームなので落下中ということでOKです。
地面についていたらプレイヤー消
落下中なら敵消
にします。
もともと
J-ジャンプ
←→-移動
という簡単なゲームなので落下中ということでOKです。
Re: 横スクロールでの敵との接触判定
一次元のあたり判定を利用して踏めないけどジャンプして避けるというコンセプトでゲームが完成しました。
それで少し時間が余ったので踏むということをつけようかと思いまして、四角のあたり判定をできるだけ理解しました。
以下のプログラムでいいんですかね?
それで少し時間が余ったので踏むということをつけようかと思いまして、四角のあたり判定をできるだけ理解しました。
以下のプログラムでいいんですかね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
条件式内で()の対応を強引に帳尻合わせをしているのでNGです。
間違っているのは、条件式の&&や||の組み合わせの意味が理解できていないのでは?と思います。
あとcodeタグを失敗しているようなのでプレビューで必ず表示確認して下さい。
間違っているのは、条件式の&&や||の組み合わせの意味が理解できていないのでは?と思います。
あとcodeタグを失敗しているようなのでプレビューで必ず表示確認して下さい。
ptolemy さんが書きました:一次元のあたり判定を利用して踏めないけどジャンプして避けるというコンセプトでゲームが完成しました。
それで少し時間が余ったので踏むということをつけようかと思いまして、四角のあたり判定をできるだけ理解しました。
以下のプログラムでいいんですかね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
DXライブラリ前提なら、Windows APIのIntersectRect関数を使ってはいかがですか。
矩形同士の重なりを判定していると、ひと目で分かるようにコードを書くことは重要だと思います。
矩形同士の重なりを判定していると、ひと目で分かるようにコードを書くことは重要だと思います。
Re: 横スクロールでの敵との接触判定
interSectRect関数ですか。
検索して勉強してみます。
検索して勉強してみます。
最後に編集したユーザー ptolemy on 2013年11月12日(火) 18:49 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
ネットに上がっているからといってバグっていない保証はありません。
まず理解しないとバグを自分で取れないので、なんでもサンプルに頼るのは思考停止でしかありません。
思考停止するなら、既成作品で済ませて自分で作らないほうが建設的だと思いませんか?
私は自分で作るとは、自分で考える事だと思います。
まず理解しないとバグを自分で取れないので、なんでもサンプルに頼るのは思考停止でしかありません。
思考停止するなら、既成作品で済ませて自分で作らないほうが建設的だと思いませんか?
私は自分で作るとは、自分で考える事だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
lSLeさん
interSectRect関数は、以下のテキストを全て理解した方がいいですか?
http://wisdom.sakura.ne.jp/system/winap ... index.html
interSectRect関数は、以下のテキストを全て理解した方がいいですか?
http://wisdom.sakura.ne.jp/system/winap ... index.html
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 横スクロールでの敵との接触判定
これは、検証されていないですね。
これに次のパターンのデータを当てはめて計算してみて下さい。
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)は何番でしょうか?全部あげて下さい。
それとご自身のプログラムでは、ちゃんと衝突しますか?
プログラム作る時は、ちゃんと数値で検証しましょう。
これに次のパターンのデータを当てはめて計算してみて下さい。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 横スクロールでの敵との接触判定
ひとつも理解する必要ありません。ptolemy さんが書きました:interSectRect関数は、以下のテキストを全て理解した方がいいですか?
DXライブラリを使っているなら何の準備をせずともIntersectRect関数を利用できます。
Re: 横スクロールでの敵との接触判定
lSLeさん
ありがとうございます。
interSectRect関数を勉強してみます。
softya(ソフト屋)さん
今、PCが使えないのでPCでは検証していません。
計算してみました。
答え Enemy1,Enemy5
です。
ありがとうございます。
interSectRect関数を勉強してみます。
softya(ソフト屋)さん
今、PCが使えないのでPCでは検証していません。
計算してみました。
答え Enemy1,Enemy5
です。