う~ん…。
どうやらあの内容を文字だけで伝えようとした僕が間違っていたようですね(苦笑)
でも詳しいコードを書くのは面倒ですし(オイ)
もっと簡単に実装できそうな気もしたのでちょっとだけ書いてみます
いっそのこと登録関数で文字列渡すのはやめにしてしまいましょう
boss_shotH.cpp
コード:
//サイレントセレナ
void boss_shot_bulletH001(){
#define TM001 60
int i,k,t=boss_shot.cnt%TM001,t2=boss_shot.cnt;
static int cnum;
double angle;
strcpy(spell_name.spell_card,"月符「サイレントセレナ」");
if(t2==0)//最初の初期化
cnum=0;
if(t==0){//1ターンの最初の初期化
//以下略
}
こうして弾幕毎に名前を設定してやればどうでしょう?
これですでにchar型の配列spell_cardには、スペルカードの名前が格納されているのであとはエフェクトを表示させるだけです。
まぁこの方法にも登録関数を呼び出すタイミングなど問題があるのですけど
上手くやらないと最悪エフェクトが表示されてる間に弾幕が始まって、ボスの画像がいい感じに邪魔すると思います。 ちょっと細工すればそれも解決できますけど。
まぁ、これも一つの方法と言うことで
で、今までクラバックさんが頑張って来た方法についての補足はここからです
クラバックさんがやっているようにしても実装できるとは思いますが
spell_name_t構造体が必要以上に宣言されてしまっているので、無駄に容量を取ると思います。
どうで処理する内容はボスの画像と名前を表示させるだけなので、spell_name_t構造体の宣言は一つでいいと思いますね。
配列で宣言した方が分かりやすいと言えば分かりやすいですが…
まぁ、お好きなようにしてください
登録関数についてはこんな感じでいいと思いますね
コード:
//スペルカードの名前を登録する関数
void enter_spell(int num) //表示するスペル名の番号を渡す
{
spell_name[num].spell_flag=1;
//必要な情報があれば登録したり処理したりしておく
//文字列を表示させるときの初期座標とか書いておくといいかも?
}
スペルの番号って何? となると思いますが
ini.cppにて
コード:
void ini()
{
/*・・・*/
strcpy(spell_name[0].spell_card, "月符「サイレントセレナ」");
strcpy(spell_name[1].spell_card, "凍符「パーフェクトフリーズ」");
strcpy(spell_name[2].spell_card, "禁忌「恋の迷路」");
}
と書いてますよね
つまりspell_name構造体型配列の0番にはサイレントセレナが1番にはパーフェクトフリーズが既に入っている訳ですね。
だからあとは0を渡せばサイレントセレナが、1を渡せばパーフェクトフリーズが、2を渡せば恋の迷路が、それぞれ呼び出されるようにすればいいと思いますよ。
3番はグレイソーマタージ辺りで(黙れ)
こんどはサイレントセレナの時にはちゃんと0という数字を渡すように呼び出す側(boss_shot_main関数)で仕込んで置かなければならない訳ですが
これもini.cppで
コード:
//スペル名の番号を格納する。 通常弾幕の場合は-1にする
int spell_num[DANMAKU_MAX] = {-1, 0, -1, 1, 2,};
こんな感じの配列を作ってやって、それぞれに合った処理をするようにしてやればいいでしょうね
0以上なら番号にあったスペル宣言のエフェクトを表示させる、-1なら通常弾幕なのでエフェクトはなし
といった具合に。
ふむ、前半に余計なこと書いたせいで無駄に長文になってしまいましたね。
失礼しました
追記:
10/19午前10時頃
学校からちょっぴり訂正しました