アニメーション

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
s-rush

アニメーション

#1

投稿記事 by s-rush » 16年前

度々すいません。
ゲームにはオープニング等で、よくアニメーションを表示させると思います。
そのオープニングを出すプログラムはできたのですが、
そのムービー(ではないですが)をスキップさせることができません。
#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:アニメーション

#2

投稿記事 by 朽木 » 16年前

キー入力待機はしてますか?

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

s-rush

Re:アニメーション

#3

投稿記事 by s-rush » 16年前

-追記-
必要な部分だけを抜粋してコピペしたので、少し不十分なところがあるかもしれませんが、
関係する部分はopeping()関数内だと思います。

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

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

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

御津凪

Re:アニメーション

#4

投稿記事 by 御津凪 » 16年前

メインループの処理である、
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2( Key ) && !Key[KEY_INPUT_ESCAPE]){//メインループ
を実行されていないのが原因です。
特に、 GetHitKeyStateAll_2( Key ) でキー入力を更新していないので、入力を受け付けません。

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

BEMANI

Re:アニメーション

#5

投稿記事 by BEMANI » 16年前

>>s-rushさん
opning関数が呼ばれますが、
この関数を抜けるまでにキー情報が更新されていないっぽいです。
アニメーション処理の中にキー情報を更新する関数を入れてみては如何でしょうか。

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

SooA

Re:アニメーション

#6

投稿記事 by SooA » 16年前

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

s-rush

Re:アニメーション

#7

投稿記事 by s-rush » 16年前

御津凪さん、BEMANIさん、SooAさん、
お早い回答ありがとうございました。

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

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

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

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

yu

Re:アニメーション

#8

投稿記事 by yu » 16年前

SetSoundCurrentTime(time,handle)関数が使えますね

timeはミリ秒単位です。


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

s-rush

Re:アニメーション

#9

投稿記事 by s-rush » 16年前

yuさん、さっそくの回答ありがとうございます。

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

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


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

SooA

Re:アニメーション

#10

投稿記事 by SooA » 16年前

SetSoundCurrentTime() は PlaySoundMem() より前か後どちらに記述しました?
試してないので憶測ですみませんが、
ChangeVolumeSoundMem()等は再生後に記述しないと
効果が出ないので一応試してみてください。

yu

Re:アニメーション

#11

投稿記事 by yu » 16年前

すみません、変なこと書いてました;
編集で以前の記事は消させて頂きました。


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

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

s-rush

Re:アニメーション

#12

投稿記事 by s-rush » 16年前

PlaySoundMem()よりも後です。

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

という感じです。

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

yu

Re:アニメーション

#13

投稿記事 by yu » 16年前

すみません、あいまいなのですが、

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

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

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

s-rush

Re:アニメーション

#14

投稿記事 by s-rush » 16年前

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

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

yu

Re:アニメーション

#15

投稿記事 by yu » 16年前

すみませんorz
やはりあいまいでした。

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

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

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


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

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

s-rush

Re:アニメーション

#16

投稿記事 by s-rush » 16年前

やっぱり、設定できてないようです・・・
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;
}

SooA

Re:アニメーション

#17

投稿記事 by SooA » 16年前

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;
}
じゃないですか?

yu

Re:アニメーション

#18

投稿記事 by yu » 16年前

自分はgotoの使い方が良く分かりませんが
音楽が再生されてすぐに消されている気がします。

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

御津凪

Re:アニメーション

#19

投稿記事 by 御津凪 » 16年前

> というより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;
}
とすることで可能です。

s-rush

Re:アニメーション

#20

投稿記事 by s-rush » 16年前

>>SooAさん
処理的には同じではないでしょか?
EXITラベル以下の処理は、Zキーが押されようが押されまいが実行されるはずです。
Zキーが入力されれば、for文を抜け出るというだけなので・・・

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

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

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

yu

Re:アニメーション

#21

投稿記事 by yu » 16年前

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

s-rush

Re:アニメーション

#22

投稿記事 by s-rush » 16年前

>>御津凪さん
>無闇に使うと処理を追いづらくなるから、という理由で私は考えています。
確かに無闇やたらと使うと後々面倒になりそうですね^^;

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

SooA

Re:アニメーション

#23

投稿記事 by SooA » 16年前

>gotoってあまり使うのは良くないって聞いたのですが何故でしょうか・・・

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

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

yu

Re:アニメーション

#24

投稿記事 by yu » 16年前

>>SooA様

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

s-rush

Re:アニメーション

#25

投稿記事 by s-rush » 16年前

EXIT:
	StopSoundMem(op_music);//←ここです
	func_state = 2;
}
コメントアウトしていたのに、何かの拍子で消してしまってるorz
ここを削除しても、結果は同じでした。

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

yu

Re:アニメーション

#26

投稿記事 by yu » 16年前

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;
}

SooA

Re:アニメーション

#27

投稿記事 by SooA » 16年前

>処理的には同じではないでしょか?
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()してたらループ再生しなくて
悩んだことがあります。

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

s-rush

Re:アニメーション

#28

投稿記事 by s-rush » 16年前

何も変わらず
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で停止されたところから再び再生されています。

yu

Re:アニメーション

#29

投稿記事 by yu » 16年前

う~ん・・・

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

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

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

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

s-rush

Re:アニメーション

#30

投稿記事 by s-rush » 16年前

いつも新しいシステムを組み込むときは、
不必要な部分をコメントアウトするか、小さなプロジェクトで動作確認しています。
(今回のは前者の方です)

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

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

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

SooA

Re:アニメーション

#31

投稿記事 by SooA » 16年前

訂正と追記

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

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

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

朽木

Re:アニメーション

#32

投稿記事 by 朽木 » 16年前

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 も吐いてしまえば同じような気がするんですが

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

SooA

Re:アニメーション

#33

投稿記事 by SooA » 16年前

/* 条件式が成り立つ間、ループを継続する */
while ( 条件式 ) {

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

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

朽木

Re:アニメーション

#34

投稿記事 by 朽木 » 16年前

あ。@@;;

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

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

SCI

Re:アニメーション

#35

投稿記事 by SCI » 16年前

なぜ突然にgoto論議が始まったのか甚だ疑問ではありますが・・・

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

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

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

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

SooA

Re:アニメーション

#36

投稿記事 by SooA » 16年前

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

以下の流れでテスト
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 ) ;

SooA

Re:アニメーション

#37

投稿記事 by SooA » 16年前

>しかし、途中でループを抜けること自体に抵抗がないのはおかしいですね。
最初の条件がおかしいですからね。
多くの可能性を考えてあえてああしたので
気になさらなくても大丈夫ですよ。^^;

SCI

Re:アニメーション

#38

投稿記事 by SCI » 16年前

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

SooA

Re:アニメーション

#39

投稿記事 by SooA » 16年前

>どうもDXライブラリの仕様っぽいですね。
不具合っぽいですね~。
mp3, ogg, wav 全てダメでした。

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

SCI

Re:アニメーション

#40

投稿記事 by SCI » 16年前

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

BEMANI

Re:アニメーション

#41

投稿記事 by BEMANI » 16年前

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

yu

Re:アニメーション

#42

投稿記事 by yu » 16年前

自分は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でも正常に動作しました。

s-rush

Re:アニメーション

#43

投稿記事 by s-rush » 16年前

>>SooAさん
教えていただいたように一度メモリを解放してもやはり指定した時間から再生されませんでしたorz
DXライブラリも修正バージョンに入れ直したのですが。

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

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

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


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

SooA

Re:アニメーション

#44

投稿記事 by SooA » 16年前

う~ん、環境に大きく作用されているみたいですね。
後は音楽ファイルそのものを別けるくらいしか
案が浮かびません。

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

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

s-rush

Re:アニメーション

#45

投稿記事 by s-rush » 16年前

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

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

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

朽木

Re:アニメーション

#46

投稿記事 by 朽木 » 16年前

抵抗がなければ、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 */

s-rush

Re:アニメーション

#47

投稿記事 by s-rush » 16年前

>>朽木さん
ためしに使ってみます。
(仕様を勉強する必要がありますが・・・)

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

閉鎖

“C言語何でも質問掲示板” へ戻る