スペルカードの表示について
Posted: 2012年3月13日(火) 21:06
C初心者です。
今、龍神録プログラムとhttp://dixq.net/forum/viewtopic.php?t=9388&p=75893を参考にさせていただいて、スペルカード発動時のエフェクトを作成しています。
まずはソースをコピペして動作を確認してみようと思い、自分のソースに配置して実行してみました。
すべての関数の宣言が書いていなかったので自分で宣言してみたところうまく動きません。(他にも多発したエラーを消そうとちょこちょこいじってしまいました)
なんとかエラーは回避したもの、肝心のエフェクトは起こらない上、ボス弾幕までおかしくなりました。
宣言方法とか配列や関数の使い方を間違っていたり、足りなかったりしているかもしれないと思うのですが、まだ勉強中なのでよくわかりません。(すいません、理解力の無い脳みそで)
お手数ですが以下のソースをチェックしていただいて悪いところを直してていただければ幸いです。
GV.h(追加分) function.h(追加分)
]
struct.h
load.cpp(追加分)
ini.cpp
boss_shot.cpp(boss_shot_main内部)
effect.cpp
graph.cpp
今、龍神録プログラムとhttp://dixq.net/forum/viewtopic.php?t=9388&p=75893を参考にさせていただいて、スペルカード発動時のエフェクトを作成しています。
まずはソースをコピペして動作を確認してみようと思い、自分のソースに配置して実行してみました。
すべての関数の宣言が書いていなかったので自分で宣言してみたところうまく動きません。(他にも多発したエラーを消そうとちょこちょこいじってしまいました)
なんとかエラーは回避したもの、肝心のエフェクトは起こらない上、ボス弾幕までおかしくなりました。
宣言方法とか配列や関数の使い方を間違っていたり、足りなかったりしているかもしれないと思うのですが、まだ勉強中なのでよくわかりません。(すいません、理解力の無い脳みそで)
お手数ですが以下のソースをチェックしていただいて悪いところを直してていただければ幸いです。
GV.h(追加分) function.h(追加分)
GLOBAL void enter_spell_graph(int);
GLOBAL void enter_spell_name(int);
GLOBAL void make_spell_graph(int);
struct.h
//スペカ名を格納する構造体
typedef struct{
int flag,cnt,to_cnt;//表示するフラグ、カウンタ、何カウントで表現するか
double x,y;//表示する座標
char spell_card[DANMAKU_MAX][41];//弾幕名を格納する配列 弾幕の個数分×弾幕の名前の最大文字数用意する
}spell_name_t;
load.cpp(追加分)
ini.cpp
strcpy(spell_name.spell_card[0], "弾幕「未設定01」");
strcpy(spell_name.spell_card[1], "弾幕「未設定02」");
strcpy(spell_name.spell_card[2], "弾幕「未設定03」");
//スペル名の番号を格納する。 通常弾幕の場合は-1にする
spell_num[0] = 0;
spell_num[1] = 0;
spell_num[2] = -1;
spell_num[3] = 1;
spell_num[4] = 2;
SetDrawValidAlphaChannelGraphCreateFlag(TRUE);
MakeScreen(300, 20); //spell_name_handle = MakeScreen(300, 20);のようにすると左辺値どうのこうのとエラーが出る。
SetDrawValidAlphaChannelGraphCreateFlag(FALSE);
}
void boss_shot_main(){
static int i=0;
if((stage_count==boss.appear_count[0] || stage_count==boss.appear_count[1] || stage_count==boss.appear_count[2])
&& boss.flag==0){//開始時間なら
enter_boss(0);//開始
if(boss.back_knd[boss.knd]==1){//もし背景がスペカ用背景ならば、
if(spell_num[i]!=-1){//もしi番目の弾幕が、通常弾幕でなければ
enter_spell_name(spell_num[i]);//i番目の弾幕を登録。
enter_spell_graph(img_boss_spell[0]);//ここ、これでいいのか不明
}
}
i++;
}
if(boss.flag==0){//ボスが登録されて無ければ戻る
return;
}
calc_boss();
if(boss.phy.flag==1){//物理演算移動オンなら
calc_phy();//物理計算を
}
if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0)){//弾幕中で体力が無くなったら
se_flag[1]=1;//敵のピチュリ音
se_flag[11]=1;
input_phy(30);//30カウントで定位置に戻す
memset(&boss_shot,0,sizeof(boss_shot_t));//ボスの弾幕情報を初期化
memset(&lazer,0,sizeof(lazer_t)*LAZER_MAX);//ボスのレーザー情報を初期化
flash.flag=0;//フラッシュを消す
if(boss.knd==boss.danmaku_num[0] || boss.knd==boss.danmaku_num[1]||boss.knd==boss.danmaku_num[2]){//弾幕をだしきったら
boss.flag=0;//消す
enter_dn(10,40);//(45)ドガーン処理
se_flag[9]=1;//ボスが死んだ音
return ;
}else{
enter_boss(1);//次の弾幕を登録
if(boss.back_knd[boss.knd]==1){//もし背景がスペカ用背景ならば、
if(spell_num[i]!=-1){//もしi番目の弾幕が通常弾幕でなければ、
enter_spell_name(spell_num[i]);//i番目の弾幕を登録。
}
}
i++;
}
}
if(boss.state==1){//弾幕間の待機時間
waitandenter();
}
if(boss.state==2){//弾幕中なら
boss_shot_bullet[boss.knd]();//弾幕関数へ
boss_shot_calc();//弾幕計算
}
boss.cnt++;
}
//スペルカードの名前を登録する関数
void enter_spell_name(int spell_num){//boss_shot_main()からスペルカード名が渡されてくる
int k;
spell_name.flag=1;
make_spell_graph(spell_num);//ここも不安要素
if((k=search_effect())!=-1){
effect[k].ang = 0;
effect[k].brt = 0;
effect[k].cnt = 0;
effect[k].eff = 2;
effect[k].flag = 1;//エフェクトを登録
effect[k].img = MakeScreen(300, 20);//←iniで変更したやつ
effect[k].knd = 5;//スペルカード発動エフェクト(文字)
effect[k].mvang = PI/2*3;//↑方向
effect[k].r = 6.0;
effect[k].spd = 0;
effect[k].x = FMX-55;
effect[k].y = FMY-10;
}
//必要な情報があれば登録したり処理したりしておく
//文字列を表示させるときの初期座標とか書いておくといいかも?
}
//スペルカードの画像を登録する関数
void enter_spell_graph(int graph){//この類はintがないとエラー。(一つの変数を指定できない)
int k;
if((k=search_effect())!=-1){
effect[k].ang = 0;
effect[k].brt = 125;
effect[k].cnt = 0;
effect[k].eff = 2;
effect[k].flag = 1;
effect[k].img = graph;
effect[k].knd = 6;
effect[k].mvang = PI/6*5;
effect[k].r = 1;
effect[k].spd = 7;
effect[k].x = FMX+50;
effect[k].y = FY+30;
}
}
//エフェクトを計算する
void calc_effect(){
for(int i=0;i<EFFECT_MAX;i++){
if(effect[i].flag>0){//エフェクトが登録されていたら
effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
switch(effect[i].knd){//エフェクトの種類によって分岐
case 0://敵の消滅エフェクト
effect[i].cnt++;
effect[i].r+=0.08;//エフェクトの大きさを段々大きくする
if(effect[i].cnt>10)//10カウント以上になったら
effect[i].brt-=25;//明るさを少なくする
if(effect[i].cnt>20)//20カウント以上になったら
effect[i].flag=0;//消す
break;
case 1://ボムのエフェクト
//スピード計算
if(effect[i].cnt<60)
effect[i].spd-=(0.2+effect[i].cnt*effect[i].cnt/3000.0);
if(effect[i].cnt==60){
effect[i].spd=0;
se_flag[15]=1;
enter_dn(11,20);//(45)
}
//明るさと大きさ計算
effect[i].r+=0.015;
if(effect[i].cnt<51)
effect[i].brt+=5;
if(effect[i].cnt>=60){
effect[i].r+=0.04;
effect[i].brt-=255/30.0;
}
//カウントアップと消去計算
effect[i].cnt++;
if(effect[i].cnt>=90)
effect[i].flag=0;
break;
case 2://ボムエフェクト(キャラ)
//明るさ計算
if(effect[i].cnt<51)
effect[i].brt+=4;
if(effect[i].cnt>130-51)
effect[i].brt-=4;
//カウントアップと消去計算
effect[i].cnt++;
if(effect[i].cnt>=130)
effect[i].flag=0;
break;
case 3://ボムのエフェクト(ライン)
//明るさ計算
if(effect[i].cnt<51)
effect[i].brt+=2;
if(effect[i].cnt>130-51)
effect[i].brt-=2;
//カウントアップと消去計算
effect[i].cnt++;
if(effect[i].cnt>=130)
effect[i].flag=0;
break;
case 4://喰らいボムエフェクト
//明るさ計算
if(effect[i].cnt>=6)
effect[i].brt-=255/6;
effect[i].r+=0.12;
effect[i].cnt++;
if(effect[i].cnt>=12 || ch.flag!=1)
effect[i].flag=0;
case 5 ://スペルカード発動エフェクト(文字)
if(effect[i].cnt<=25){
effect[i].brt+=255/25;
effect[i].r -= 0.192;//1.2倍へ
}
if(effect[i].cnt>=30 && effect[i].y > FY){
effect[i].spd += 0.08;
}
if(effect[i].y <= FY){
effect[i].spd = 0;
}
effect[i].cnt++;
/*if(effect[i].cnt>12 || ch.flag!=1){
effect[i].flag=0;
}*/
break;
case 6 ://スペルカード発動エフェクト(画像)
if(effect[i].x<FMX/6*4 && effect[i].x>FMX/6*3 ){
effect[i].spd = 2;
}
if(effect[i].x<=FMX/6*3){
effect[i].spd = 7;
}
break;
default:
printfDx("effect設定エラー\n");
break;
}
}
}
}
//スペカ名が記述された画像作成
void make_spell_graph(int k){
if(spell_name.flag>0){
SetDrawScreen (MakeScreen(300, 20));//iniで変更している。
ClearDrawScreen();
ChangeFontType(DX_FONTTYPE_ANTIALIASING);
ChangeFont("MS ゴシック");
DrawString(5, 2.5, spell_name.spell_card[k], color[0]);//画像に対して、スペルカード名を描画する
SetDrawScreen(DX_SCREEN_BACK);
}
}