コードは自分で書いたものでなく龍神録プログラミングの館でダウンロードしたもので自分は書き換えていないのです。
自分でこのバグに関係ないと思った部分は書いてませんがこの関数のコードを書いてほしいというときは言ってください。
すぐに書き込みます。
多いと思いますが自分ではこれ以上絞れませんでした。
画像読み込み
コード:
#include "../include/GV.h"
void load(){
img_eff_bom[0] = LoadGraph( "../dat/img/effect/bom0.png" );
img_eff_bom[1] = LoadGraph( "../dat/img/effect/bom1.png" );
img_eff_bom[2] = LoadGraph( "../dat/img/char/body.png" );
img_eff_bom[3] = LoadGraph( "../dat/img/bullet/bom_title0.png" );
img_etc[1] = LoadGraph( "../dat/img/enemy/hp.png" );
img_etc[2] = LoadGraph( "../dat/img/enemy/bossback.png" );
img_etc[5] = LoadGraph( "../dat/img/enemy/bossback3.png" );
img_etc[6] = LoadGraph( "../dat/img/enemy/bossback4.png" );
img_etc[7] = LoadGraph( "../dat/img/enemy/hp_boss.png" );//ボスのHP
LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
LoadDivGraph( "../dat/img/bullet/b1.png" , 6 , 6 , 1 , 22 , 22 , img_bullet[1] ) ;
LoadDivGraph( "../dat/img/bullet/b2.png" , 10 , 10 , 1 , 5 , 120 , img_bullet[2] ) ;
LoadDivGraph( "../dat/img/bullet/b3.png" , 5 , 5 , 1 , 19 , 34 , img_bullet[3] ) ;
LoadDivGraph( "../dat/img/bullet/b4.png" , 10 , 10 , 1 , 38 , 38 , img_bullet[4] ) ;
LoadDivGraph( "../dat/img/bullet/b5.png" , 3 , 3 , 1 , 14 , 16 , img_bullet[5] ) ;
LoadDivGraph( "../dat/img/bullet/b6.png" , 3 , 3 , 1 , 14 , 18 , img_bullet[6] ) ;
LoadDivGraph( "../dat/img/bullet/b7.png" , 10 , 10 , 1 , 16 , 16 , img_bullet[7] ) ;
LoadDivGraph( "../dat/img/bullet/b8.png" , 10 , 10 , 1 , 12 , 18 ,img_bullet[8] ) ;
LoadDivGraph( "../dat/img/bullet/b9.png" , 3 , 3 , 1 , 13 , 19 , img_bullet[9] ) ;
LoadDivGraph( "../dat/img/bullet/b10.png" , 8 , 8 , 1 , 8 , 8 , img_bullet[10] ) ;
LoadDivGraph( "../dat/img/enemy/hit_effect.png" , 5 , 5 , 1 , 140 , 140 , img_del_effect ) ;
LoadDivGraph( "../dat/img/char/riria.png" , 8 , 8 , 1 , 100 , 100 , img_dot_riria ) ;
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
img_cshot[0]=LoadGraph("../dat/img/char/bl_00.png");
img_cshot[1]=LoadGraph("../dat/img/char/bl_01.png");
img_back[0] = LoadGraph("../dat/img/back/0/back0.png");
敵ボスグラフィック関係
コード:
#include "../include/GV.h"
extern void graph_back_main();
void graph_bullet(){
int i,j,eff;
double disp_angle;
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;//線形補完描画
for(i=0;i<SHOT_MAX;i++){//敵の弾幕数分ループ
if(shot[i].flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(shot[i].bullet[j].flag!=0){//弾データがオンなら
if(shot[i].bullet[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_ADD, 200+GetRand(55)) ;
if(bullet_info[shot[i].bullet[j].knd].kaiten==1)
disp_angle=PI2*(shot[i].bullet[j].cnt%120)/120;
else
disp_angle=shot[i].bullet[j].angle+PI/2;
DrawRotaGraphF(
shot[i].bullet[j].x+FX+dn.x, shot[i].bullet[j].y+FY+dn.y,
1.0, disp_angle,
img_bullet[shot[i].bullet[j].knd][shot[i].bullet[j].col],TRUE);
if(shot[i].bullet[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
}
}
}
}
//ボス
if(boss_shot.flag>0){//弾幕データがオンなら
for(j=0;j<BOSS_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(boss_shot.bullet[j].flag!=0){//弾データがオンなら
eff=0;
if(boss_shot.bullet[j].kaiten==1)
disp_angle=PI2*(boss_shot.bullet[j].cnt%120)/120;
else
disp_angle=boss_shot.bullet[j].angle+PI/2;
if(boss_shot.bullet[j].eff_detail==1){//風雨にも負けず用弾エフェクト
SetDrawBlendMode( DX_BLENDMODE_ADD, 100+GetRand(155)),eff=1 ;
DrawRotaGraphF(
boss_shot.bullet[j].x+FX+dn.x, boss_shot.bullet[j].y+FY+dn.y,
1.3, disp_angle,
img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);
}
if(boss_shot.bullet[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_ADD, 200+GetRand(55)),eff=1 ;
if(boss_shot.bullet[j].eff==2)
SetDrawBlendMode( DX_BLENDMODE_ADD, 255+GetRand(100)),eff=1 ;
DrawRotaGraphF(
boss_shot.bullet[j].x+FX+dn.x, boss_shot.bullet[j].y+FY+dn.y,
1.0, disp_angle,
img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);
if(eff==1)
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
}
}
}
SetDrawMode(DX_DRAWMODE_NEAREST);//描画形式を戻す
}
void graph_main(){
if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
graph_back_main();//背景描画メイン
graph_effect(0);//敵が死ぬエフェクト
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_effect(4);//喰らいボムのエフェクト
if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
graph_boss();
graph_enemy();//敵の描画
graph_cshot();//自機ショットの描画
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_ch();//自機の描画
if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
graph_bullet();//弾の描画
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_effect(1);//ボムのエフェクト
graph_effect(2);//ボム線のエフェクト
graph_effect(3);//ボムキャラのエフェクト
graph_board();//ボードの描画
graph_develop();
}
敵ボス関係
コード:
#include "../include/GV.h"
#include "../include/func.h"
#define V0 10.0
//ボスの弾幕を計算する
void boss_shot_calc(){
int i;
boss.endtime--;
if(boss.endtime<0)
boss.hp=0;
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
boss_shot.bullet[i].x+=cos(boss_shot.bullet[i].angle)*boss_shot.bullet[i].spd;
boss_shot.bullet[i].y+=sin(boss_shot.bullet[i].angle)*boss_shot.bullet[i].spd;
boss_shot.bullet[i].cnt++;
if(boss_shot.bullet[i].cnt>boss_shot.bullet[i].till){
if(boss_shot.bullet[i].x<-50 || boss_shot.bullet[i].x>FMX+50 ||
boss_shot.bullet[i].y<-50 || boss_shot.bullet[i].y>FMY+50)
boss_shot.bullet[i].flag=0;
}
}
}
boss_shot.cnt++;
}
//弾幕をセット
void enter_boss_shot(){
memset(&boss_shot , 0, sizeof(boss_shot_t));//弾情報初期化
boss_shot.flag=1;
boss.wtime=0;//待機時間0
boss.state=2;//弾幕中状態に
boss.hp=boss.set_hp[boss.knd];//HP設定
boss.hp_max=boss.hp;
}
//ボスをセット
void enter_boss(int num){
if(num==0){//中ボス開始時の時は
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//雑魚敵を消す
memset(shot,0,sizeof(shot_t)*SHOT_MAX);//弾幕を消す
boss.x=FMX/2;//ボスの初期座標
boss.y=-30;
boss.knd=-1;//弾幕の種類
}
boss.flag=1;
boss.hagoromo=0;//扇を広げるかどうかのフラグ
boss.endtime=99*60;//残り時間
boss.state=1;//待機中状態に
boss.cnt=0;
boss.graph_flag=0;//描画フラグを戻す
boss.knd++;
boss.wtime=0;//待機時間を初期化
memset(&boss_shot,0,sizeof(boss_shot_t));//ボスの弾幕情報を初期化
input_phy(60);//60カウントかけて物理的計算で定位置に戻す
}
//ボスの弾幕メイン
void boss_shot_main(){
if(stage_count==boss.appear_count[0] && boss.flag==0)//開始時間なら
enter_boss(0);//開始
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;
enter_boss(1);//次の弾幕を登録
}
if(boss.state==1){//弾幕間の待機時間
waitandenter();
}
if(boss.state==2){//弾幕中なら
boss_shot_bullet[boss.knd]();//弾幕関数へ
boss_shot_calc();//弾幕計算
}
boss.cnt++;
}
ボスの弾幕情報
コード:
void boss_shot_bulletH005(){
#define TM005 820
#define RANGE005 100.0
#define LEM005 4
int i,j,k,n,t=boss_shot.cnt%TM005,t2=boss_shot.cnt;
static int sst,bnum;
static double sx,sy,sangle;
//1周期の最初なら
if(t==0){
sst=0;
sx=boss.x;
sy=boss.y-RANGE005;
sangle=PI/5/2+PI/2;
bnum=0;
}
//星を描く
if(sst<=4){
for(i=0;i<2;i++){
sx+=cos(sangle)*LEM005;//座標を計算
sy+=sin(sangle)*LEM005;
//円と交わったら
if((sx-boss.x)*(sx-boss.x)+(sy-boss.y)*(sy-boss.y)>RANGE005*RANGE005){
sangle-=(PI-PI/5);//方向転換
sst++;//ステータス変換
if(sst==5)break;//5なら終わる
}
for(j=0;j<5;j++){//星を5つ描く
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].flag=1;
boss_shot.bullet[k].state=j;
boss_shot.bullet[k].cnt=0;
boss_shot.bullet[k].spd=0;
boss_shot.bullet[k].knd=10;
boss_shot.bullet[k].col=j;
boss_shot.bullet[k].angle=-PI/2+PI2/5*j;
boss_shot.bullet[k].x=sx;
boss_shot.bullet[k].y=sy;
boss_shot.bullet[k].vx = cos(sangle)*1.4*1.2;
boss_shot.bullet[k].vy = sin(sangle)*1.4;
boss_shot.bullet[k].base_angle[0]=sangle-PI+PI/20*bnum;
}
}
bnum++;
}
se_flag[0]=1;
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
int cnt=boss_shot.bullet[i].cnt;
//ステータスが10未満なら
if(boss_shot.bullet[i].state<10){
if(t==150){//150なら星を5方向に発射
boss_shot.bullet[i].spd=4;//スピード
boss_shot.bullet[i].cnt=0;//カウンタリセット
boss_shot.bullet[i].state+=10;//ステータス番号変更
}
}
else if(boss_shot.bullet[i].state<20){//10~19なら
if(cnt<=80){//減速
boss_shot.bullet[i].spd-=0.05;
}
if(cnt==100){//セットした基準角度から綺麗な曲線を描く
boss_shot.bullet[i].angle=boss_shot.bullet[i].base_angle[0];
}
if(cnt>=100 && cnt<160){//加速
boss_shot.bullet[i].spd+=0.015;
}
}
}
}
}
struct.h
コード:
//ショットに関する構造体
typedef struct {
//フラグ、種類、カウンタ、どの敵から発射されたかの番号、色
int flag, knd, cnt, num;
//ベース角度、ベーススピード
double base_angle[10], base_spd[1];
bullet_t bullet[BOSS_BULLET_MAX];
}boss_shot_t;
//ボスの情報
typedef struct {
int flag, cnt, knd, wtime, state, endtime, hagoromo, graph_flag;
int hp, hp_max;
int appear_count[2], set_hp[DANMAKU_MAX], back_knd[DANMAKU_MAX];
double x, y, dx, dy, ang, spd;
phy_t phy;
}boss_t;