龍神録スコアの実装

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

龍神録スコアの実装

#1

投稿記事 by ゼロシキ » 10年前

龍神録のスコアで、
アイテムをとった時、自機の弾が敵にヒットし(続け)ている時、
ボスを倒したときのスコアをそれぞれ実装したいんですが、何をどこに書けばいいのかわかりません

分かる方いましたらアドバイスお願いします。
C++の道は長く険しくも、楽しけり

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 龍神録スコアの実装

#2

投稿記事 by amehirune » 10年前

アイテムを取得した時、
自弾が敵にヒットした時、
ボスが死んだ時
それぞれの瞬間に、ch.scoreに増加点数分だけ入れてあげればいいと思います。

龍神録の場合は、館や配布コードの方に細かくコメントが残されていますので、
初心者の方でもわりかしどれが何の関数なのかわかりやすくなってると思います。

【捕捉】
アイテムを取得した時→out.cppに
ボスが死んだ時→boss_shot.cppに
龍神録通りに作っているならば、以上のファイルに関数(的なの含む)が存在するはずです。
自弾が敵にヒットした時は、よく覚えていませんが、ダメージを与える関数あたりに入れるのもアリでしょう。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

ゼロシキ
記事: 4
登録日時: 10年前

Re: 龍神録スコアの実装

#3

投稿記事 by ゼロシキ » 10年前

ボスが倒れたとき、自機ショットが敵にヒットしているときの得点増処理はできたんですが、どうしても得点アイテムを取得した時の処理がおかしいところがあり、
パワーアイテムをとった時スコアに反映され、パワーや得点アイテムを同時に複数とったときにスコアが増えない、といったことが起きるんですが、どうしたらいいのでしょうか
C++の道は長く険しくも、楽しけり

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 龍神録スコアの実装

#4

投稿記事 by amehirune » 10年前

そのソースコードを提示していただければ、回答しやすくて助かります。
おそらく、得点増加処理を行うコードを追加する位置が間違っているのだと思われますが…

因みに追加すべき場所はch_and_item関数だったと思います。
できるだけ考えてほしいので、明示的なソースコードは公開しません。希望があれば言ってください。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

ゼロシキ
記事: 4
登録日時: 10年前

Re: 龍神録スコアの実装

#5

投稿記事 by ゼロシキ » 10年前

分かりました。コードはこんな感じなんですが、どうでしょうか

コード:

//アイテムとの接触
//アイテム 0:小パワー 1:小点 2:弾点 3:小金 4:大パワー 5:大金
void ch_and_item(){
	for(int i=0;i<ITEM_MAX;i++){
		if(item[i].flag>0){
			double x=item[i].x-ch.x,y=item[i].y-ch.y;
			if(x*x+y*y<ITEM_HIT_BOX*ITEM_HIT_BOX){
				switch(item[i].knd){
					case 0:	ch.power+=3; break;
					case 1:	ch.point+=1; break;
					case 2:	ch.score+=1; break;
					case 3:	ch.money+=1; break;
					case 4:	ch.power+=50;break;
					case 5:	ch.money+=10;break;
				}
				if(ch.power>500)ch.power=500;
				if(ch.point>9999)ch.point=9999;
				if(ch.money>999999)ch.money=999999;
				if(ch.score>999999999)ch.score=999999999;
				item[i].flag=0;
				se_flag[34]=1;
				if (item[2].flag>0){
					ch.score += 1000;
				}
			}
		}
	}
}

C++の道は長く険しくも、楽しけり

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 龍神録スコアの実装

#6

投稿記事 by amehirune » 10年前

返信が遅くなってしまい、申し訳ありません。
ゼロシキ さんが書きました:

コード:

//アイテムとの接触
//アイテム 0:小パワー 1:小点 2:弾点 3:小金 4:大パワー 5:大金
void ch_and_item(){
	for(int i=0;i<ITEM_MAX;i++){
		if(item[i].flag>0){
			double x=item[i].x-ch.x,y=item[i].y-ch.y;
			if(x*x+y*y<ITEM_HIT_BOX*ITEM_HIT_BOX){
				switch(item[i].knd){
					case 0:	ch.power+=3; break;
					case 1:	ch.point+=1; break;
					case 2:	ch.score+=1; break;
					case 3:	ch.money+=1; break;
					case 4:	ch.power+=50;break;
					case 5:	ch.money+=10;break;
				}
				if(ch.power>500)ch.power=500;
				if(ch.point>9999)ch.point=9999;
				if(ch.money>999999)ch.money=999999;
				if(ch.score>999999999)ch.score=999999999;
				item[i].flag=0;
				se_flag[34]=1;
				if (item[2].flag>0){
					ch.score += 1000;
				}
			}
		}
	}
}

これだと、forのループで回してあり、さらにitem.flag=0という文があるため、item[2].flagは確実に0です。
さらに言うと、item[2]は状態変数として使用されていてもされていなくても、そこで得点を加算するか計算する、という式になってしまっています。

…わかりにくいですね(汗)
もうちょっと丁寧に説明します。
龍神録では、アイテムに関する構造体が宣言されています。flagは「アイテムが発生しているかどうか」で、kndはその種類です。
まず、flagが1かどうか(0より大きいかどうか)で、発生しているかどうかを判断します。
その後、もしアイテム取得範囲内にアイテムの座標があれば、取得した、とし、
実際にそのアイテムに応じたパワーアップなどを行います。

問題はここからです。
アイテムは発生した場合、変数の要素数の少ない方から順番に登録されていきます。
0番があいていたら0番にPアイテム、
1番があいていたら1番にPアイテム…のように、です。
では、2番のところには何のアイテムがあるのでしょうか?
考えてもらったらわかりますが、2番のところにくるアイテムの種類は「まったくわかりません」。その時々で変わってくるからです。
という訳で、上記の方法では正常に実行しないのです。

では、どうすべきでしょうか。
一番手っ取り早いのは、「取得したか」の次に、「何のアイテムを取得したか」というswitch文に操作を加えることでしょう。
ここでは点アイテムを取得した時に点数を増加させたいので、点アイテムの対応番号(ここでは1番?)のところに、
スコアを増やしてあげる操作でしょうね。

長文失礼しました^^
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

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

Re: 龍神録スコアの実装

#7

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

横から失礼します。
amehirune さんが書きました:これだと、forのループで回してあり、さらにitem.flag=0という文があるため、item[2].flagは確実に0です。

これは本当でしょうか?
このforのループはi=0から始まっています。
i=0, 1のときは、まだこのループでitem[2].flagに0を代入していないので、「item[2].flagは確実に0」とは言えない気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

amehirune(offline)

Re: 龍神録スコアの実装

#8

投稿記事 by amehirune(offline) » 10年前

失礼しました^^;
そうですね、私の間違いです。ハズカシー///
確実に、ではありません。訂正します(--;

[追記]学校のPCからの投稿です、ログインはできません。ご了承ください

ゼロシキ
記事: 4
登録日時: 10年前

Re: 龍神録スコアの実装

#9

投稿記事 by ゼロシキ » 10年前

教えていただいたアドバイスをもとに下記のように書いたら無事正常に実行されました

コード:

void ch_and_item(){
	for(int i=0;i<ITEM_MAX;i++){
		if(item[i].flag>0){
			double x=item[i].x-ch.x,y=item[i].y-ch.y;
			if(x*x+y*y<ITEM_HIT_BOX*ITEM_HIT_BOX){
				switch(item[i].knd){
					case 0:	ch.power+=3; break;
					case 1:	ch.point+=1;
						ch.score += 1000;
						break;
					case 2:	ch.score+=1; break;
					case 3:	ch.money+=1; break;
					case 4:	ch.power+=50;break;
					case 5:	ch.money+=10;break;
				}
				if(ch.power>500)ch.power=500;
				if(ch.point>9999)ch.point=9999;
				if(ch.money>999999)ch.money=999999;
				if(ch.score>999999999)ch.score=999999999;
				item[i].flag=0;
				se_flag[34]=1;
			}
		}
	}
}
amehiruneさん、みけCATさん、ありがとうございました!
C++の道は長く険しくも、楽しけり

閉鎖

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