ab.com コミュニティ

ActiveBasicを通したコミュニケーション
前回の訪問日時: 2019年5月26日(日) 16:29 現在時刻 - 2019年5月26日(日) 16:29

All times are UTC+09:00




 [ 3 件の記事 ] 
作成者 メッセージ
 記事の件名: mp3の再生について
投稿記事Posted: 2011年12月23日(金) 00:52 
自作のゲームを作っています。
MCIは不慣れで、やっと他の人のソースを参考に曲を一回再生する程度ができるようになったくらいです。

さて、そのゲームで

・BGMのループ再生
・BGMを鳴らしながらの他の音(効果音)を再生

をやりたいのですが、上手くいきません。

http://www.activebasic.com/forum/viewto ... D%E7%94%9FのSunshine
様の質問内容をコピーして「mop」を「mop[127]」と配列にしてみました。呼び出し用の関数で配列の番号を指定したつもりです。
コード:
Class BACKGROUNDMUSIC
    Private
        mop[127] As MCI_OPEN_PARMS
        mpp[127] As MCI_PLAY_PARMS
        msp[127] As MCI_SET_PARMS
        dwCallback As DWord
        bErr[127] As DWord
    Public
        Sub ~BACKGROUNDMUSIC()
			Dim a As Byte
			Do
            	Stop(a)
				a++
			Loop Until a=128
        End Sub
        Function GetError(id As Char) As String
			Dim pszText As BytePtr,str As String
            mciGetErrorString(bErr[id], pszText, 255)
			str=MakeStr(pszText)
			GetError=str
        End Function
        Sub Stop(id As Char)
            'デバイスの停止
            bErr[id] = mciSendCommand(mop[id].wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)

            'デバイスのクローズ
            mciSendCommand(mop[id].wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)
            mop.wDeviceID=0:
        End Sub
        Sub Play(hCallBackWnd As HWND, filename As BytePtr, from As DWord,id As Char)
            mpp[id].dwFrom = from
            If mop[id].wDeviceID Then Stop(id)

            mop[id].lpstrElementName = filename
            mop[id].dwCallback = hCallBackWnd
            mop[id].lpstrDeviceType = "MPEGVideo"
            bErr[id]=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT or MCI_OPEN_TYPE,mop[id])

            msp[id].dwTimeFormat = MCI_FORMAT_MILLISECONDS
            mciSendCommand(mop[id].wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, msp[id])

            mpp[id].dwCallback = hCallBackWnd
            bErr[id]=mciSendCommand(mop[id].wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp[id])
        End Sub
        Sub Notify(flags As Long, DevID As Long)
            If flags = MCI_NOTIFY_SUCCESSFUL Then
     			bErr[DevID]=mciSendCommand(mop[DevID].wDeviceID,MCI_SEEK,MCI_SEEK_TO_START or MCI_WAIT,msp[DevID])
    			bErr[DevID]=mciSendCommand(mop[DevID].wDeviceID,MCI_PLAY,MCI_NOTIFY ,mpp[DevID])
            End If
        End Sub
End Class

以下はhttp://www.activebasic.com/forum/viewto ... 9%E3%82%B9を参考にサブクラス化でメッセージを取得しました。
コード:
Dim MainDefaultWndProc As DWord
MainDefaultWndProc=GetWindowLong(hMainWnd,GWL_WNDPROC)
Function SubClass(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord

	SelectCase dwMsg
		Case MM_MCINOTIFY
				If PS3fg[lParam]=0 then
					PS3buf.Stop(lParam)
				Else then
					PS3buf.Notify(wParam,lParam)
				EndIf

	EndSelect

	SubClass=CallWindowProc(MainDefaultWndProc,hWnd,dwMsg,wParam,lParam)
EndFunction
SetWindowLong(hMainWnd,GWL_WNDPROC,AddressOf(SubClass))
呼び出し用の関数です。
コード:
Dim PS3buf As BACKGROUNDMUSIC,PS3fg[127] As Byte
Sub PS3(playID As Char)(filepath As BytePtr,IsLoop As Byte,from As DWord)
	If Asc(MakeStr(filepath))=0 then
/*ファイルパスが指定されてなければ
playIDの再生を停止*/
		PS3fg[playID]=0
		PS3buf.Stop(playID)
	Else then
/*IsLoopがTRUEだったら
PS3fg配列のplayID番目を1に
それ以外は普通に再生*/
		If IsLoop=TRUE then PS3fg[playID]=1
		PS3buf.Play(hMainWnd,filepath,from,playID)
	EndIf
End Sub
上記の全てをインクルードファイルに書いて、
コード:
PS3(1,ファイル名TRUE)
で再生してます。

初心者なので無駄なところ(配列が127もある等)もありますがよろしくお願いします。長文ですみません。


ページトップ
   
 
 記事の件名:  
投稿記事Posted: 2012年1月04日(水) 13:43 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
手元にWindowsが無いので確認できませんが、
とりあえず私的に思ったことは……

RADツールを使っているなら、サブクラスにしなくても
コールバック関数で取得できるんじゃないかなぁと思います。(コードをちゃんと読んでないのでわかりませんが)

ループ再生は、デバイスを一回停止してもう一回再生するとか
MCI_SEEK……でしたっけ?そんなので0に戻すとかですかね。
RADツールのイベントに、MCIのイベントがあったと思います。
(終了したらメッセージを送信するとかウンタラカンタラ)
そこにメッセージが飛んでくるので、そいつを捕まえてやればいい感じに……

>BGMを鳴らしながらの他の音(効果音)を再生
WAVなら、PlaySound関数使えば簡単に出来ます。
MCI使うなら……まあ、めんどくさいですがね^^;

ActiveBasicのヘルプセンターなんかにサンプルがありますので、
こっちを参考にしてみてくださいな
PlaySound
http://www.activebasic.com/help_center/ ... index.html
MCI
http://www.activebasic.com/help_center/ ... index.html

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


ページトップ
   
 
投稿記事Posted: 2012年1月04日(水) 17:13 
とりあえずやってみます。


ページトップ
   
 
 [ 3 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: CCBot, Google [Bot] & ゲスト[0人]


トピック投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean