ページ 1 / 1
龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月29日(月) 20:20
by オワタ崎
どうもです。
少し前にココで質問させてもらった者です。
龍神録をpspに移植する際、速度の面を気にしなければソースコードや画像のサイズを少し変更する程度で済むので
なんとかこの章までこれました。
ここで質問なのです。
pspでBGMを再生しようとして、とりあえずDXライブラリportableの機能を使いmp3をストリーミング再生しようと思ったのですが、
いまいち理解できてない部分が多く、何処を変更すればいいのか分かりません。
明らかに勉強が足りないのは自覚しているつもりです。
この章でひと区切りなので、終わったら一から学びなおそうと思います。
ですので、お手本をお願いできませんか?
music.cppはほとんどそのままですが貼っておきます。
コード:
#include <include/GV.h>
#include <string.h>
#include <stdio.h>
void music_ini(){
memset(se_flag,0,sizeof(int)*SE_MAX);
}
void music_play(){
int i;
for(i=0;i<SE_MAX;i++){
if(se_flag[i]==1){
if(CheckSoundMem(sound_se[i])!=0){
if(i==8)continue;
StopSoundMem(sound_se[i]);
}
PlaySoundMem(sound_se[i],DX_PLAYTYPE_BACK);
}
}
}
void load_bgm(int flag){
char str[64];
sprintf(str,"dat/music/DATA1.MP3",stage,flag);
area.bgm.handle=LoadSoundMem(str);
}
void delete_bgm(){
DeleteSoundMem(area.bgm.handle);
}
void bgm_main(){
if(area.bgm.flag==0){//最初に読み込む
load_bgm(0);
SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット
area.bgm.flag=1;
}
if(area.bgm.flag==1){//種類に応じて再生をはじめる
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==60){//はじまって60カウント後に再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=2;
}
break;
default:
break;
}
}
if(area.bgm.flag==2){//ボス出現時に読み込む
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら読み込む
StopSoundMem(area.bgm.handle);
delete_bgm();
load_bgm(1);
SetLoopPosSoundMem( area.bgm.loop_pos[1], area.bgm.handle );//ループ位置セット
area.bgm.flag=3;
}
}
if(area.bgm.flag==3){
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=4;
}
break;
default:
break;
}
}
}
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月29日(月) 23:19
by xxx
そのままビルドしても再生できませんでしたっけ.
ドキュメントには本家互換と書いてありましたが
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月29日(月) 23:50
by Dixq (管理人)
DXライブラリportableは中身を見たことが無いので良く知りませんが、何に困っているか具体的に言ってもらえれば何か答えられるかもしれません。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 00:10
by COFE
ウホッ!同じ事やってる人見っけ!
私の方でもちゃんと音楽ならなかったんですよね^^;
この部分を
コード:
if(area.bgm.flag==3){
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=4;
}
break;
default:
break;
}
}
}
こういう感じに
コード:
if(area.bgm.flag==3){
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら再生
func_state=600;
area.bgm.flag=4;
}
break;
default:
break;
}
}
}
コード:
//main関数
while(ProcessLoop()==0){
switch(func_state){
//省略
case 600:
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
func_state=GAME_MAIN;
break;
}
}
こんな感じにするとなぜか動きました
何故動くのかよくわかりません^^;
やっぱりDXPもまだ開発途中でバグが多いですからOSLibとか他のを試してみるのもいいかもしれません
(しっかし、なんでこんな変な書き方で音楽なるんだろう……)
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 12:49
by オワタ崎
皆さんありがとうございます。
昨日のうちに返信できずに申し訳ないです。
COFEさんが書いてくれたコードを試そうと思ったのですが、
ProcessLoopとGAME_MAINが宣言されていませんよと怒られてしまいました。
つかぬ事を伺いますが、この2つはどこで宣言されましたか?(汗
暇なときにでも回答をください。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 18:18
by COFE
ProcessLoopは龍神録の館に書いてあるやつです、ClearDrawScreenとProcessMessageを呼びだしています
GAME_MAINは龍神録的に言うと99です、つまりゲーム部分のメインループです
追記:
違いました、100でした
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 21:08
by オワタ崎
返信ありがとうごさいます。
とりあえず、言われた部分を含めてビルドしてみましたが・・・BGMが鳴りません。
最初に教えて頂いた部分さえあっているのかわからなくなってきました。
何処が悪いのでしょうかTT
コード:
#include <include/GV.h>
#include <string.h>
#include <stdio.h>
void music_ini(){
memset(se_flag,0,sizeof(int)*SE_MAX);
}
void music_play(){
int i;
for(i=0;i<SE_MAX;i++){
if(se_flag[i]==1){
if(CheckSoundMem(sound_se[i])!=0){
if(i==8)continue;
StopSoundMem(sound_se[i]);
}
PlaySoundMem(sound_se[i],DX_PLAYTYPE_BACK);
}
}
}
void load_bgm(int flag){
char str[64];
sprintf(str,"dat/music/DATA1.mp3",stage,flag);
area.bgm.handle=LoadSoundMem(str);
}
void delete_bgm(){
DeleteSoundMem(area.bgm.handle);
}
void bgm_main(){
switch(func_state){
if(area.bgm.flag==0){//最初に読み込む
load_bgm(0);
SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット
area.bgm.flag=1;
}
if(area.bgm.flag==1){//種類に応じて再生をはじめる
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==60){//はじまって60カウント後に再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=2;
}
break;
default:
break;
}
}
if(area.bgm.flag==2){//ボス出現時に読み込む
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら読み込む
StopSoundMem(area.bgm.handle);
delete_bgm();
load_bgm(1);
SetLoopPosSoundMem( area.bgm.loop_pos[1], area.bgm.handle );//ループ位置セット
area.bgm.flag=3;
}
}
if(area.bgm.flag==3){
switch(area.bgm.knd[0]){
case 600:
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
func_state=100;
break;
}
}
}
}
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 21:14
by COFE
music.cppに書くのではないですよ
main.cppに音楽を鳴らすための専用のfunc_stateを造ります、それが600です
龍神録48章とありますが、かなり仕様が違ったりしますか?
このswitch文はmain.cppに書くことを想定してますよ
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 21:33
by オワタ崎
うわ、これは恥ずかしいミス><
これも修正し、pspで実行してみると処理が重くなっただけとなりました。
最後の質問です・・・
この二つのcppファイルはCOFEさんが予想しているものと同じでしょうか?
コード:
---music.cpp---
#include <include/GV.h>
#include <string.h>
#include <stdio.h>
void music_ini(){
memset(se_flag,0,sizeof(int)*SE_MAX);
}
void music_play(){
int i;
for(i=0;i<SE_MAX;i++){
if(se_flag[i]==1){
if(CheckSoundMem(sound_se[i])!=0){
if(i==8)continue;
StopSoundMem(sound_se[i]);
}
PlaySoundMem(sound_se[i],DX_PLAYTYPE_BACK);
}
}
}
void load_bgm(int flag){
char str[64];
sprintf(str,"dat/music/DATA1.mp3",stage,flag);
area.bgm.handle=LoadSoundMem(str);
}
void delete_bgm(){
DeleteSoundMem(area.bgm.handle);
}
void bgm_main(){
if(area.bgm.flag==0){//最初に読み込む
load_bgm(0);
SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット
area.bgm.flag=1;
}
if(area.bgm.flag==1){//種類に応じて再生をはじめる
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==60){//はじまって60カウント後に再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=2;
}
break;
default:
break;
}
}
if(area.bgm.flag==2){//ボス出現時に読み込む
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら読み込む
StopSoundMem(area.bgm.handle);
delete_bgm();
load_bgm(1);
SetLoopPosSoundMem( area.bgm.loop_pos[1], area.bgm.handle );//ループ位置セット
area.bgm.flag=3;
}
}
if(area.bgm.flag==3){
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら再生
func_state=600;
area.bgm.flag=4;
}
break;
default:
break;
}
}
}
コード:
---main.cpp---
#define GLOBAL_INSTANCE
#include <include/GV.h>
#include <lib/dxlibp.h>
PSP_MODULE_INFO("ZAKI", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
GetHitPadStateAll(); //現在のパッド入力処理を行う
return 0;
}
int main()
{
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=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
cshot_main();//自機ショットメイン
enemy_main();//敵処理メイン
boss_shot_main();
shot_main(); //ショットメイン
out_main(); //当たり計算
effect_main();//エフェクトメイン
calc_main();//ゲームタイトル表示計算
graph_main();//描画メイン
bgm_main();//BGMメイン
draw_fps(420,250);//fps表示
if(boss.flag==0)
stage_count++;
break;
case 600:
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
func_state=100;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
fps_wait();
music_play();
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 22:03
by COFE
はい、完全に私が想定していたソースコードです
じゃあ、音楽がなる私のやつのソースもアップしますね
コード:
#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)
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 22:26
by オワタ崎
下のやつboss_shot.cppですよね。
なぜ?
家の都合でこれ以上は無理っぽいです。
また、明日お願いします。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 22:30
by COFE
oh....
こんな汚いソースコードなのに何の解説も入れてなかった、死にたい
boss_shot.cppのenter_bossで初回の場合のみfunc_stateをいじってmain.cppの方のcase 66に入るようにしています
オワタ崎さんのようにたくさんBGMを鳴らす予定もないので
もし良ければオワタ崎さんの使ってるBGMそのまま上げてもらえませんかね?
ちゃんと鳴るかテストしてみたいです
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月30日(火) 22:52
by xxx
とりあえず
-DXLPのバージョン
-PSPの環境
を書いてほしいです.
DXLP0.5.~なら確か不具合が報告されていたはず
あとはないとは思うけどメモリ周りとかが問題なら
PSP_HEAP_SIZE_KB(16*1024);
とかやっておいて様子見るとか
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月31日(水) 08:21
by オワタ崎
昨日は勝手な形で中断してしまってすいません。
COFEさん
なんとなく想像してたかもしれませんが、僕が使っているBGMは某弾幕シューティングから抽出したものなので
これをUPするのは著作権的にまずい気がします・・・
あと、これは根拠にならないかもしれませんが一応。
今使っているBGMですが、僕のゲームでは音は鳴っていませんが
他の方が作った自作ゲームでこれを流したところ、あっさり再生されました。
するとmp3ファイル自体に原因は無く、やはり僕のコードに問題があるとしか思えません・・・。
ですので、もしUPするのであれば僕のコードをUPしビルドして実行して頂いた方が原因がわかりやすいと思いますが
多少めんどうな気もします。・・・どうでしょう(笑)
roxion1377さん
失礼しました(汗
DXLPのバージョンは0.5.7です。
pspは2000型で、CFWは5.50GEN-D3となっています。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月31日(水) 14:52
by xxx
0.5.7は不具合がないっぽいですね.
http://dxlibp.sourceforge.jp/cgi-bin/pa ... cgi?no=237
>他の方が作った自作ゲームでこれを流したところ、あっさり再生されました
>するとmp3ファイル自体に原因は無く、やはり僕のコードに問題があるとしか思えません・・・
そのプログラムがDXLP使っているならそうかもしれませんね
それとCOFEさんが言ってるとおり戻り値確認してください.
どうしてもだめならSDLで書いた方がいいかも
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年8月31日(水) 20:37
by オワタ崎
roxion1377さん
はい、その方はDXLPを使用していると明記していたので。
・・・ここで戻り値の確認方法がわからないとか言ったら殴られそうですね^^;
SDLについても調べてみます。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月01日(木) 17:29
by xxx
>・・・ここで戻り値の確認方法がわからないとか言ったら殴られそうですね^^;
殴る人はいるのだろうか.
でも基本は知っておくべきかと・・・
void load_bgm(int flag){
char str[64];
sprintf(str,"dat/music/DATA1.mp3",stage,flag);
area.bgm.handle=LoadSoundMem(str);
if(area.bgm.handle==-1)printfDx("読み込めない");
}
これのarea.bgm.handleの値です.
"読み込めない"が表示されたら読み込めていないことになります.
SDLでの再生は速度が芳しくないようなので素直にDXLP使ったほうがいいですね.
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月01日(木) 20:13
by オワタ崎
if(area.bgm.handle==-1)printfDx("読み込めない");
↑のようなものは見たら一応理解できるんですが、一から自分で書けないのは基本が身について無い証拠ですよね。
pspで実行してみると悲しいことに「読み込めない」が表示されていました。
それと、実は11章のエクセルデータを読み込むときにもread errorを返されていたんです。
今まで、「もしcsvファイルが読み込めないならread errorを表示する」というif文を消して無理やり(?)読み込ませてました。
今思い返せばこれはまずい気もしてきました。
これも何か関係があるのでしょうか・・・
あと、load.cppの記載が必要でしたら言ってください。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月01日(木) 20:40
by COFE
オワタ崎 さんが書きました:
pspで実行してみると悲しいことに「読み込めない」が表示されていました。
それと、実は11章のエクセルデータを読み込むときにもread errorを返されていたんです。
今まで、「もしcsvファイルが読み込めないならread errorを表示する」というif文を消して無理やり(?)読み込ませてました。
もしかして、if(fopenの戻り値==-1) printfDx("read erorr");←この行を消しちゃったんですか?
これはエラーかどうかの表示をいじっているだけなので本質的に読み込めていません
load.cppでロードするパスとファイルの位置があっているか確認してください
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月01日(木) 20:45
by xxx
メモリ不足っぽい.
>それと、実は11章のエクセルデータを読み込むときにもread errorを返されていたんです。
>今まで、「もしcsvファイルが読み込めないならread errorを表示する」というif文を消して無理やり(?)読み込ませてました。
やっちゃダメです.エラーはエラーです直しましょう
画像ファイルなどを一切読み込まないようにしてcsvのみ読みこむようにしたら成功するか確認してください.
素材に関しては画像や効果音もすべて龍神録のをそのまま使っているのでしょうか?
揚げ足取るようで嫌ですがfopenの失敗は0では?
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月01日(木) 21:03
by COFE
>roxion1377 さん
調べたらそうでした……
妙なことを言ってしまい申し訳ありませんでした
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月01日(木) 21:51
by オワタ崎
お二方ともありがとうございます。
>素材に関しては画像や効果音もすべて龍神録のをそのまま使っているのでしょうか?
いえ・・・効果音はそのままですが、画像の一部(自機、自機が発射する弾←この二つ)を変更しています。
>画像ファイルなどを一切読み込まないようにしてcsvのみ読みこむようにしたら成功するか確認してください.
わかりました今すぐやってみます。
ですが、僕は家庭内でパソコンを使う権利(?)が弱く、今日中に結果を報告できそうにないです・・・
何度も失礼ですが、これについては明日報告させてください。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月03日(土) 15:07
by オワタ崎
すいません、自分で昨日といっておきながら・・・
昨日は時間が取れませんでした。
言われた通り、csvのみを読み込むようにして実行してみたのですが、read errorと表示されました。
念の為に11章をやり直してみたのですが、結果は同じでした。
ミスが怖いのでファイルパスはほとんど変えず、画像もそのままにして(boardのサイズは変えました)、
ini.cppにstring.hを、load.cppにstdio.hとstdlib.hをインクルードさせ、
pspのフィールドを
x 288
y 254
としているので、11章のcsvの最後の2行を削りました。
いったい何が間違っているのでしょうか。
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月03日(土) 16:46
by COFE
そのまま丸写しにしたということですが、ファイルパス合ってますか?
EBOOT.PBPと同じフォルダにdatフォルダを入れたのなら読み込むところの"../dat/csv/storyH0.csv"を"./dat/csv/storyH0.csv"と変えなかればなりませんよ
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月03日(土) 17:36
by オワタ崎
長々と付き合っていただいて申し訳ないです・・・
ファイルパスはあっているはずなんです。
pspに入れるときのフォルダ構成は
図にすると、
damepo
∟EBOOT.PBP
∟dat
∟csv →storyH0.csv
∟img
∟board →10.png 11.png 12.png 20.png
∟char →0.png
∟enemy→0.png
と、しています。
各ファイルパスは
"./dat/img/board/10.png"
"./dat/img/board/11.png"
"./dat/img/board/12.png"
"./dat/img/board/20.png"
"./dat/img/char/0.png"
"./dat/img/enemy/0.png"
"./dat/csv/storyH0.csv"
このようにしているのですが・・・
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月03日(土) 22:12
by 気になった人
フォルダ構成の前にファイル自体にバグがないか見たほうが良いかと
仮対策
1、とりあえずstoryH0.csv内のコメントを消して見る
2、読み込むデータがきちんと書かれているか見てみる。
3、DXLPがUTF8仕様ならstoryH0.csvをUTF8にする、ついでにソースもUTF8にする
4、ファイル容量が多くて呼び出せない可能性があるから敵データを半分にしてステージカウント関係をそれように調整してみる。
BGMをならすのなら新たにBGMロード用のファイルを用意してfunction.hにグローバルでいれれば良いのではないかと
そうすればドコでもこの関数を呼べば必要なファイルがとりだせて再生させるだけでいけるはず。
必要な変数はgv.hで宣言しておいて・・・
描き方慣れてないので見ずらいかも
////////////////////////////////////
#include <gv.h>
void bgm_loadin(){
//BGM
if( bgmld_no[0]==1 ){//ボスなの?道中なの?の判断
if( bgmld_no[1]==1 ){
bgm_bace01 = LoadSoundMem("dat/music/01_ひみつ1.mp3");
}
if( bgmld_no[1]==2 ){
bgm_bace01 = LoadSoundMem("dat/music/02_ひみつ2.mp3");
}
}
}
////////////////////////////////////
//個人的に作ったBGM取り込み
void bosbgm_on(){
//通常BGM再生を止めます
StopSoundMem( bgm_bace01 );
//音を削除します
DeleteSoundMem( bgm_bace01 ) ;
if( stgsu == 1 ){
//読み込むBGMのハンドル
bgmld_no[0]=3;
//読み込むBGMの番号
bgmld_no[1]=3;
//新しいBGM
bgm_loadin();
}
if( stgsu == 2 ){
//読み込むBGMのハンドル
bgmld_no[0]=3;
//読み込むBGMの番号
bgmld_no[1]=5;
//新しいBGM
bgm_loadin();
}
if( stgsu == 3 ){
//読み込むBGMのハンドル
bgmld_no[0]=3;
//読み込むBGMの番号
bgmld_no[1]=7;
//新しいBGM
bgm_loadin();
}
// パンを中央に設定します
SetPanSoundMem( 0, bgm_bace01);
// BGM再生 ループ
PlaySoundMem( bgm_bace01, DX_PLAYTYPE_LOOP, TRUE);
}
こんな感じで道中は最初に読んで再生させ、ボスのときはboss_shot_main()の中に割り込ませ、会話途中で切り替えるときは・・・
なんか全部変数を変更して関数呼び出すだけです。
知識少ないですがこんなんでどうすか?
Re: 龍神録48章のpspへの移植 (BGM)
Posted: 2011年9月04日(日) 13:34
by オワタ崎
気になった人さん
返信ありがとうございます。
仮対策のほうは一通り試してみましたが、read errorという憎たらしささえ覚える文字がでました。
せっかく説明してくださったところ悪いのですが、既に僕の理解を超えています。
やはり、まともな知識も無いような状態で手を出したのは失敗だったようです。
一から出直そうと思います。
なので、このトピックは解決、としたいと思います。
皆さんにここまで付き合ってもらってありがたかったです。