当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
るる

当たり判定

#1

投稿記事 by るる » 11年前

コード:

#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個球がでるようになっているのですが、一回の衝突ごとに球が一個ずつ消えるようにしたいです。
回答お待ちしております。

N.R

Re: 当たり判定

#2

投稿記事 by N.R » 11年前

コード:

#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: 当たり判定

#3

投稿記事 by るる » 11年前

codeタグすいませんでした。
そして回答ありがとうございます!

modelAがmodelBに衝突した時、modelCを左から、一回衝突するごとに一つ消えるようにしたいと思っております。

N.R

Re: 当たり判定

#4

投稿記事 by N.R » 11年前

modelC はライフゲージのようなものでしょうか。

衝突時に modelB を消しているので同様に modelC[ n ] を消せばよいと思います。
n は 0 から、消す度に +1。
分からない事はありますか?

るる

Re: 当たり判定

#5

投稿記事 by るる » 11年前

はい。modelCはライフゲージを表しています。
n は 0 から、消す度に +1。これをどうやって書くのか分からないです・・・。
お手数ですが、よろしければ、書いていただけないでしょうか。
c言語初心者なものでほんとすいません・・・

N.R

Re: 当たり判定

#6

投稿記事 by N.R » 11年前

宣言は
int n = 0;
消した後に
n++;
ですね。
制限などは後に回してまずはそこまでやってみてはどうでしょう。
今のままだとmodelBが一度消えたらそれまでのようですけど

るる

Re: 当たり判定

#7

投稿記事 by るる » 11年前

ありがとうございます。
実際にそこまでやってみます!

るる

Re: 当たり判定

#8

投稿記事 by るる » 11年前

宣言は
int n = 0;
消した後に
n++;
と、教えてもらえましたが、実際にやろうと書こうとしたのですが、どう書けばいいか分からなかったです・・・

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#9

投稿記事 by へにっくす » 11年前

るる さんが書きました:宣言は
int n = 0;
消した後に
n++;
と、教えてもらえましたが、実際にやろうと書こうとしたのですが、どう書けばいいか分からなかったです・・・
では、実際にモデルCを消す処理をどこに書いたらいいと思いますか。
コメントでいいので、書いてみてください。
書いたら、そのソースを掲示してください。
written by へにっくす

るる

Re: 当たり判定

#10

投稿記事 by るる » 11年前

コード:

#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文にその処理を書くのでしょうか?・・・

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

Re: 当たり判定

#11

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

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

るる

Re: 当たり判定

#12

投稿記事 by るる » 11年前

はい恥ずかしながら、1フレーム毎にnに1を足す。というプログラムを書けません。

インデントへの指摘ありがとうございます。!

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

Re: 当たり判定

#13

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

基礎の基礎から、ちゃんと勉強したほうが良さそうです。
このプログラムは、ご自身で書かれたのですか?

どのぐらいの応用力が有るかわからないので、確認したいので次のプログラムを書いてみてもらえますか。
【問題】C言語で、1から100までの数字を足してprintfしてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#14

投稿記事 by るる » 11年前

その問題は、1~100までの値を全て足した値を、printfを使って画面上に表示しろということですよね?

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

Re: 当たり判定

#15

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

そう言う事ですね。
ここで直球過ぎたのでちょっと問題を捻りることにしました。
【問題】C言語で、-1から-100までの数字を足して、足した合計をprintfしてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#16

投稿記事 by るる » 11年前

#include <stdio.h>
int main(void) {
printf("-5050\n");
return 0;
}

-5050でしょうか?

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

Re: 当たり判定

#17

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

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

るる

Re: 当たり判定

#18

投稿記事 by るる » 11年前

ループ文でですか・・・
すいません。その問題さえ分かりません。
まだ勉強が足らないようです・・・
もうちょっと勉強しないとそこらへんは理解できないでしょうから、今回は出直してきます。

そこらへんの勉強をしてからまた聞きにこようと思います。
無駄なお時間をとらせてしまいすいませんでした。

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

Re: 当たり判定

#19

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

るる さんが書きました:ループ文でですか・・・
すいません。その問題さえ分かりません。
まだ勉強が足らないようです・・・
もうちょっと勉強しないとそこらへんは理解できないでしょうから、今回は出直してきます。

そこらへんの勉強をしてからまた聞きにこようと思います。
無駄なお時間をとらせてしまいすいませんでした。
別トピックで質問してもらうほうが良いかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#20

投稿記事 by るる » 11年前

コード:

#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]は消えるようになるでしょうか?

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

Re: 当たり判定

#21

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

残念ですが、そのコードではまったくうまく動きません。
インデントも直っていません。
これを分かってもらうためのステップ1としての-1から-100なのですが。

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

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#22

投稿記事 by へにっくす » 11年前

るる さんが書きました:その後にmodelC[n]は一回一つ消えたらそれで次のmodelC[n]が消えません。
どうすれば消えるようになるか試行錯誤してみたのですが、わかりませんでした。
どうすれば、一回消した後も、次のmodelC[n]は消えるようになるでしょうか?
softyaさんが出した次の問題を解いてから元のソースを修正してください。
【問題】C言語で、-1から-100までの数字を足して、足した合計をprintfしてみてください。
これに対するあなたの答えは、単に「足した合計をprintfした」だけです。
-1から-100を足す処理が抜けているんです。そのコードを掲示してください。

オフトピック
ものを覚える順番ってのがあるんです。
今あなたが聞いていることは、この問題を解くことで得られます。
(もちろんその応用で解くことになるのですが)
C言語 繰り返しでググればいいじゃん。
なぜその努力もしないのでしょうね?
(疑問があったらググる癖はつけた方がいいよ?)
最後に編集したユーザー へにっくす on 2014年3月01日(土) 19:32 [ 編集 1 回目 ]
written by へにっくす

るる

Re: 当たり判定

#23

投稿記事 by るる » 11年前

ちょっと数日後に忙しくなるもので・・・

そして出していただいた問題なのですが
マイナスでの解き方がちょっとまだよくわかりません・・・
プラスの方はわかったのですが
#include <stdio.h>
int main(void)
{
int i;
for(i = 1; i<100; i++);
printf("%d\n",i*(i+ 1) /2);
return 0;
}

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#24

投稿記事 by へにっくす » 11年前

残念!!
確かに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;
}
再提出!!
written by へにっくす

るる

Re: 当たり判定

#25

投稿記事 by るる » 11年前

なかなか難しい・・・
了解です!

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#26

投稿記事 by へにっくす » 11年前

そうだなあ・・・
for文まではできてるから、とりあえず穴埋め問題にしてみました。
dixq_net_t14732_1.png
この中の①と②を記述してください。
dixq_net_t14732_1.png (6.28 KiB) 閲覧数: 14574 回
written by へにっくす

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

Re: 当たり判定

#27

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

順次処理と言うイメージが出来ていないのが原因だと思います。
プログラム=数学じゃないです。
ここを分からないと、次に進めなので急ぐべきものじゃないと思います。

ちなみに、#1の質問の内容とるるさんの今の理解レベルを例えると足し算の出来ない子供が小学4年生の算数問題をやろうとしている感じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#28

投稿記事 by るる » 11年前

返信遅くなりました!
①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: 当たり判定

#29

投稿記事 by るる » 11年前

さっきのはプラスでやっていたので、

コード:

#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;
} 
マイナスの方です

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

Re: 当たり判定

#30

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

えーと、惜しいです。
printf(" %d:%d\n",i, goukei); //情報として意味が無いので、iがいらないです。 へにっくすさんの穴埋めにも書かれていないものです。
あと、ご自分で書かれたコードが0から始まるため101回表示していますが意図された行為でしょうか。
私の求めたのは、合計を出して欲しいだけなのですが。

2つ目のマイナスの方は、答えが間違っています。

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

るる

Re: 当たり判定

#31

投稿記事 by るる » 11年前

試行錯誤してたら、さっきのみたいになっちゃいました・・・

これでどうでしょうか?
[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: 当たり判定

#32

投稿記事 by るる » 11年前

試行錯誤してたら、さっきのみたいになっちゃいました・・・

これでどうでしょうか?
[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]

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

Re: 当たり判定

#33

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

2回投稿されていますよ。codeタグも間違っているので必ずプレビューで確認して下さい。
実行結果も、さっきまで合っていた部分が間違っています。動作確認をお願いします。
慌てすぎてませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#34

投稿記事 by るる » 11年前

そうですね、慌ててたかもしれません・・・
今度はどうでしょうか?

コード:

#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;
} 

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

Re: 当たり判定

#35

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

全然の落ち着いてないです。
焦ってもバグを増産するだけなので落ち着きましょう。
インデントもおかしいままですし、答えも違っています。
このプログラムを実行した結果を貼り付けてもらえば客観的にみれますかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#36

投稿記事 by るる » 11年前

実行結果は
5050
続行するにはキーを押してください

とでます

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#37

投稿記事 by へにっくす » 11年前

なんで引き算になってるの?
-1から-100を「足した」結果を出すんだよ?
問題の意味をちゃんと考えましょう。
(だから落ち着いて答えろと言われるのです)

修正したソースを再度掲示してください。
インデントも直してね。
(最低限の礼儀です)
written by へにっくす

るる

Re: 当たり判定

#38

投稿記事 by るる » 11年前

こうでしょうか?
実行結果は-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;
} 

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

Re: 当たり判定

#39

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

実行結果は正解です。
No: 28,No: 29ではインデントが合っていましたので何故再び狂うんでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#40

投稿記事 by るる » 11年前

すいません。まだどこがしっかりした場所なのかわかっていなくてこうなってしまいました。

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

Re: 当たり判定

#41

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

それではインデントを直してみてください。
それとは別にステップ2です。インデントの修正は先に報告をお願いします。

このプログラムに-90以下だったらnに1を足すプログラムに機能追加して下さい。nの初期値は0です。
そうした上で、最後のprintfでnの値も表示して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

るる

Re: 当たり判定

#42

投稿記事 by るる » 11年前

すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。

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

Re: 当たり判定

#43

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

るる さんが書きました:すいません
そろそろ夜勤が始まりますので、また後日答えをお伝えする感じでいいでしょうか?
お手伝いいただき本当にありがとうございました。
こちらは何時でも構いません。
時間の有るときにじっくり取り組んで下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 当たり判定

#44

投稿記事 by へにっくす » 11年前

別にすぐに答えなくてもよいのですよ。
#そこが掲示板のいいところ。

インデントについて、こちらを参考にしてください。
(No.28とNo.29がちゃんとインデントしてるのは、たぶんNo.24を参考にしたからでしょうね)
読みやすいプログラムを書くには-プログラミング全般
基本、プログラムを組む人は、処理の流れを追いやすくするために必ずインデントを行います。
忘れないでくださいね。

softyaさんが示した通り、
インデントを行ったソースを掲示してから、
ステップ2で出した問題を解いてくださいね。
written by へにっくす

N.R

Re: 当たり判定

#45

投稿記事 by N.R » 11年前

色々と積み上げても議題者さんが混乱するだけだと思うので最初のソースに戻ります。
強制ではないので議題者さんは取り組みやすい方を選んで返答してもらえればと思います。

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: 当たり判定

#46

投稿記事 by るる » 11年前

やっと暇ができましたので来ました。
へにっくすさん、softyaさんすいません。
N.Rさんの問題をやることにします。お二人とも多くのことを学ばせていただき本当にありがとうございました。



何が問題なのかは、
今の状態ではn++;が何の意味もないことでしょうか?

仕様変更について、

modelAがmodelBに衝突したら、消えるのではなく赤に変化するようにしました。
modelC[n]の方は、modelAがmodelBに衝突したら一個消えるという仕様のままです。

どうぞよろしくお願いします。

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

Re: 当たり判定

#47

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

私の方針は根本理解ですので、N.Rさんとは方針が違いました。
N.Rさんの方針を選ばれるということなので、後はN.Rさんにお任せしたいと思います。

一言付け加えるならば、「問題はここだと思います」だけじゃなく、問題点についてこういう検証をしてみました。
あるいは、こうすれば良いんじゃないかと試してみました。と踏み込んで考えられるとご自身が前進できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

N.R

Re: 当たり判定

#48

投稿記事 by N.R » 11年前

>今の状態ではn++;が何の意味もないことでしょうか?
というのは正解です。

なぜ意味をなさないのか、を考えてみてください

実行すると A を操作して動かせるようになっていると思います。

プログラムというものは上から実行されて順番に下へ、一番下まで来たら終了する
というのが基本です。
運動会でもどの順で演目を進めるかというのを書いたものをプログラムと呼びますよね。

一番下で終了する、のに終了していないという事は…
という事を踏まえてコンピュータはこのプログラムをどう実行しているか
を考えてみるとわかってくるかと思います。

次の回答では答えを書いてしまいますのでまずは一度考えてみてください

> softya(ソフト屋)さん
根本的に理解しないといけないのは賛成ですが、当人が楽しくなくてはやはり気持ちが離れてしまいますので
多少遠回りでもやり易い方向から攻めてみたいと思います。

るる

Re: 当たり判定

#49

投稿記事 by るる » 11年前

>なぜ意味をなさないのか、を考えてみてください

今のままではn++をして数はプラスされていくけど、消すプログラムを付け加えないと、ただ数がプラスされていくだけ、とかでしょうか?




>という事を踏まえてコンピュータはこのプログラムをどう実行しているか

終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか。それと最後のreturn 0に辿りつけていないとかもあったりするのでしょうか?

N.R

Re: 当たり判定

#50

投稿記事 by N.R » 11年前

>終了していないということは終わる為の条件を満たしていないから何度もループしてしまっているということでしょうか
そうですね
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: 当たり判定

#51

投稿記事 by るる » 11年前

その実行結果が期待しているものと同じか、違う場合はどう違うかを知らせてください

目標の実行結果は、一度の衝突で、一個ずつ消していくという風にしようとしています。それに対して今回の実行結果は一度の衝突ですべての球が消えてしまいました。

コード:

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);
}

N.R

Re: 当たり判定

#52

投稿記事 by N.R » 11年前

結果は期待と違いますね
ここでは 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: 当たり判定

#53

投稿記事 by るる » 11年前

>n の値はどうなっていて、C のどれが消えていますか?
nの値は0と1をずっと繰り返しループしています。Cはいちばん最初の0のCが消えます。

>そしてどうすればよいと思いますか
この0と1の繰り返しループをやめさせて、1,2,3となっていくようにすればいいと思います。

N.R

Re: 当たり判定

#54

投稿記事 by N.R » 11年前

>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: 当たり判定

#55

投稿記事 by るる » 11年前

>このループの中に「1つずつ消す」をうまく入れてやらないといけないわけです

そうですね int n = 0;が中だと0,1を繰り返す。考えればわかることでした・・・


>この結果がどう期待と違い、どうればいいと思うかを考えてみてください

今回の結果では接触すると5個まとめて消えてしまいました。
やはり一つずつ消す、制限?のようなプログラムを入れるとよいと考えます。



>時間かけているのはじらしているのではなく
 プログラムは書いた通りにしか動かない
 期待した動作と結果が違うのは期待しているイメージが違うから
でイメージの方を修繕していってほしいからです。

はい、わざわざ時間をかけて教えていただき本当に感謝しております。
すぐに答えを出していただいても、やはり理解は難しいでしょうから、こうやっていただき理解をより深めることができております。

N.R

Re: 当たり判定

#56

投稿記事 by N.R » 11年前

>今回の結果では接触すると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: 当たり判定

#57

投稿記事 by るる » 11年前

実際に動かしてみたところ、色の変化は速すぎて見えなくなり、球は一つ消えて、元の位置に戻るという風になっております。

なるほど・・・glmovetoで当たった瞬間に戻すという手もあったのですか・・・全く思い付きませんでした・・・
プログラミングは発想力が大事だと改めてわかりました・・・

N.R

Re: 当たり判定

#58

投稿記事 by N.R » 11年前

今は B は動かないですが、画面をバウンドするように動かせばゲームっぽくなりますね。
n が 5 になったらゲームオーバーとしてループを抜けるようにすると更に。
色が一定時間だけ変わって元に戻るようにする、なと色々出来る事はあると思います。


作ったものが動く面白さが先に分かる方がよいと根本的な事は省いていますが
先に進む時は softyaさんの指摘するような問題にぶつかる時が来ると思いますが
今の物を作りながら覚えていって良いと思います。

インデントも重要ですね
個人のファッションにポリシーがあっても公の場に出る時は正装しなくてはなりません
同じようにコードを人に見せる時はインデントも覚える必要があります。

るる

Re: 当たり判定

#59

投稿記事 by るる » 11年前

そうですね、より改良を試みてゲームを完成させようと思います。
インデントなども、これからのことを考えると、ちゃんとしなければならないでしょうから、しっかり直せるようにします。!

丁寧に教えていただきありがとうございます!

N.R

Re: 当たり判定

#60

投稿記事 by N.R » 11年前

解決でしたら解決チェックをお願いします。
次の疑問が出たらまたトピックを立ててください

るる

Re: 当たり判定

#61

投稿記事 by るる » 11年前

解決しました!

閉鎖

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