ページ 1 / 1
当たり判定
Posted: 2014年2月28日(金) 00:31
by るる
コード:
#include <FK/FK.h>
#include <FK/SimpleWindow.h>
int main(int argc, char *argv[])
{
fk_AppWindow window;
fk_AppWindow win;
fk_Sphere sphereA(8,2.0);
fk_Sphere sphere(8, 5.0);
fk_Model modelA,modelB,modelC[5];
fk_Vector posA, posB,posC, vec;
double distance;
int c;
int div;
modelA.setShape(&sphere);
modelA.setMaterial(Green);
modelA.glMoveTo(-20.0, 2.0, 0.0);
window.entry(modelA);
modelB.setShape(&sphere);
modelB.setMaterial(Yellow);
modelB.glMoveTo(0.0, -2.0, 0.0);
window.entry(modelB);
for(c = 0; c < 5; c++)
{
modelC[c].setShape(&sphereA);
modelC[c].setMaterial(Yellow);
modelC[c].glMoveTo(c*5.0,30.0,10.0);
window.entry(modelC[c]);
}
window.setSize(800, 600);
window.setBGColor(0.6, 0.7, 0.8);
window.open();
window.setFPS(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);
}
posA = modelA.getPosition();
posB = modelB.getPosition();
vec = posB - posA;
distance = vec.dist();
if(distance < 10.0) {
window.remove(modelB);
} else {
modelA.setMaterial(Blue);
}
}
return 0;
}
Fine Kernel ToolKitというフレームワークを使用しております。
このプログラムはmodelAを動かしてmodelBに当てるとmodelBが消えるというものになっています。
それで、
今回の質問ですが、 modelAがmodelBに衝突したらmodelC[c]も消えるようにしたいです。
どうすればよいか教えていただきたいです。
それとできたらなのですが、modelC[c]はfor文で5個球がでるようになっているのですが、一回の衝突ごとに球が一個ずつ消えるようにしたいです。
回答お待ちしております。
Re: 当たり判定
Posted: 2014年2月28日(金) 12:14
by N.R
コード:
#include <FK/FK.h>
#include <FK/SimpleWindow.h>
int main(int argc, char *argv[])
{
fk_AppWindow window;
fk_AppWindow win;
fk_Sphere sphereA(8,2.0);
fk_Sphere sphere(8, 5.0);
fk_Model modelA, modelB, modelC[5];
fk_Vector posA, posB, posC, vec;
double distance;
int c;
int div;
modelA.setShape(&sphere);
modelA.setMaterial(Green);
modelA.glMoveTo(-20.0, 2.0, 0.0);
window.entry(modelA);
modelB.setShape(&sphere);
modelB.setMaterial(Yellow);
modelB.glMoveTo(0.0, -2.0, 0.0);
window.entry(modelB);
for(c = 0; c < 5; c++)
{
modelC[c].setShape(&sphereA);
modelC[c].setMaterial(Yellow);
modelC[c].glMoveTo(c*5.0,30.0,10.0);
window.entry(modelC[c]);
}
window.setSize(800, 600);
window.setBGColor(0.6, 0.7, 0.8);
window.open();
window.setFPS(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);
}
posA = modelA.getPosition();
posB = modelB.getPosition();
vec = posB - posA;
distance = vec.dist();
if(distance < 10.0) {
window.remove(modelB);
} else {
modelA.setMaterial(Blue);
}
}
return 0;
}
まずはcodeタグをきちんとする所からですかね
modelA、modelBの衝突時に modelC のどれが消える想定ですか?
Re: 当たり判定
Posted: 2014年2月28日(金) 16:21
by るる
codeタグすいませんでした。
そして回答ありがとうございます!
modelAがmodelBに衝突した時、modelCを左から、一回衝突するごとに一つ消えるようにしたいと思っております。
Re: 当たり判定
Posted: 2014年2月28日(金) 17:10
by N.R
modelC はライフゲージのようなものでしょうか。
衝突時に modelB を消しているので同様に modelC[ n ] を消せばよいと思います。
n は 0 から、消す度に +1。
分からない事はありますか?
Re: 当たり判定
Posted: 2014年2月28日(金) 17:20
by るる
はい。modelCはライフゲージを表しています。
n は 0 から、消す度に +1。これをどうやって書くのか分からないです・・・。
お手数ですが、よろしければ、書いていただけないでしょうか。
c言語初心者なものでほんとすいません・・・
Re: 当たり判定
Posted: 2014年2月28日(金) 17:31
by N.R
宣言は
int n = 0;
消した後に
n++;
ですね。
制限などは後に回してまずはそこまでやってみてはどうでしょう。
今のままだとmodelBが一度消えたらそれまでのようですけど
Re: 当たり判定
Posted: 2014年2月28日(金) 18:01
by るる
ありがとうございます。
実際にそこまでやってみます!
Re: 当たり判定
Posted: 2014年3月01日(土) 00:26
by るる
宣言は
int n = 0;
消した後に
n++;
と、教えてもらえましたが、実際にやろうと書こうとしたのですが、どう書けばいいか分からなかったです・・・
Re: 当たり判定
Posted: 2014年3月01日(土) 01:27
by へにっくす
るる さんが書きました:宣言は
int n = 0;
消した後に
n++;
と、教えてもらえましたが、実際にやろうと書こうとしたのですが、どう書けばいいか分からなかったです・・・
では、実際にモデルCを消す処理をどこに書いたらいいと思いますか。
コメントでいいので、書いてみてください。
書いたら、そのソースを掲示してください。
Re: 当たり判定
Posted: 2014年3月01日(土) 13:52
by るる
コード:
#include <FK/FK.h>
#include <FK/SimpleWindow.h>
int main(int argc, char *argv[])
{
fk_AppWindow window;
fk_AppWindow win;
fk_Sphere sphereA(8,2.0);
fk_Sphere sphere(8, 5.0);
fk_Model modelA,modelB,modelC[5];
fk_Vector posA, posB,posC, vec1,vec2;
double distance1,distance2;
int c;
int div;
int n = 0;
modelA.setShape(&sphere);
modelA.setMaterial(Green);
modelA.glMoveTo(-20.0, 2.0, 0.0);
window.entry(modelA);
modelB.setShape(&sphere);
modelB.setMaterial(Yellow);
modelB.glMoveTo(0.0, -2.0, 0.0);
window.entry(modelB);
for(c = 0; c < 5; c++)
{
modelC[c].setShape(&sphereA);
modelC[c].setMaterial(Yellow);
modelC[c].glMoveTo(c*5.0,30.0,10.0);
window.entry(modelC[c]);
}
window.setSize(800, 600);
window.setBGColor(0.6, 0.7, 0.8);
window.open();
window.setFPS(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);
}
posA = modelA.getPosition();
posB = modelB.getPosition();
posC = modelB.getPosition();
vec1 = posB - posA;
vec2 = posC - posA;
distance1 = vec1.dist();
distance2 = vec2.dist();
if(distance1 < 10.0) {//ここのif文にモデルCを消す処理を入れるのでしょうか?
modelB.setMaterial(Red);
} else {
modelB.setMaterial(Blue);
}
}
return 0;
}
返信遅くなりました。
63行目のif文にその処理を書くのでしょうか?・・・
Re: 当たり判定
Posted: 2014年3月01日(土) 14:56
by softya(ソフト屋)
この質問の方ですよね?
「FKでの表示 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=14629
場所としては合ってます。
ただ、C言語の勉強が不十分なので書き方がわからないんだと思います。
もしかすると1フレーム毎にnに1を足す。ってプログラムも書けないのではないですか?
【補足】
インデントが狂いまくっているので、初心者のうちに悪い癖は直してしまいましょう。
こちらのチェック3を御覧ください。
「mixcpp/投稿前チェックリスト - PukiWiki」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8
Re: 当たり判定
Posted: 2014年3月01日(土) 15:25
by るる
はい恥ずかしながら、1フレーム毎にnに1を足す。というプログラムを書けません。
インデントへの指摘ありがとうございます。!
Re: 当たり判定
Posted: 2014年3月01日(土) 15:28
by softya(ソフト屋)
基礎の基礎から、ちゃんと勉強したほうが良さそうです。
このプログラムは、ご自身で書かれたのですか?
どのぐらいの応用力が有るかわからないので、確認したいので次のプログラムを書いてみてもらえますか。
【問題】C言語で、1から100までの数字を足してprintfしてみてください。
Re: 当たり判定
Posted: 2014年3月01日(土) 16:05
by るる
その問題は、1~100までの値を全て足した値を、printfを使って画面上に表示しろということですよね?
Re: 当たり判定
Posted: 2014年3月01日(土) 16:09
by softya(ソフト屋)
そう言う事ですね。
ここで直球過ぎたのでちょっと問題を捻りることにしました。
【問題】C言語で、-1から-100までの数字を足して、足した合計をprintfしてみてください。
Re: 当たり判定
Posted: 2014年3月01日(土) 16:14
by るる
#include <stdio.h>
int main(void) {
printf("-5050\n");
return 0;
}
-5050でしょうか?
Re: 当たり判定
Posted: 2014年3月01日(土) 16:24
by softya(ソフト屋)
プログラムでループ文で書かないと意味無いですよ。
Re: 当たり判定
Posted: 2014年3月01日(土) 16:34
by るる
ループ文でですか・・・
すいません。その問題さえ分かりません。
まだ勉強が足らないようです・・・
もうちょっと勉強しないとそこらへんは理解できないでしょうから、今回は出直してきます。
そこらへんの勉強をしてからまた聞きにこようと思います。
無駄なお時間をとらせてしまいすいませんでした。
Re: 当たり判定
Posted: 2014年3月01日(土) 17:03
by softya(ソフト屋)
るる さんが書きました:ループ文でですか・・・
すいません。その問題さえ分かりません。
まだ勉強が足らないようです・・・
もうちょっと勉強しないとそこらへんは理解できないでしょうから、今回は出直してきます。
そこらへんの勉強をしてからまた聞きにこようと思います。
無駄なお時間をとらせてしまいすいませんでした。
別トピックで質問してもらうほうが良いかもしれません。
Re: 当たり判定
Posted: 2014年3月01日(土) 18:48
by るる
コード:
#include <FK/FK.h>
#include <FK/SimpleWindow.h>
int main(int argc, char *argv[])
{
fk_AppWindow window;
fk_AppWindow win;
fk_Sphere sphereA(8,2.0);
fk_Sphere sphere(8, 5.0);
fk_Model modelA,modelB,modelC[10];
fk_Vector posA, posB,posC, vec1,vec2;
double distance1,distance2;
int c;
int div;
modelA.setShape(&sphere);
modelA.setMaterial(Green);
modelA.glMoveTo(-20.0, 2.0, 0.0);
window.entry(modelA);
modelB.setShape(&sphere);
modelB.setMaterial(Yellow);
modelB.glMoveTo(0.0, -2.0, 0.0);
window.entry(modelB);
for(c = 0; c < 5; c++){
modelC[c].setShape(&sphereA);
modelC[c].setMaterial(Yellow);
modelC[c].glMoveTo(c*5.0,30.0,10.0);
window.entry(modelC[c]);
}
window.setSize(800, 600);
window.setBGColor(0.6, 0.7, 0.8);
window.open();
window.setFPS(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) {
int n =0;
window.remove(modelC[n]);
n++;
modelB.setMaterial(Red);
} else {
modelB.setMaterial(Blue);
}
}
return 0;
}
int n = 0;
消した後に
n++;
まですることができました。
その後にmodelC[n]は一回一つ消えたらそれで次のmodelC[n]が消えません。
どうすれば消えるようになるか試行錯誤してみたのですが、わかりませんでした。
どうすれば、一回消した後も、次のmodelC[n]は消えるようになるでしょうか?
Re: 当たり判定
Posted: 2014年3月01日(土) 18:57
by softya(ソフト屋)
残念ですが、そのコードではまったくうまく動きません。
インデントも直っていません。
これを分かってもらうためのステップ1としての-1から-100なのですが。
なにか答えを急いでるように見えますが、課題なのでしょうか?
Re: 当たり判定
Posted: 2014年3月01日(土) 19:15
by へにっくす
るる さんが書きました:その後にmodelC[n]は一回一つ消えたらそれで次のmodelC[n]が消えません。
どうすれば消えるようになるか試行錯誤してみたのですが、わかりませんでした。
どうすれば、一回消した後も、次のmodelC[n]は消えるようになるでしょうか?
softyaさんが出した次の問題を解いてから元のソースを修正してください。
【問題】C言語で、-1から-100までの数字を足して、足した合計をprintfしてみてください。
これに対するあなたの答えは、単に「足した合計をprintfした」だけです。
-1から-100を足す処理が抜けているんです。そのコードを掲示してください。
オフトピック
ものを覚える順番ってのがあるんです。
今あなたが聞いていることは、この問題を解くことで得られます。
(もちろんその応用で解くことになるのですが)
C言語 繰り返しでググればいいじゃん。
なぜその努力もしないのでしょうね?
(疑問があったらググる癖はつけた方がいいよ?)
Re: 当たり判定
Posted: 2014年3月01日(土) 19:29
by るる
ちょっと数日後に忙しくなるもので・・・
そして出していただいた問題なのですが
マイナスでの解き方がちょっとまだよくわかりません・・・
プラスの方はわかったのですが
#include <stdio.h>
int main(void)
{
int i;
for(i = 1; i<100; i++);
printf("%d\n",i*(i+ 1) /2);
return 0;
}
Re: 当たり判定
Posted: 2014年3月01日(土) 19:36
by へにっくす
残念!!
確かにfor文を使っているが、それだと1から100を足したことにはならないよ?
あなたの疑問の解決になってません。
コード:
#include <stdio.h>
int main(void)
{
int i;
for(i = 1; i<100; i++); // これだと単に1から100をインクリメントしてるだけ。足してないよね。
printf("%d\n",i*(i+ 1) /2); // これは数式で出してるだけですよ。
return 0;
}
再提出!!
Re: 当たり判定
Posted: 2014年3月01日(土) 19:45
by るる
なかなか難しい・・・
了解です!
Re: 当たり判定
Posted: 2014年3月01日(土) 19:56
by へにっくす
そうだなあ・・・
for文まではできてるから、とりあえず穴埋め問題にしてみました。

- この中の①と②を記述してください。
- dixq_net_t14732_1.png (6.28 KiB) 閲覧数: 14576 回
Re: 当たり判定
Posted: 2014年3月01日(土) 20:03
by softya(ソフト屋)
順次処理と言うイメージが出来ていないのが原因だと思います。
プログラム=数学じゃないです。
ここを分からないと、次に進めなので急ぐべきものじゃないと思います。
ちなみに、#1の質問の内容とるるさんの今の理解レベルを例えると足し算の出来ない子供が小学4年生の算数問題をやろうとしている感じです。
Re: 当たり判定
Posted: 2014年3月01日(土) 20:12
by るる
返信遅くなりました!
①goukei= goukei + i;
②printf(" %d:%d\n",i, goukei);
コード:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
int b =0 ;
for(i=0; i<101; i++)
{
b = b + i;
printf(" %d:%d\n",i, b);
}
return 0;
}
これでよいでしょうか
Re: 当たり判定
Posted: 2014年3月01日(土) 20:16
by るる
さっきのはプラスでやっていたので、
コード:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i,goukei =0;
for(i= -1; i>-100; i--)
{
goukei = goukei - i;
printf(" %d:%d\n",i, goukei);
}
return 0;
}
マイナスの方です
Re: 当たり判定
Posted: 2014年3月01日(土) 20:19
by softya(ソフト屋)
えーと、惜しいです。
printf(" %d:%d\n",i, goukei); //情報として意味が無いので、iがいらないです。 へにっくすさんの穴埋めにも書かれていないものです。
あと、ご自分で書かれたコードが0から始まるため101回表示していますが意図された行為でしょうか。
私の求めたのは、合計を出して欲しいだけなのですが。
2つ目のマイナスの方は、答えが間違っています。
次のステップは、これを聞いてからにします。
Re: 当たり判定
Posted: 2014年3月01日(土) 20:33
by るる
試行錯誤してたら、さっきのみたいになっちゃいました・・・
これでどうでしょうか?
[code=cpp#include <stdio.h>
int main(void)
{
int i,goukei =0;
for(i= -1; i>=-100; i--)
{
goukei = goukei - i;
}
printf(" %d\n", goukei);
return 0;
}
][/code]
Re: 当たり判定
Posted: 2014年3月01日(土) 20:34
by るる
試行錯誤してたら、さっきのみたいになっちゃいました・・・
これでどうでしょうか?
[code=cpp#include <stdio.h>
int main(void)
{
int i,goukei =0;
for(i= -1; i>=-100; i--)
{
goukei = goukei - i;
}
printf(" %d\n", goukei);
return 0;
}
][/code]
Re: 当たり判定
Posted: 2014年3月01日(土) 20:42
by softya(ソフト屋)
2回投稿されていますよ。codeタグも間違っているので必ずプレビューで確認して下さい。
実行結果も、さっきまで合っていた部分が間違っています。動作確認をお願いします。
慌てすぎてませんか?
Re: 当たり判定
Posted: 2014年3月01日(土) 20:47
by るる
そうですね、慌ててたかもしれません・・・
今度はどうでしょうか?
コード:
#include <stdio.h>
int main(void)
{
int i,goukei =0;
for(i= -1; i>=-100; i--)
{
goukei = goukei - i;
}
printf("%d\n", goukei);
return 0;
}
Re: 当たり判定
Posted: 2014年3月01日(土) 20:51
by softya(ソフト屋)
全然の落ち着いてないです。
焦ってもバグを増産するだけなので落ち着きましょう。
インデントもおかしいままですし、答えも違っています。
このプログラムを実行した結果を貼り付けてもらえば客観的にみれますかね。
Re: 当たり判定
Posted: 2014年3月01日(土) 21:01
by るる
実行結果は
5050
続行するにはキーを押してください
とでます
Re: 当たり判定
Posted: 2014年3月01日(土) 21:02
by へにっくす
なんで引き算になってるの?
-1から-100を「足した」結果を出すんだよ?
問題の意味をちゃんと考えましょう。
(だから落ち着いて答えろと言われるのです)
修正したソースを再度掲示してください。
インデントも直してね。
(最低限の礼儀です)
Re: 当たり判定
Posted: 2014年3月01日(土) 21:23
by るる
こうでしょうか?
実行結果は-5050となりました。
それとインデントはこうでしょうか?
すいません。あまりよく分からないもので。
コード:
#include <stdio.h>
int main(void){
int i,goukei =0;
for(i= -1; i>=-100; i--){
goukei = goukei + i;
}
printf("%d\n", goukei);
return 0;
}
Re: 当たり判定
Posted: 2014年3月01日(土) 22:02
by softya(ソフト屋)
実行結果は正解です。
No: 28,No: 29ではインデントが合っていましたので何故再び狂うんでしょうか。
Re: 当たり判定
Posted: 2014年3月01日(土) 22:09
by るる
すいません。まだどこがしっかりした場所なのかわかっていなくてこうなってしまいました。
Re: 当たり判定
Posted: 2014年3月01日(土) 22:14
by softya(ソフト屋)
それではインデントを直してみてください。
それとは別にステップ2です。インデントの修正は先に報告をお願いします。
このプログラムに-90以下だったらnに1を足すプログラムに機能追加して下さい。nの初期値は0です。
そうした上で、最後のprintfでnの値も表示して下さい。
Re: 当たり判定
Posted: 2014年3月01日(土) 22:21
by るる
すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。
Re: 当たり判定
Posted: 2014年3月01日(土) 22:44
by softya(ソフト屋)
るる さんが書きました:すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。
こちらは何時でも構いません。
時間の有るときにじっくり取り組んで下さい。
Re: 当たり判定
Posted: 2014年3月01日(土) 22:46
by へにっくす
別にすぐに答えなくてもよいのですよ。
#そこが掲示板のいいところ。
インデントについて、こちらを参考にしてください。
(No.28とNo.29がちゃんとインデントしてるのは、たぶんNo.24を参考にしたからでしょうね)
読みやすいプログラムを書くには-プログラミング全般
基本、プログラムを組む人は、処理の流れを追いやすくするために必ずインデントを行います。
忘れないでくださいね。
softyaさんが示した通り、
インデントを行ったソースを掲示してから、
ステップ2で出した問題を解いてくださいね。
Re: 当たり判定
Posted: 2014年3月03日(月) 11:13
by N.R
色々と積み上げても議題者さんが混乱するだけだと思うので最初のソースに戻ります。
強制ではないので議題者さんは取り組みやすい方を選んで返答してもらえればと思います。
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 との接触をみたいようにも思えますね。
仕様に変更があったならその辺の解説もお願いします
Re: 当たり判定
Posted: 2014年3月04日(火) 22:31
by るる
やっと暇ができましたので来ました。
へにっくすさん、softyaさんすいません。
N.Rさんの問題をやることにします。お二人とも多くのことを学ばせていただき本当にありがとうございました。
何が問題なのかは、
今の状態ではn++;が何の意味もないことでしょうか?
仕様変更について、
modelAがmodelBに衝突したら、消えるのではなく赤に変化するようにしました。
modelC[n]の方は、modelAがmodelBに衝突したら一個消えるという仕様のままです。
どうぞよろしくお願いします。
Re: 当たり判定
Posted: 2014年3月04日(火) 22:42
by softya(ソフト屋)
私の方針は根本理解ですので、N.Rさんとは方針が違いました。
N.Rさんの方針を選ばれるということなので、後はN.Rさんにお任せしたいと思います。
一言付け加えるならば、「問題はここだと思います」だけじゃなく、問題点についてこういう検証をしてみました。
あるいは、こうすれば良いんじゃないかと試してみました。と踏み込んで考えられるとご自身が前進できると思います。
Re: 当たり判定
Posted: 2014年3月05日(水) 11:37
by N.R
>今の状態ではn++;が何の意味もないことでしょうか?
というのは正解です。
なぜ意味をなさないのか、を考えてみてください
実行すると A を操作して動かせるようになっていると思います。
プログラムというものは上から実行されて順番に下へ、一番下まで来たら終了する
というのが基本です。
運動会でもどの順で演目を進めるかというのを書いたものをプログラムと呼びますよね。
一番下で終了する、のに終了していないという事は…
という事を踏まえてコンピュータはこのプログラムをどう実行しているか
を考えてみるとわかってくるかと思います。
次の回答では答えを書いてしまいますのでまずは一度考えてみてください
> softya(ソフト屋)さん
根本的に理解しないといけないのは賛成ですが、当人が楽しくなくてはやはり気持ちが離れてしまいますので
多少遠回りでもやり易い方向から攻めてみたいと思います。
Re: 当たり判定
Posted: 2014年3月05日(水) 12:40
by るる
>なぜ意味をなさないのか、を考えてみてください
今のままではn++をして数はプラスされていくけど、消すプログラムを付け加えないと、ただ数がプラスされていくだけ、とかでしょうか?
>という事を踏まえてコンピュータはこのプログラムをどう実行しているか
終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか。それと最後のreturn 0に辿りつけていないとかもあったりするのでしょうか?
Re: 当たり判定
Posted: 2014年3月05日(水) 14:15
by N.R
>終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか
そうですね
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: 当たり判定
Posted: 2014年3月05日(水) 14:29
by るる
その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください
目標の実行結果は、一度の衝突で、一個ずつ消していくという風にしようとしています。それに対して今回の実行結果は一度の衝突ですべての球が消えてしまいました。
コード:
if(distance1 < 10.0) {
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]);
modelB.setMaterial(Red);
}
Re: 当たり判定
Posted: 2014年3月05日(水) 14:56
by N.R
結果は期待と違いますね
ここでは 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 です
: 以降ずっと繰り返す
n の値はどうなっていて、C のどれが消えていますか?
そしてどうすればよいと思いますか(実行しなくていいですよ)
Re: 当たり判定
Posted: 2014年3月05日(水) 15:08
by るる
>n の値はどうなっていて、C のどれが消えていますか?
nの値は0と1をずっと繰り返しループしています。Cはいちばん最初の0のCが消えます。
>そしてどうすればよいと思いますか
この0と1の繰り返しループをやめさせて、1,2,3となっていくようにすればいいと思います。
Re: 当たり判定
Posted: 2014年3月05日(水) 15:35
by N.R
>nの値は0と1をずっと繰り返しループしています。Cはいちばん最初の0のCが消えます。
そうですね。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: 当たり判定
Posted: 2014年3月05日(水) 15:54
by るる
>このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです
そうですね int n = 0;が中だと0,1を繰り返す。考えればわかることでした・・・
>この結果がどう期待と違い、どうればいいと思うかを考えてみてください
今回の結果では接触すると5個まとめて消えてしまいました。
やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます。
>時間かけているのはじらしているのではなく
プログラムは書いた通りにしか動かない
期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。
はい、わざわざ時間をかけて教えていただき本当に感謝しております。
すぐに答えを出していただいても、やはり理解は難しいでしょうから、こうやっていただき理解をより深めることができております。
Re: 当たり判定
Posted: 2014年3月05日(水) 16:05
by N.R
>今回の結果では接触すると5個まとめて消えてしまいました。
そうですね。
A と B が接触して C を1つ消す
でも B は色が変わるだけでその場に残り続けるので
次の瞬間(フレーム)にもやはり接触して次の C が消える
ので文字通り瞬く間に全部消えてしまっていると思います
>やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます
そうですね。
具体的にどうするかが難しいところですが、まずは modelC の動作を確実なものにしたい所ですので
接触時に A を元の位置に戻してみてはどうでしょうか
コード:
if(distance1 < 10.0) {
window.remove(modelC[n]);
if( n < 5 )//これは今は気にしない
n++;
modelB.setMaterial(Red);
modelA.glMoveTo(-20.0, 2.0, 0.0);
} else {
modelB.setMaterial(Blue);
}
}
今度は色が変わるのが一瞬のはずです
Re: 当たり判定
Posted: 2014年3月05日(水) 16:17
by るる
実際に動かしてみたところ、色の変化は速すぎて見えなくなり、球は一つ消えて、元の位置に戻るという風になっております。
なるほど・・・glmovetoで当たった瞬間に戻すという手もあったのですか・・・全く思い付きませんでした・・・
プログラミングは発想力が大事だと改めてわかりました・・・
Re: 当たり判定
Posted: 2014年3月05日(水) 16:39
by N.R
今は B は動かないですが、画面をバウンドするように動かせばゲームっぽくなりますね。
n が 5 になったらゲームオーバーとしてループを抜けるようにすると更に。
色が一定時間だけ変わって元に戻るようにする、なと色々出来る事はあると思います。
作ったものが動く面白さが先に分かる方がよいと根本的な事は省いていますが
先に進む時は softyaさんの指摘するような問題にぶつかる時が来ると思いますが
今の物を作りながら覚えていって良いと思います。
インデントも重要ですね
個人のファッションにポリシーがあっても公の場に出る時は正装しなくてはなりません
同じようにコードを人に見せる時はインデントも覚える必要があります。
Re: 当たり判定
Posted: 2014年3月05日(水) 16:50
by るる
そうですね、より改良を試みてゲームを完成させようと思います。
インデントなども、これからのことを考えると、ちゃんとしなければならないでしょうから、しっかり直せるようにします。!
丁寧に教えていただきありがとうございます!
Re: 当たり判定
Posted: 2014年3月05日(水) 17:10
by N.R
解決でしたら解決チェックをお願いします。
次の疑問が出たらまたトピックを立ててください
Re: 当たり判定
Posted: 2014年3月05日(水) 18:41
by るる
解決しました!