はい、完全に私が想定していたソースコードです
じゃあ、音楽がなる私のやつのソースもアップしますね
コード:
#define GLOBAL_INSTANCE
extern int ProcessLoop();
extern void title();
extern void clear();
extern void Notclear();
#include "../include/GV.h"
/*windows*
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
SetWindowSize(480,272);/**/
/*PSP*
PSP_MODULE_INFO("KPortable", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
int main(){/**/
#define IS_MAIN
#ifndef IS_PSP_MODE
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
SetWindowSize(480,272);
#else
PSP_MODULE_INFO("KPortable", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
int main(){//warning!
#endif
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0:
load(); //データロード
//first_ini();//初回の初期化
func_state=10;
break;
case 10:
title();
break;
/*case 55:
DrawGraph(0,0,img_dot_riria[0],0);
break;*/
case 66:
PlaySoundMem( backmusic[0], DX_PLAYTYPE_BACK, TRUE);
func_state=100;
break;
case 99:
ini();
//enemy_ini();
func_state=100;
break;
case 100://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
cshot_main();//自機ショットメイン
//enemy_main();//敵処理メイン
//shot_main(); //ショットメイン
boss_shot_main();
out_main(); //当たり計算
graph_main();//描画メイン
if(boss.flag==0)
stage_count++;
//clsDx();
//printfDx("%d",stage_count);
/*if(Key[KEY_INPUT_T]==1){
stage_count=0;
}*/
break;
case 101:
clear();
break;
case 102:
Notclear();
break;
case 777:
goto EXIT;
break;
default:
//printfDx("不明なfunc_state\n");
break;
}
count++;
music_play();
//if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
fps_wait();
draw_fps(0,257);
ScreenFlip();//裏画面反映
}
EXIT:
DxLib_End();//DXライブラリ終了処理
return 0;
}
//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll(Key);
//GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}
void clear(){
DrawString(200,200,"All Clear!",0xffffff,0);
DrawString(150,220,"Press SQUARE button",0xffffff,0);
if(INPUT_SQUARE){
StopSoundMem(backmusic[0]);
func_state=10;
}
}
void Notclear(){
DrawString(200,200,"Not Clear...",0xffffff,0);
DrawString(150,220,"Press SQUARE button",0xffffff,0);
if(INPUT_SQUARE){
StopSoundMem(backmusic[0]);
func_state=10;
}
}
コード:
#include "../include/GV.h"
#include "../include/func.h"
#include "../include/move_boss_pos.h"
#define V0 10.0
//sin cos FALSE
float bulletatan2(int k){
return atan2(ch.y-boss_shot.bullet[k].y,ch.x-boss_shot.bullet[k].x);
}
//渡された-ang~angまでのランダムな角度を返す
float rang(float ang){
return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}
int search_boss_shot(){//空き番号を返す
for(int i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag==0)
return i;
}
return -1;
}
float bossatan2(){//自機と敵との成す角度
return atan2(ch.y-boss.y,ch.x-boss.x);
}
void input_bullet(float x,float y,float angle,float spd,int knd,int col=0,int se=1,int state=0,int till=0,int flag=1){
int k;
if((k=search_boss_shot())!=-1 ){
boss_shot.bullet[k].x = x;
boss_shot.bullet[k].y = y;
boss_shot.bullet[k].angle = angle;
boss_shot.bullet[k].spd = spd;
boss_shot.bullet[k].flag = flag;
boss_shot.bullet[k].knd = knd;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].col = col;
boss_shot.bullet[k].state = state;
boss_shot.bullet[k].till = till;
se_flag[0]=1;
}
}
//物理的計算をさせる登録をする(指定時間tで定位置に戻す)
void input_phy(int t){//t=移動にかける時間
float ymax_x,ymax_y;
if(t==0)t=1;
boss.phy.flag=1;//登録オン
boss.phy.cnt=0;//カウンタ初期化
boss.phy.set_t=t;//移動にかける時間をセット
ymax_x=boss.x-BOSS_POS_X;//移動したい水平距離
boss.phy.v0x=2*ymax_x/t;//水平成分の初速度
boss.phy.ax =2*ymax_x/(t*t);//水平成分の加速度
boss.phy.prex=boss.x;//初期x座標
ymax_y=boss.y-BOSS_POS_Y;//移動したい鉛直距離
boss.phy.v0y=2*ymax_y/t;//鉛直成分の初速度
boss.phy.ay =2*ymax_y/(t*t);//鉛直成分の加速度
boss.phy.prey=boss.y;//初期y座標
}
//物理的キャラクタ移動計算
void calc_phy(){
float t=boss.phy.cnt;
boss.x=boss.phy.prex-((boss.phy.v0x*t)-0.5*boss.phy.ax*t*t);//現在いるべきx座標計算
boss.y=boss.phy.prey-((boss.phy.v0y*t)-0.5*boss.phy.ay*t*t);//現在いるべきy座標計算
boss.phy.cnt++;
if(boss.phy.cnt>=boss.phy.set_t)//移動にかける時間分になったら
boss.phy.flag=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>FIELD_MAX_X+50 ||
boss_shot.bullet[i].y<-50 || boss_shot.bullet[i].y>FIELD_MAX_Y+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){//中ボス開始時の時は
#ifdef ENEMY_MODE
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//雑魚敵を消す
#endif
memset(shot,0,sizeof(shot_t)*SHOT_MAX);//弾幕を消す
boss.x=FIELD_MAX_X/2;//ボスの初期座標
boss.y=-30;
boss.knd=-1;//弾幕の種類
func_state=66;
//PlaySoundMem( backmusic[0], DX_PLAYTYPE_BACK, TRUE);/*!*/
}
boss.flag=1;
boss.hagoromo=0;//扇を広げるかどうかのフラグ
switch(boss.knd+1){
case 0:
boss.endtime=12*60;//残り時間
break;
case 1:
boss.endtime=60*99;
break;
}
boss.state=1;//待機中状態に
boss.cnt=0;
boss.graph_flag=0;//描画フラグを戻す
boss.knd++;
if(boss.knd==4){/
boss.flag=-1;
}
boss.wtime=0;//待機時間を初期化
memset(&boss_shot,0,sizeof(boss_shot_t));//ボスの弾幕情報を初期化
input_phy(60);//60カウントかけて物理的計算で定位置に戻す
}
//ボスの待機処理
void waitandenter(){
int t=140;
boss.wtime++;
if(boss.wtime>t)//140カウント待機したら弾幕セット
enter_boss_shot();
}
//ボスの弾幕メイン
void boss_shot_main(){
if(stage_count==boss.appear_count[0] && boss.flag==0){//開始時間なら
enter_boss(0);//開始
//反魂蝶のBGMを流す場合はload.cppを変更後、ここの注釈を外してください。
//PlaySoundMem( backmusic[0], DX_PLAYTYPE_LOOP, TRUE);
//back_music_flag=1;
}
if(boss.flag==0)//ボスが登録されて無ければ戻る
return;
if(boss.phy.flag==1)//物理演算移動オンなら
calc_phy();//物理計算を
if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0)){//弾幕中で体力が無くなったら
enter_boss(1);//次の弾幕を登録
}
if(boss.state==1){//弾幕間の待機時間
waitandenter();
}
if(boss.state==2){//弾幕中なら
boss_shot_bullet[boss.knd]();//弾幕関数へ
boss_shot_calc();//弾幕計算
}
boss.cnt++;
if(boss.flag==-1){
func_state=101;
}
}
なんか色々汚いのは無視してください^^;
私も何故これで音楽がなるのかわかりません
しかしこれでBGMはなります
あと考えられるのはmp3のフォーマットぐらいでしょうか?
これがちゃんとしてないとdxpでは認識できないので一度確認してみてください
あと、loadの関数で音楽をロードしたときに-1が帰って来てないかの確認もしてください
何もこれが最後じゃなくていいじゃないですか、とことん付き合いますよ(まともな知識の持ち合わせはありませんがw)