龍神録のスコアで、
アイテムをとった時、自機の弾が敵にヒットし(続け)ている時、
ボスを倒したときのスコアをそれぞれ実装したいんですが、何をどこに書けばいいのかわかりません
分かる方いましたらアドバイスお願いします。
龍神録スコアの実装
Re: 龍神録スコアの実装
アイテムを取得した時、
自弾が敵にヒットした時、
ボスが死んだ時
それぞれの瞬間に、ch.scoreに増加点数分だけ入れてあげればいいと思います。
龍神録の場合は、館や配布コードの方に細かくコメントが残されていますので、
初心者の方でもわりかしどれが何の関数なのかわかりやすくなってると思います。
【捕捉】
アイテムを取得した時→out.cppに
ボスが死んだ時→boss_shot.cppに
龍神録通りに作っているならば、以上のファイルに関数(的なの含む)が存在するはずです。
自弾が敵にヒットした時は、よく覚えていませんが、ダメージを与える関数あたりに入れるのもアリでしょう。
自弾が敵にヒットした時、
ボスが死んだ時
それぞれの瞬間に、ch.scoreに増加点数分だけ入れてあげればいいと思います。
龍神録の場合は、館や配布コードの方に細かくコメントが残されていますので、
初心者の方でもわりかしどれが何の関数なのかわかりやすくなってると思います。
【捕捉】
アイテムを取得した時→out.cppに
ボスが死んだ時→boss_shot.cppに
龍神録通りに作っているならば、以上のファイルに関数(的なの含む)が存在するはずです。
自弾が敵にヒットした時は、よく覚えていませんが、ダメージを与える関数あたりに入れるのもアリでしょう。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※
Re: 龍神録スコアの実装
ボスが倒れたとき、自機ショットが敵にヒットしているときの得点増処理はできたんですが、どうしても得点アイテムを取得した時の処理がおかしいところがあり、
パワーアイテムをとった時スコアに反映され、パワーや得点アイテムを同時に複数とったときにスコアが増えない、といったことが起きるんですが、どうしたらいいのでしょうか
パワーアイテムをとった時スコアに反映され、パワーや得点アイテムを同時に複数とったときにスコアが増えない、といったことが起きるんですが、どうしたらいいのでしょうか
C++の道は長く険しくも、楽しけり
Re: 龍神録スコアの実装
そのソースコードを提示していただければ、回答しやすくて助かります。
おそらく、得点増加処理を行うコードを追加する位置が間違っているのだと思われますが…
因みに追加すべき場所はch_and_item関数だったと思います。
できるだけ考えてほしいので、明示的なソースコードは公開しません。希望があれば言ってください。
おそらく、得点増加処理を行うコードを追加する位置が間違っているのだと思われますが…
因みに追加すべき場所はch_and_item関数だったと思います。
できるだけ考えてほしいので、明示的なソースコードは公開しません。希望があれば言ってください。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※
Re: 龍神録スコアの実装
分かりました。コードはこんな感じなんですが、どうでしょうか
//アイテムとの接触
//アイテム 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++の道は長く険しくも、楽しけり
Re: 龍神録スコアの実装
返信が遅くなってしまい、申し訳ありません。
さらに言うと、item[2]は状態変数として使用されていてもされていなくても、そこで得点を加算するか計算する、という式になってしまっています。
…わかりにくいですね(汗)
もうちょっと丁寧に説明します。
龍神録では、アイテムに関する構造体が宣言されています。flagは「アイテムが発生しているかどうか」で、kndはその種類です。
まず、flagが1かどうか(0より大きいかどうか)で、発生しているかどうかを判断します。
その後、もしアイテム取得範囲内にアイテムの座標があれば、取得した、とし、
実際にそのアイテムに応じたパワーアップなどを行います。
問題はここからです。
アイテムは発生した場合、変数の要素数の少ない方から順番に登録されていきます。
0番があいていたら0番にPアイテム、
1番があいていたら1番にPアイテム…のように、です。
では、2番のところには何のアイテムがあるのでしょうか?
考えてもらったらわかりますが、2番のところにくるアイテムの種類は「まったくわかりません」。その時々で変わってくるからです。
という訳で、上記の方法では正常に実行しないのです。
では、どうすべきでしょうか。
一番手っ取り早いのは、「取得したか」の次に、「何のアイテムを取得したか」というswitch文に操作を加えることでしょう。
ここでは点アイテムを取得した時に点数を増加させたいので、点アイテムの対応番号(ここでは1番?)のところに、
スコアを増やしてあげる操作でしょうね。
長文失礼しました^^
これだと、forのループで回してあり、さらにitem.flag=0という文があるため、item[2].flagは確実に0です。ゼロシキ さんが書きました://アイテムとの接触 //アイテム 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; } } } } }
さらに言うと、item[2]は状態変数として使用されていてもされていなくても、そこで得点を加算するか計算する、という式になってしまっています。
…わかりにくいですね(汗)
もうちょっと丁寧に説明します。
龍神録では、アイテムに関する構造体が宣言されています。flagは「アイテムが発生しているかどうか」で、kndはその種類です。
まず、flagが1かどうか(0より大きいかどうか)で、発生しているかどうかを判断します。
その後、もしアイテム取得範囲内にアイテムの座標があれば、取得した、とし、
実際にそのアイテムに応じたパワーアップなどを行います。
問題はここからです。
アイテムは発生した場合、変数の要素数の少ない方から順番に登録されていきます。
0番があいていたら0番にPアイテム、
1番があいていたら1番にPアイテム…のように、です。
では、2番のところには何のアイテムがあるのでしょうか?
考えてもらったらわかりますが、2番のところにくるアイテムの種類は「まったくわかりません」。その時々で変わってくるからです。
という訳で、上記の方法では正常に実行しないのです。
では、どうすべきでしょうか。
一番手っ取り早いのは、「取得したか」の次に、「何のアイテムを取得したか」というswitch文に操作を加えることでしょう。
ここでは点アイテムを取得した時に点数を増加させたいので、点アイテムの対応番号(ここでは1番?)のところに、
スコアを増やしてあげる操作でしょうね。
長文失礼しました^^
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※
Re: 龍神録スコアの実装
横から失礼します。
これは本当でしょうか?
このforのループはi=0から始まっています。
i=0, 1のときは、まだこのループでitem[2].flagに0を代入していないので、「item[2].flagは確実に0」とは言えない気がします。
amehirune さんが書きました:これだと、forのループで回してあり、さらにitem.flag=0という文があるため、item[2].flagは確実に0です。
これは本当でしょうか?
このforのループはi=0から始まっています。
i=0, 1のときは、まだこのループでitem[2].flagに0を代入していないので、「item[2].flagは確実に0」とは言えない気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 龍神録スコアの実装
失礼しました^^;
そうですね、私の間違いです。ハズカシー///
確実に、ではありません。訂正します(--;
[追記]学校のPCからの投稿です、ログインはできません。ご了承ください
そうですね、私の間違いです。ハズカシー///
確実に、ではありません。訂正します(--;
[追記]学校のPCからの投稿です、ログインはできません。ご了承ください
Re: 龍神録スコアの実装
教えていただいたアドバイスをもとに下記のように書いたら無事正常に実行されました
amehiruneさん、みけCATさん、ありがとうございました!
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;
}
}
}
}
C++の道は長く険しくも、楽しけり