ページ 11

アニメーション

Posted: 2009年3月12日(木) 18:59
by s-rush
度々すいません。
ゲームにはオープニング等で、よくアニメーションを表示させると思います。
そのオープニングを出すプログラムはできたのですが、
そのムービー(ではないですが)をスキップさせることができません。
#include "DxLib.h"

void opening()
{
	int op_img[115];
	char path[64];
	int i;

	/*アニメーション動画のロード*/
	for(i=0; i<115; i++)
	{
		sprintf(path, "../data/img/opening/op_%03d.png", i);
		op_img = LoadGraph(path);
	}

	/*アニメーション再生*/
	for(i=0; i<115; i++)
	{
		for(int j=0; j<10; j++){
			//DrawGraph(0, 0, op_img, TRUE);
			ScreenFlip();
			wait_fanc();
			if(Key[KEY_INPUT_Z] >= 1){
			goto EXIT;
			}
		}
	}

EXIT:
	func_state = 2;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;              //ウィンドウモードにする。
        if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

		 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2( Key ) && !Key[KEY_INPUT_ESCAPE]){//メインループ
		switch(func_state){
			/*ゲーム機動時のステータス*/
			case 0:
					load();
					load_kanto();
				    ch.x    =16*32;
  				    ch.y    =60*32;
				    ch.walking_flag=0;
	 			    ch.muki=3;
						
			 	    func_state=1;
                                        break;
			/*オープニング*/
			case 1:
					opening();
					break;
			/*オープニングセレクト*/
			case 2:
					op_select();
					SetDrawBright(255,255,255);			//輝度値のリセット				break;
			/*マップ上のステータス*/
                           case 100:                
                                 (省略)
				
			if(func_state!=0 && func_state!=1 && func_state!=2)
				sound();
			ScreenFlip();//裏画面反映
            wait_fanc();//リフレッシュレートを60に

    }


    DxLib_End();//DXライブラリ終了処理
    return 0;
}


開発環境はVC++ 2008 EEです。

Re:アニメーション

Posted: 2009年3月12日(木) 19:04
by 朽木
キー入力待機はしてますか?

してたらごめんなさい。@@;

Re:アニメーション

Posted: 2009年3月12日(木) 19:05
by s-rush
-追記-
必要な部分だけを抜粋してコピペしたので、少し不十分なところがあるかもしれませんが、
関係する部分はopeping()関数内だと思います。

アニメと同じように複数の画像を連続させてアニメーションを表示する方法にしています。
Zキーが入力されたら、for文を抜け出してEXITラベルにジャンプするようにしているのですが、
キー入力をしてもアニメーションがスキップできません。
デバッグでブレイクポイントを作ってもキー入力を認識していないようでした。

おそらく高速で処理されているからだとは思うのですが・・・
アニメーションも最初は表示が速すぎて画面上に現れなかったので。

短期間に連続で質問して申し訳ないですが、アドバイスお願いします。

Re:アニメーション

Posted: 2009年3月12日(木) 19:27
by 御津凪
メインループの処理である、
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2( Key ) && !Key[KEY_INPUT_ESCAPE]){//メインループ
を実行されていないのが原因です。
特に、 GetHitKeyStateAll_2( Key ) でキー入力を更新していないので、入力を受け付けません。

(このため、起動直後にZキーを押しっぱなしにするとスキップされるはずです)

Re:アニメーション

Posted: 2009年3月12日(木) 19:41
by BEMANI
>>s-rushさん
opning関数が呼ばれますが、
この関数を抜けるまでにキー情報が更新されていないっぽいです。
アニメーション処理の中にキー情報を更新する関数を入れてみては如何でしょうか。

また、Zが押されない場合(完全にアニメーションが終わった状態)、
func_stateが2になっていないように見えるので
opning関数が終わった後にでもfunc_stateが2になるようにしておけばいいと思います。
(既にどこかでやっているならごめんなさい。)

Re:アニメーション

Posted: 2009年3月12日(木) 19:47
by SooA
// 不安定にさせない為に長期ループ内には入れておいた方が良い
ProcessMessage() ;
// キーバッファの取得
GetHitKeyStateAll_2( Key ) ;
// 入力判定
if( Key[KEY_INPUT_Z] >= 1 ){
	goto EXIT ;
}
;
入力判定のところでプロセスとキー取得を
行えば大丈夫だと思いますよ。

Re:アニメーション

Posted: 2009年3月12日(木) 21:17
by s-rush
御津凪さん、BEMANIさん、SooAさん、
お早い回答ありがとうございました。

おかげさまで無事スキップすることができました。
(case 2での処理で少し影響を受けてしまいましたが^^;)

もう一点だけお聞きしたいのですが・・・
音楽をメモリに読み込んで音を流すことは当り前のように使用しているのですが、
ふつうは0秒から再生されますよね?
これを指定した時刻から再生することって可能なんでしょうか?

たとえば、
オープニングアニメーションと同時に音楽再生。
Zキー入力後、アニメーションのスキップかつ、音楽(データ)20秒後からの再生
というように。

リファレンスを見たところ、そのような関数がなかったので。

Re:アニメーション

Posted: 2009年3月12日(木) 21:20
by yu
SetSoundCurrentTime(time,handle)関数が使えますね

timeはミリ秒単位です。


ですが、
圧縮形式の場合は正しく設定されない場合があるそうです。

Re:アニメーション

Posted: 2009年3月12日(木) 21:48
by s-rush
yuさん、さっそくの回答ありがとうございます。

>>圧縮形式の場合は正しく設定されない場合があるそうです。
おっしゃる通り、正しく設定できないようでしたorz
 SetSoundCurrentTimeで12秒後から
という設定をしたのですが、またはじめから再生するという形になってしまいます。

データ容量がかさみますが、無圧縮の音楽に変えて再度挑戦してみます。


-追記-
一番お聞きしたかったことが解決できたので、解決ボタンを押しておきます。

Re:アニメーション

Posted: 2009年3月12日(木) 22:00
by SooA
SetSoundCurrentTime() は PlaySoundMem() より前か後どちらに記述しました?
試してないので憶測ですみませんが、
ChangeVolumeSoundMem()等は再生後に記述しないと
効果が出ないので一応試してみてください。

Re:アニメーション

Posted: 2009年3月12日(木) 22:03
by yu
すみません、変なこと書いてました;
編集で以前の記事は消させて頂きました。


推測ですが、
PlaySoundMem()関数の第三引数にFALSEが入力されていますか?
PlaySoundMem(handle,PLAYTYPE,FALSE)

されていたらすみませんm(_ _;)m

Re:アニメーション

Posted: 2009年3月12日(木) 22:07
by s-rush
PlaySoundMem()よりも後です。

流れ的には
LoadSoundMem()で音楽ロード
  ↓
PlaySoundMem()で音楽再生
  ↓
Zキー入力されたらSetSoundCurrentTime()で設定
  ↓
関数を抜ける前にStopSoundMem()

という感じです。

音楽データの形式はmp3なのですが、だめなのですかねぇ・・・
(SetLoopPosSoundMemで、ループ指定はできました)

Re:アニメーション

Posted: 2009年3月12日(木) 22:17
by yu
すみません、あいまいなのですが、

StopSoundMem()関数等で音楽を止めている、または再生前
じゃないと設定できなかったような?・・・
↑間違いです。すみませんm(_ _;)m

流れ的には
StopSoundMem(handle);//今まで流れていた音楽を止める
SetSoundCurrentTime(time,handle);//再生位置セット
PlaySoundMem(handle,PLAYTYPE,FALSE);//先頭から再生するフラグをオフにして、再生開始

ですかね?
うまくいくかな・・・

Re:アニメーション

Posted: 2009年3月12日(木) 22:26
by s-rush
>>流れ的には
>>StopSoundMem(handle);//今まで流れていた音楽を止める
>>SetSoundCurrentTime(time,handle);//再生位置セット
>>PlaySoundMem(handle,PLAYTYPE,FALSE);//先頭から再生するフラグをオフにして、再生開始
私もそう思い、StopSoundMem()で一時停止したり、
考えられる順番をすべて試してみたのですが、だめでした。

PlaySoundMemって第3引数ってあるんですね。
今まで知りませんでした。
FALSEで指定(?)すると、StopSoundMem()で一時停止した場所から再生されました。

Re:アニメーション

Posted: 2009年3月12日(木) 22:28
by yu
すみませんorz
やはりあいまいでした。

SetSoundCurrentTime(time,handle);//再生位置セット
PlaySoundMem(handle,PLAYTYPE,FALSE);//先頭から再生するフラグをオフにして、再生開始

だけで大丈夫でした。
再生中でも設定できました。
(でも結局は前に鳴っていた音楽が重複するので止めないとけませんが)

もう少し調べてから書き込むようにします。すみません orz


ちなみに自分はoggファイルを使用しているのですが、しっかりと設定されています。
ですが、SetCreateSoundDataType()関数でDX_SOUNDDATATYPE_MEMNOPRESS以外を
設定すると正常に設定されませんでした。

# mp3でも正常に動作しました

Re:アニメーション

Posted: 2009年3月12日(木) 22:44
by s-rush
やっぱり、設定できてないようです・・・
SetSoundCurrentTimeの使い方が間違っているのでしょうか?

もう一度コードをアップします。
void opening()
{
	int op_img[115];
	int op_music;
	char path[64];
	int i;

	/*アニメーション動画のロード*/
	for(i=0; i<115; i++)
	{
		sprintf(path, "../data/img/opening/op_%03d.png", i);
		op_img = LoadGraph(path);
	}

		op_music = LoadSoundMem("../data/img/opening/op_music.mp3");

	/*アニメーション再生*/
	PlaySoundMem(op_music, DX_PLAYTYPE_LOOP);
	for(i=0; i<115; i++)
	{
		for(int j=0; j<6; j++){
			// 不安定にさせない為に長期ループ内には入れておいた方が良い
			ProcessMessage() ;
			// キーバッファの取得
			GetHitKeyStateAll_2( Key ) ;
			DrawRotaGraph2(0, 0, 0 , 0 , 2.66 , 0 , op_img , FALSE  ) ;
			ScreenFlip();
			wait_fanc();
			if(Key[KEY_INPUT_Z] == 1){
				StopSoundMem(op_music);
				SetSoundCurrentTime(12280, op_music);
				PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
			goto EXIT;
			}
		}
	}

EXIT:
	StopSoundMem(op_music);
	func_state = 2;
}

Re:アニメーション

Posted: 2009年3月12日(木) 22:52
by SooA
Z キーが押されたらOpeningをスキップして
抜けた先で指定秒から再生するんですよね?
wait_fanc();
			if(Key[KEY_INPUT_Z] == 1){
				StopSoundMem(op_music);
			goto EXIT;
			}
		}
	}
	StopSoundMem(op_music);
EXIT:
	SetSoundCurrentTime(12280, op_music);
	PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
	func_state = 2;
}
じゃないですか?

Re:アニメーション

Posted: 2009年3月12日(木) 22:57
by yu
自分はgotoの使い方が良く分かりませんが
音楽が再生されてすぐに消されている気がします。

話が変わりますが
gotoってあまり使うのは良くないって聞いたのですが何故でしょうか・・・
バグが発生しやすいのでしょうか?

Re:アニメーション

Posted: 2009年3月12日(木) 23:09
by 御津凪
> というよりgotoってあまり使うのは良くないって聞いたのですが

無闇に使うと処理を追いづらくなるから、という理由で私は考えています。
(といいながら自分のソースでは使ってます)

ちなみに、上記のコードで goto を使わない場合は、
if(Key[KEY_INPUT_Z] == 1){
                StopSoundMem(op_music);
                SetSoundCurrentTime(12280, op_music);
                PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
                i = 115; // 外側のループは最大値に設定することで抜ける
                break;   // 内側のループは break で抜ける
            }
        }
    }

//EXIT: // 不要
    StopSoundMem(op_music);
    func_state = 2;
}
とすることで可能です。

Re:アニメーション

Posted: 2009年3月12日(木) 23:10
by s-rush
>>SooAさん
処理的には同じではないでしょか?
EXITラベル以下の処理は、Zキーが押されようが押されまいが実行されるはずです。
Zキーが入力されれば、for文を抜け出るというだけなので・・・

ちなみに教えていただいたコードに書きなおしても正しく設定されませんでした。

>>yuさん
>音楽が再生されてすぐに消されている気がします。
どこで消されているのでしょうか?

goto文・・・
私もどこかであまり使わない方が良いって聞いたような気がします^^;

Re:アニメーション

Posted: 2009年3月12日(木) 23:13
by yu
PlaySoundMem(op_music, DX_PLAYTYPE_LOOP);
	for(i=0; i<115; i++)
	{
		for(int j=0; j<6; j++){
			// 不安定にさせない為に長期ループ内には入れておいた方が良い
			ProcessMessage() ;
			// キーバッファの取得
			GetHitKeyStateAll_2( Key ) ;
			DrawRotaGraph2(0, 0, 0 , 0 , 2.66 , 0 , op_img , FALSE  ) ;
			ScreenFlip();
			wait_fanc();
			if(Key[KEY_INPUT_Z] == 1){
				StopSoundMem(op_music);
				SetSoundCurrentTime(12280, op_music);
				PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
			goto EXIT;
			}
		}
	}

EXIT:
	StopSoundMem(op_music);//←ここです
	func_state = 2;
}

すみません、消されているではなく
止められているですね;


>>御津凪様
確かに処理を行き成り飛ばされたら分かり難くなりますね・・・
(有効な場合もありそうですが)
わざわざお教え頂き、ありがとうございますm(_ _)m

Re:アニメーション

Posted: 2009年3月12日(木) 23:15
by s-rush
>>御津凪さん
>無闇に使うと処理を追いづらくなるから、という理由で私は考えています。
確かに無闇やたらと使うと後々面倒になりそうですね^^;

i=115;を入れてbreakするコードに書きなおしておきます^^

Re:アニメーション

Posted: 2009年3月12日(木) 23:16
by SooA
>gotoってあまり使うのは良くないって聞いたのですが何故でしょうか・・・

様々な処理をすっ飛ばして命令位置を変えるので
プログラムの流れを歪めてしまいます。

流れを無理やり変えるのでバグが発生しやすくなり
バグのが発生した際には処理位置が流れに沿っていないため
探すのも困難になるといった状態になる場合があります。
なので使わないプログラムを書けるようになった方が良いです。

Re:アニメーション

Posted: 2009年3月12日(木) 23:32
by yu
>>SooA様

確かにデバッグがきつくなってしまいますね・・・
参考書には、あまり多用するな!
としか書いてなくて、理由が無かったものですから知らなかったです。
そういえばgoto文の説明すらありませんでした。
今日でどういうものか分かりました。
ありがとうございました。m(_ _)m

Re:アニメーション

Posted: 2009年3月12日(木) 23:33
by s-rush
EXIT:
	StopSoundMem(op_music);//←ここです
	func_state = 2;
}
コメントアウトしていたのに、何かの拍子で消してしまってるorz
ここを削除しても、結果は同じでした。

>>SooAさん
おっしゃる通り、goto文を使わないプログラムを書けるように勉強します。

Re:アニメーション

Posted: 2009年3月12日(木) 23:50
by yu
void opening()
{
	int op_img[115];
	int op_music;
	char path[64];
	int i;

	/*アニメーション動画のロード*/
	for(i=0; i<115; i++)
	{
		sprintf(path, "../data/img/opening/op_%03d.png", i);
		op_img = LoadGraph(path);
	}

		op_music = LoadSoundMem("../data/img/opening/op_music.mp3");
                SetLoopPosSoundMem(0, op_music);//ループ位置セット(←追加したらどうなりますか?)

	/*アニメーション再生*/
	PlaySoundMem(op_music, DX_PLAYTYPE_LOOP);
	for(i=0; i<115; i++)
	{
		for(int j=0; j<6; j++){
			// 不安定にさせない為に長期ループ内には入れておいた方が良い
			ProcessMessage() ;
			// キーバッファの取得
			GetHitKeyStateAll_2( Key ) ;
			DrawRotaGraph2(0, 0, 0 , 0 , 2.66 , 0 , op_img , FALSE  ) ;
			ScreenFlip();
			wait_fanc();
			if(Key[KEY_INPUT_Z] == 1){
				StopSoundMem(op_music);
				SetSoundCurrentTime(12280, op_music);
				PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
			goto EXIT;
			}
		}
	}

EXIT:
	func_state = 2;
}

Re:アニメーション

Posted: 2009年3月12日(木) 23:55
by SooA
>処理的には同じではないでしょか?
Opening が終わるか Zキーで抜けると再生位置が変わる。
という風に解釈しました。

最初の状態ですと Z キーが押された時だけ再生位置が変わります。
if(Key[KEY_INPUT_Z] == 1){
				i = 115 ;
				break ;
			}
		}
	}
	StopSoundMem(op_music);
	SetSoundCurrentTime(12280, op_music);
	PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
	func_state = 2;
}
処理的には問題ないと思うのですが、
これで再生位置が変わらないと言うことは、
何か他に原因があるのかもしれません。

読み込んでいないグラフィックを
DeleteGraph()してたらループ再生しなくて
悩んだことがあります。

直接プログラムに組み込むのではなく
テスト用のプロジェクト作ったほうが良さそうです。
上記のような場合の確認にもなるので。

Re:アニメーション

Posted: 2009年3月12日(木) 23:55
by s-rush
何も変わらず
for(i=0; i<115; i++)
	{
		for(int j=0; j<6; j++){
			// 不安定にさせない為に長期ループ内には入れておいた方が良い
			ProcessMessage() ;
			// キーバッファの取得
			GetHitKeyStateAll_2( Key ) ;
			DrawRotaGraph2(0, 0, 0 , 0 , 2.66 , 0 , op_img , FALSE  ) ;
			ScreenFlip();
			wait_fanc();
			if(Key[KEY_INPUT_Z] == 1){
				StopSoundMem(op_music);
				SetSoundCurrentTime(12280, op_music);
				PlaySoundMem(op_music, DX_PLAYTYPE_LOOP, FALSE);
			goto EXIT;
			}
		}
	}

赤字のStopSoundMemで停止されたところから再び再生されています。

Re:アニメーション

Posted: 2009年3月13日(金) 00:03
by yu
う~ん・・・

すみませんが、自分では今のs-rush様のコードは
合っているような気がします・・・

SooA様が仰るように
小さなプログラムで動作を確認したほうが良いかもしれません;

現在のプロジェクトをあげて貰えるのなら原因がわかるかもしれませんが
(かと言って自分はそこまでプログラムに詳しく無いのでわからないかもしれませんがorz)

自分が小さなミスを逃していそうで怖いです

Re:アニメーション

Posted: 2009年3月13日(金) 00:10
by s-rush
いつも新しいシステムを組み込むときは、
不必要な部分をコメントアウトするか、小さなプロジェクトで動作確認しています。
(今回のは前者の方です)

一度、新たに小さなプロジェクトを作って動作確認をしてみます。

>>自分が小さなミスを逃していそうで怖いです
大学の研修課題でそういうことがありました^^;
原因は定義外のメモリアクセスで、3日間悩んでました(笑

もしかして、今回も同じパターン??

Re:アニメーション

Posted: 2009年3月13日(金) 00:35
by SooA
訂正と追記

訂正
>DeleteGraph()してたらループ再生しなくて
正しくは巻き戻り位置指定のループ再生。

追記
DXライブラリの修正版(テスト版?)は入れらてます?
入ってる場合は2.25を入ってない場合は修正版を
試してみてください。

何も変わらないかもしれませんが…。

Re:アニメーション

Posted: 2009年3月13日(金) 00:53
by 朽木
goto を使わないのは、「美しくないから」と「読む人が追いにくいから」だと思います。

用いるべき、いや、私もあんまり好きじゃないんですけど、そういう時、例えば
/* 条件式が成り立つ間、ループを継続する */
while ( 条件式 )
{
    /* 値で、条件分岐 */
    switch( 値 )
    {
    case 0:
        /* while文を抜けるための処理 */
    default:
        /* 前のcaseのどの値でもなかった場合の処理 */
    }
}
上記のような時に、case 0 で while文 を抜ける処理を書くときに、そのまま break と書くと、

ご想像の通り switch文 を抜ける意味になってしまう訳で、

解決方法として、 Exit用のFlag を作って、 switch文 の直後に if文 を挿入して break する方法もありますが、

goto文 を使うと、 while文 の直後にラベルを挿入して、goto ラベル名 とするだけでできます。

フラグを使うときと比べ、プログラムする人が意識するべき変数の数を減らすことができるので、

ミスを少なくする事が期待(あくまで)できますが、

他の方の言う通り、使いすぎると逆に分からなくなるので多用しない方が良いです。


goto文 を使うなんてC言語を扱う人として恥ずかしい(同日01:05 赤字変更)ということではなく、

経験者が教えるときにそういう事を言って食わず嫌いになっているだけではないかと。

というか、考えてみれば break や continue も吐いてしまえば同じような気がするんですが

どうなんでしょう?@@?
←ごめんなさい。話がそれてしまうので、ナシで

Re:アニメーション

Posted: 2009年3月13日(金) 02:02
by SooA
/* 条件式が成り立つ間、ループを継続する */
while ( 条件式 ) {

	/* 値で条件分岐 */
	if( 値 == 0 )	/* while文を抜けるための処理 */
		break ;

	switch( 値 ) {
		case 1:
			break;
		case 2:
			break;
		default:
			break;
	}
}
switch文で全てを処理する必要はありません、
状況に合わせて条件分岐を使い分ければ良い。

Re:アニメーション

Posted: 2009年3月13日(金) 02:45
by 朽木
あ。@@;;

全然説明になってないですね…ごめんなさい。

言い訳(ぁ:case 0 で while文 を抜ける処理を書くときに

Re:アニメーション

Posted: 2009年3月13日(金) 02:47
by SCI
なぜ突然にgoto論議が始まったのか甚だ疑問ではありますが・・・

朽木さん
>上記のような時に、case 0 で while文 を抜ける処理を書くときに、

SooAさん
>状況に合わせて条件分岐を使い分ければ良い。

何のための「while ( 条件式 )」なのでしょう。
抜ける前に必ず何か処理を行う必要があるなら仕方ないでしょう。
しかし、途中でループを抜けること自体に抵抗がないのはおかしいですね。

本題から外れていますが、この辺は糖衣構文としての敷居やコーディングスタイルが絡むので、結局人それぞれかと(笑)

Re:アニメーション

Posted: 2009年3月13日(金) 02:49
by SooA
自分のがひと段落付いたので試してみたのですが、
こちらでも再生→停止→指定位置から再生
が出来ませんでした。
そこで最終手段?として一度メモリを開放して
呼び直す事で一応途中再生可能になりました。

以下の流れでテスト
MHandle = LoadSoundMem( "omoide.mp3" ) ;
PlaySoundMem( MHandle, DX_PLAYTYPE_LOOP ) ;

StopSoundMem( MHandle ) ;
DeleteSoundMem( MHandle ) ;

MHandle = LoadSoundMem( "omoide.mp3" ) ;

SetSoundCurrentTime( 20000, MHandle ) ;
PlaySoundMem( MHandle, DX_PLAYTYPE_LOOP, FALSE ) ;

Re:アニメーション

Posted: 2009年3月13日(金) 03:14
by SooA
>しかし、途中でループを抜けること自体に抵抗がないのはおかしいですね。
最初の条件がおかしいですからね。
多くの可能性を考えてあえてああしたので
気になさらなくても大丈夫ですよ。^^;

Re:アニメーション

Posted: 2009年3月13日(金) 03:25
by SCI
ところで本題についてですが、これはMP3(圧縮フォーマット)特有の現象なんでしょうか?
自分も時間があれば試してみたいのですが、上を見てみると、どうもDXライブラリの仕様っぽいですね。

Re:アニメーション

Posted: 2009年3月13日(金) 03:57
by SooA
>どうもDXライブラリの仕様っぽいですね。
不具合っぽいですね~。
mp3, ogg, wav 全てダメでした。

最初の再生を行う前にしか反応してないようです。
リファレンスに載せていない関数なので
修正は期待できないかな?><;

Re:アニメーション

Posted: 2009年3月13日(金) 04:03
by SCI
あれ、wavもできないんですか・・・そうすると、途中再生の機能自体、ちょっと癖があるようですね。
非公開ということは、テスト段階の実装でしょう。修正は・・・どうでしょうね(笑)

Re:アニメーション

Posted: 2009年3月13日(金) 08:11
by BEMANI
>>s-rushさん
もし、参考になるのであれば見てみてください。
ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=925
↑グーグルで検索かけて見つけてきたURLですが、すでに試されているのならすいません。

Re:アニメーション

Posted: 2009年3月13日(金) 10:34
by yu
自分はmp3,ogg,wavの3つとも正常に動作しました。

StopSoundMem(handle);//今まで流れていた音楽を止める
SetSoundCurrentTime(time,handle);//再生位置セット
PlaySoundMem(handle,PLAYTYPE,FALSE);//先頭から再生するフラグをオフにして、再生開始

上記の流れでできたのですが、
下記でも設定できたのは何故?・・・
BEMANI様のURLを見ましたが、止めていないと設定できないようですね。ですが、できました。
PlaySoundMem(handle,PLAYTYPE);
SetSoundCurrentTime(time,handle);//再生位置セット
StopSoundMem(handle);//今まで流れていた音楽を止める
PlaySoundMem(handle,PLAYTYPE,FALSE);//先頭から再生するフラグをオフにして、再生開始

これでも設定した位置から再生されました;


DXライブラリのバージョンは2.24cでした。

gotoの発端は自分です。話を逸らせてしまいすみませんでした。orz


#バージョン2.25bでも正常に動作しました。

Re:アニメーション

Posted: 2009年3月13日(金) 11:52
by s-rush
>>SooAさん
教えていただいたように一度メモリを解放してもやはり指定した時間から再生されませんでしたorz
DXライブラリも修正バージョンに入れ直したのですが。

>>SCIさん
DXライブラリの仕様なんですかね??
修正してほしいところです><

>>BEMANIさん
わざわざ探してくださってありがとうございます。
教えていただいたサイトを参考にして、SetSoundCurrentTimeの位置を
いろいろと変えて実行してみたのですが、やはり改善はされませんでした。

>>yuさん
>自分はmp3,ogg,wavの3つとも正常に動作しました。
私は3つとも正常に動作しませんでしたorz


OSがVistaっていうのも関係あるのでしょうか?
Vistaだとプログラムが正常に動作しないこともあるとか何とかで、
嫌う人がすごく多いとどこかで聞いたことがあります・・・

Re:アニメーション

Posted: 2009年3月13日(金) 17:23
by SooA
う~ん、環境に大きく作用されているみたいですね。
後は音楽ファイルそのものを別けるくらいしか
案が浮かびません。

1.OP_A.mp3、OP_B.mp3 二つの音楽ファイルを用意して
 最初に読み込んでおく。
2.OP中は A を再生、
3.OPが終わるか、キーが押されたら Aを停止させて B を再生

音の繋がり、その後のループ問題が有るので
場合によっては良い方法ではありませんが。

Re:アニメーション

Posted: 2009年3月13日(金) 17:32
by s-rush
>>音の繋がり、その後のループ問題が有るので
>>場合によっては良い方法ではありませんが。
そのあたりは何とかしてみます。

どうしてもできそうにもないので、音楽ファイルそのものを2つ用意して実装してみようと思います。

回答してくださった皆さん、ありがとうございました。

Re:アニメーション

Posted: 2009年3月13日(金) 20:37
by 朽木
抵抗がなければ、irrKlang というものをおすすめします。@@;

wav、ogg、mp3が再生できます。他にもありますが、使うことはないかと。

Ambiera - irrKlang
ttp://www.ambiera.com/irrklang/

使い勝手はこんな感じです。色々遊べます。
irrklang::ISoundEngine* SoundEngine = irrklang::createIrrKlangDevice(); /* 初期化 */
irrklang::ISound* BackMusic = SoundEngine->play2D("MusicFile.mp3"); /* 再生 */
if ( BackMusic == NULL )
    /* エラー処理 */
BackMusic->setVolume(0.5); /* 音量を半分に */
BackMusic->setPosition(BackMusic->getPosition() + 1000); /* 1秒後へ移動(再生中問わず) */
BackMusic->setPlaybackSpeed(2.0); /* 再生速度を倍に */
while ( BackMusic->isFinished() == false ); /* 再生が終了するまで待機 */
BackMusic->stopAllSounds(); /* 再生中のサウンドを全て停止 */
SoundEngine->drop(); /* drop */

Re:アニメーション

Posted: 2009年3月13日(金) 21:29
by s-rush
>>朽木さん
ためしに使ってみます。
(仕様を勉強する必要がありますが・・・)

教えてくださってありがとうございます。