当たり判定
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 当たり判定
2回投稿されていますよ。codeタグも間違っているので必ずプレビューで確認して下さい。
実行結果も、さっきまで合っていた部分が間違っています。動作確認をお願いします。
慌てすぎてませんか?
実行結果も、さっきまで合っていた部分が間違っています。動作確認をお願いします。
慌てすぎてませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 当たり判定
全然の落ち着いてないです。
焦ってもバグを増産するだけなので落ち着きましょう。
インデントもおかしいままですし、答えも違っています。
このプログラムを実行した結果を貼り付けてもらえば客観的にみれますかね。
焦ってもバグを増産するだけなので落ち着きましょう。
インデントもおかしいままですし、答えも違っています。
このプログラムを実行した結果を貼り付けてもらえば客観的にみれますかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 当たり判定
実行結果は正解です。
No: 28,No: 29ではインデントが合っていましたので何故再び狂うんでしょうか。
No: 28,No: 29ではインデントが合っていましたので何故再び狂うんでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 当たり判定
それではインデントを直してみてください。
それとは別にステップ2です。インデントの修正は先に報告をお願いします。
このプログラムに-90以下だったらnに1を足すプログラムに機能追加して下さい。nの初期値は0です。
そうした上で、最後のprintfでnの値も表示して下さい。
それとは別にステップ2です。インデントの修正は先に報告をお願いします。
このプログラムに-90以下だったらnに1を足すプログラムに機能追加して下さい。nの初期値は0です。
そうした上で、最後のprintfでnの値も表示して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 当たり判定
こちらは何時でも構いません。るる さんが書きました:すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。
時間の有るときにじっくり取り組んで下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 当たり判定
別にすぐに答えなくてもよいのですよ。
#そこが掲示板のいいところ。
インデントについて、こちらを参考にしてください。
(No.28とNo.29がちゃんとインデントしてるのは、たぶんNo.24を参考にしたからでしょうね)
読みやすいプログラムを書くには-プログラミング全般
基本、プログラムを組む人は、処理の流れを追いやすくするために必ずインデントを行います。
忘れないでくださいね。
softyaさんが示した通り、
インデントを行ったソースを掲示してから、
ステップ2で出した問題を解いてくださいね。
#そこが掲示板のいいところ。
インデントについて、こちらを参考にしてください。
(No.28とNo.29がちゃんとインデントしてるのは、たぶんNo.24を参考にしたからでしょうね)
読みやすいプログラムを書くには-プログラミング全般
基本、プログラムを組む人は、処理の流れを追いやすくするために必ずインデントを行います。
忘れないでくださいね。
softyaさんが示した通り、
インデントを行ったソースを掲示してから、
ステップ2で出した問題を解いてくださいね。
written by へにっくす
Re: 当たり判定
色々と積み上げても議題者さんが混乱するだけだと思うので最初のソースに戻ります。
強制ではないので議題者さんは取り組みやすい方を選んで返答してもらえればと思います。
No.20 で提示されたソースにコメントを付けてみました
この状態で何が問題なのかは分かりますでしょうか。
あと B が消えなくなって、C との接触をみたいようにも思えますね。
仕様に変更があったならその辺の解説もお願いします
強制ではないので議題者さんは取り組みやすい方を選んで返答してもらえればと思います。
No.20 で提示されたソースにコメントを付けてみました
while(window.update() == true)
{
:
中略
:
distance1 = vec1.dist(); //!< A-B の距離
distance2 = vec2.dist(); //!< A-C の距離
if(distance1 < 10.0){ //!< 距離が10未満なら
int n = 0; //!< n は 0 です
window.remove(modelC[n]); //!< C[ n ]を消す(n は 0 です)
n++; //!< n を +1。n は 1 です
modelB.setMaterial(Red);
} else {
modelB.setMaterial(Blue);
}
}// while へ戻る
あと B が消えなくなって、C との接触をみたいようにも思えますね。
仕様に変更があったならその辺の解説もお願いします
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 当たり判定
私の方針は根本理解ですので、N.Rさんとは方針が違いました。
N.Rさんの方針を選ばれるということなので、後はN.Rさんにお任せしたいと思います。
一言付け加えるならば、「問題はここだと思います」だけじゃなく、問題点についてこういう検証をしてみました。
あるいは、こうすれば良いんじゃないかと試してみました。と踏み込んで考えられるとご自身が前進できると思います。
N.Rさんの方針を選ばれるということなので、後はN.Rさんにお任せしたいと思います。
一言付け加えるならば、「問題はここだと思います」だけじゃなく、問題点についてこういう検証をしてみました。
あるいは、こうすれば良いんじゃないかと試してみました。と踏み込んで考えられるとご自身が前進できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 当たり判定
>今の状態ではn++;が何の意味もないことでしょうか?
というのは正解です。
なぜ意味をなさないのか、を考えてみてください
実行すると A を操作して動かせるようになっていると思います。
プログラムというものは上から実行されて順番に下へ、一番下まで来たら終了する
というのが基本です。
運動会でもどの順で演目を進めるかというのを書いたものをプログラムと呼びますよね。
一番下で終了する、のに終了していないという事は…
という事を踏まえてコンピュータはこのプログラムをどう実行しているか
を考えてみるとわかってくるかと思います。
次の回答では答えを書いてしまいますのでまずは一度考えてみてください
> softya(ソフト屋)さん
根本的に理解しないといけないのは賛成ですが、当人が楽しくなくてはやはり気持ちが離れてしまいますので
多少遠回りでもやり易い方向から攻めてみたいと思います。
というのは正解です。
なぜ意味をなさないのか、を考えてみてください
実行すると A を操作して動かせるようになっていると思います。
プログラムというものは上から実行されて順番に下へ、一番下まで来たら終了する
というのが基本です。
運動会でもどの順で演目を進めるかというのを書いたものをプログラムと呼びますよね。
一番下で終了する、のに終了していないという事は…
という事を踏まえてコンピュータはこのプログラムをどう実行しているか
を考えてみるとわかってくるかと思います。
次の回答では答えを書いてしまいますのでまずは一度考えてみてください
> softya(ソフト屋)さん
根本的に理解しないといけないのは賛成ですが、当人が楽しくなくてはやはり気持ちが離れてしまいますので
多少遠回りでもやり易い方向から攻めてみたいと思います。
Re: 当たり判定
>終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか
そうですね
while(){ ... } の中をずっとループ、延々と繰り返し実行しているという事です。
それは正しい動作です。それによってずっとボタン操作で A を動かす事が出来ています。
>消すプログラムを付け加えないと
というのは
こういう風に書かないとダメですか?
という意味合いでしょうか
ある意味間違いではないです。
一度試してみてはどうでしょうか。
その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください
そうですね
while(){ ... } の中をずっとループ、延々と繰り返し実行しているという事です。
それは正しい動作です。それによってずっとボタン操作で A を動かす事が出来ています。
>消すプログラムを付け加えないと
というのは
int n = 0;
window.remove(modelC[n]);
n++;
window.remove(modelC[n]);
n++;
window.remove(modelC[n]);
n++;
window.remove(modelC[n]);
n++;
window.remove(modelC[n]);
という意味合いでしょうか
ある意味間違いではないです。
一度試してみてはどうでしょうか。
その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください
Re: 当たり判定
その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください
目標の実行結果は、一度の衝突で、一個ずつ消していくという風にしようとしています。それに対して今回の実行結果は一度の衝突ですべての球が消えてしまいました。
目標の実行結果は、一度の衝突で、一個ずつ消していくという風にしようとしています。それに対して今回の実行結果は一度の衝突ですべての球が消えてしまいました。
Re: 当たり判定
結果は期待と違いますね
ここでは modelC[ ] の中に入るものと n の値(中身)の関係性を知ってもらえればと思います
n の値が 0 から 4 まで増えていけば球は全て消える。それを一度の接触で全部やったから一度に全部消えた
という事が分かりますでしょうか
ここで先に進む前に1つ前のソースで
n の値がどうなっていたのかを考えてみましょうか
ソースを変数nに関係する部分のみにしたものです
これをループさせずに書くとこんな感じです。
n の値はどうなっていて、C のどれが消えていますか?
そしてどうすればよいと思いますか(実行しなくていいですよ)
ここでは modelC[ ] の中に入るものと n の値(中身)の関係性を知ってもらえればと思います
n の値が 0 から 4 まで増えていけば球は全て消える。それを一度の接触で全部やったから一度に全部消えた
という事が分かりますでしょうか
ここで先に進む前に1つ前のソースで
n の値がどうなっていたのかを考えてみましょうか
ソースを変数nに関係する部分のみにしたものです
while(window.update() == true)
{
int n = 0; //!< n に 0 を入れます
window.remove(modelC[n]); //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
n++; //!< n を +1。n は 1 です
}// while へ戻る
int n = 0; //!< n に 0 を入れます
window.remove(modelC[n]); //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
n++; //!< n を +1。n は 1 です
int n = 0; //!< n に 0 を入れます
window.remove(modelC[n]); //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
n++; //!< n を +1。n は 1 です
int n = 0; //!< n に 0 を入れます
window.remove(modelC[n]); //!< C[ n ]を消す。n は 0 なのでこの行は「C[ 0 ]を消す」です
n++; //!< n を +1。n は 1 です
: 以降ずっと繰り返す
そしてどうすればよいと思いますか(実行しなくていいですよ)
Re: 当たり判定
>nの値は0と1をずっと繰り返しループしています。Cはいちばん最初の0のCが消えます。
そうですね。No: 20 の報告と同じです。
これでどうしてそうなっていたのか、が分かりました。
>この0と1の繰り返しループをやめさせて、1,2,3となっていくようにすればいいと思います。
それは No: 51 でやった事です。
それでは期待していた結果が得られませんでした。
なぜか、
ボタン操作で modelA を動かし、modelB との接触を見る
をループする
という前提があるからです。
このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです
次回で答えを…と言いつつ引っ張ってしまいましたが
まず int n = 0; がループの外にある必要があります。
n が接触の度に 0 になっているのが1つ目の問題です。
これもまだ期待した動作には足らないはずです。
この結果がどう期待と違い、どうればいいと思うかを考えてみてください
※あとこちらもフレームワークは分からず、実行確認できないので絶対合ってるとは限らないのでご了承を
時間かけているのはじらしているのではなく
プログラムは書いた通りにしか動かない
期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。
プログラムがどう動いているのかを考えてください
そうですね。No: 20 の報告と同じです。
これでどうしてそうなっていたのか、が分かりました。
>この0と1の繰り返しループをやめさせて、1,2,3となっていくようにすればいいと思います。
それは No: 51 でやった事です。
それでは期待していた結果が得られませんでした。
なぜか、
ボタン操作で modelA を動かし、modelB との接触を見る
をループする
という前提があるからです。
このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです
次回で答えを…と言いつつ引っ張ってしまいましたが
まず int n = 0; がループの外にある必要があります。
n が接触の度に 0 になっているのが1つ目の問題です。
int n = 0;
while(window.update() == true) {
if(win.getSpecialKeyStatus(FK_RIGHT) == FKUT_SW_PRESS){
modelA.glTranslate(0.05, 0.0, 0.0);
}else if(win.getSpecialKeyStatus(FK_LEFT) == FKUT_SW_PRESS){
modelA.glTranslate(-0.05, 0.0, 0.0);
}else if(win.getSpecialKeyStatus(FK_UP) == FKUT_SW_PRESS){
modelA.glTranslate(0.0, 0.05, 0.0);
}else if(win.getSpecialKeyStatus(FK_DOWN) == FKUT_SW_PRESS){
modelA.glTranslate(0.0, -0.05, 0.0);
}
posA = modelA.getPosition();
posB = modelB.getPosition();
posC = modelC[c].getPosition();
vec1 = posB - posA;
vec2 = posC - posA;
distance1 = vec1.dist();
distance2 = vec2.dist();
if(distance1 < 10.0) {
window.remove(modelC[n]);
if( n < 5 )//これは今は気にしない
n++;
modelB.setMaterial(Red);
} else {
modelB.setMaterial(Blue);
}
}
この結果がどう期待と違い、どうればいいと思うかを考えてみてください
※あとこちらもフレームワークは分からず、実行確認できないので絶対合ってるとは限らないのでご了承を
時間かけているのはじらしているのではなく
プログラムは書いた通りにしか動かない
期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。
プログラムがどう動いているのかを考えてください
Re: 当たり判定
>このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです
そうですね int n = 0;が中だと0,1を繰り返す。考えればわかることでした・・・
>この結果がどう期待と違い、どうればいいと思うかを考えてみてください
今回の結果では接触すると5個まとめて消えてしまいました。
やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます。
>時間かけているのはじらしているのではなく
プログラムは書いた通りにしか動かない
期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。
はい、わざわざ時間をかけて教えていただき本当に感謝しております。
すぐに答えを出していただいても、やはり理解は難しいでしょうから、こうやっていただき理解をより深めることができております。
そうですね int n = 0;が中だと0,1を繰り返す。考えればわかることでした・・・
>この結果がどう期待と違い、どうればいいと思うかを考えてみてください
今回の結果では接触すると5個まとめて消えてしまいました。
やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます。
>時間かけているのはじらしているのではなく
プログラムは書いた通りにしか動かない
期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。
はい、わざわざ時間をかけて教えていただき本当に感謝しております。
すぐに答えを出していただいても、やはり理解は難しいでしょうから、こうやっていただき理解をより深めることができております。
Re: 当たり判定
>今回の結果では接触すると5個まとめて消えてしまいました。
そうですね。
A と B が接触して C を1つ消す
でも B は色が変わるだけでその場に残り続けるので
次の瞬間(フレーム)にもやはり接触して次の C が消える
ので文字通り瞬く間に全部消えてしまっていると思います
>やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます
そうですね。
具体的にどうするかが難しいところですが、まずは modelC の動作を確実なものにしたい所ですので
接触時に A を元の位置に戻してみてはどうでしょうか
今度は色が変わるのが一瞬のはずです
そうですね。
A と B が接触して C を1つ消す
でも B は色が変わるだけでその場に残り続けるので
次の瞬間(フレーム)にもやはり接触して次の C が消える
ので文字通り瞬く間に全部消えてしまっていると思います
>やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます
そうですね。
具体的にどうするかが難しいところですが、まずは modelC の動作を確実なものにしたい所ですので
接触時に A を元の位置に戻してみてはどうでしょうか
今度は色が変わるのが一瞬のはずです
Re: 当たり判定
今は B は動かないですが、画面をバウンドするように動かせばゲームっぽくなりますね。
n が 5 になったらゲームオーバーとしてループを抜けるようにすると更に。
色が一定時間だけ変わって元に戻るようにする、なと色々出来る事はあると思います。
作ったものが動く面白さが先に分かる方がよいと根本的な事は省いていますが
先に進む時は softyaさんの指摘するような問題にぶつかる時が来ると思いますが
今の物を作りながら覚えていって良いと思います。
インデントも重要ですね
個人のファッションにポリシーがあっても公の場に出る時は正装しなくてはなりません
同じようにコードを人に見せる時はインデントも覚える必要があります。
n が 5 になったらゲームオーバーとしてループを抜けるようにすると更に。
色が一定時間だけ変わって元に戻るようにする、なと色々出来る事はあると思います。
作ったものが動く面白さが先に分かる方がよいと根本的な事は省いていますが
先に進む時は softyaさんの指摘するような問題にぶつかる時が来ると思いますが
今の物を作りながら覚えていって良いと思います。
インデントも重要ですね
個人のファッションにポリシーがあっても公の場に出る時は正装しなくてはなりません
同じようにコードを人に見せる時はインデントも覚える必要があります。