さて、mciSendString を使用して SOUND クラスを作成しました。私が作成している RPG スタイルのゲームの音楽やその他のサウンド ファイルを再生するために使用しています。それは機能し、うまく機能します...しかし。私の問題は、それが機能するためにサウンドファイルの完全なパスが必要なことです (これが正しいかどうかはわかりません)。
以下は、mcisendstring のクェークの一部です。
- mcisendstring スペースを嫌います。スペースはクラッシュの原因になります (ファイルの読み込みに失敗します) - 引用符を追加
- パスにドットがあると、読み込みに失敗する可能性があります (拡張子にはドットのみを使用する必要があります)
- パスが非常に長いと読み込みに失敗します (許可される最大文字数は 255 です)
- 相対パスは読み込みに失敗します... (chicken.mp3 のようなものは使用できません... C:\chicken.mp3 を使用する必要があります)
- repeat = true の場合、.wav ファイルはロードに失敗します。
リソースにファイルを追加して、リソースへのパスを設定しようとしましたが、次のように表示されましたValue of type '1-dimensional array of Byte' cannot be converted to 'String'
。
どんな助けでも大歓迎です:)
これが私のコードです:
Public Class SOUND
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
'Command String VERY IMPORTANT
Private oName As String = Nothing
Public Property Name As String
Set(value As String)
oName = value
End Set
Get
Return oName
End Get
End Property
Public Sub Play(ByVal id As Integer, ByVal repeat As Boolean, Optional volume As Integer = 1000)
If repeat = True Then
mciSendString("Open " & GetFile(id) & " alias " & oName, CStr(0), 0, 0) 'Open the file
mciSendString("play " & oName & " repeat ", CStr(0), 0, 0) 'then play with repeating value
Else
mciSendString("Open " & GetFile(id) & " alias " & oName, CStr(0), 0, 0)
mciSendString("play " & oName, CStr(0), 0, 0)
End If
'Optionally Set Volume
mciSendString("setaudio " & oName & " volume to " & volume, CStr(0), 0, 0)
End Sub
Public Sub Kill(ByVal song As String)
mciSendString("close " & song, CStr(0), 0, 0)
oName = Nothing
End Sub
' Media Library
Private Function GetFile(ByVal id As Integer) As String
Dim path As String = ""
'mcisendstring Hates spaces, spaces will cause crash (failure to load file) - ADD QUOTES
'Dots in path can cause failure to load (only dot should be for the extention)
'Very Long Paths will cause failure to load (Max Characters allowed is 255)
'Relative paths will cause failure to load...(cannot use something like chicken.mp3 ... must use ex:[C:\chicken.mp3])
'.wav files will fail to load if repeat = true
Select Case id
Case 0 'Game Over
path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3"
Case 1 'Battle Sequence
path = "C:\FinalFantasyTactics-Garland_Magic.mp3"
Case 2 'Battle Victory
path = "C:\FinalFantasyLegend2-Victory.mp3"
Case 3 'Mission Time
path = "C:\FinalFantasyAdventure-Mission.mp3"
End Select
path = Chr(34) & path & Chr(34)
'Chr(34) is quotes...cannot just use "" because it will think that it is part of the string/path itself.
Return path
End Function
クラス終了
必要なもの:
- どうにかして .mp3 ファイルをパスに使用できるリソースとして取得する必要があります。または、これらのファイルをルート ドライブまたはその他の完全なコンピューター パスに配置する代わりに、他の手段が必要です。
必要なものの例
変化する
Select Case id
Case 0 'Game Over
path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3"
End Select
に
Select Case id
Case 0 'Game Over
path = My.Resources.FinalFantasyAdventure_Mission
End Select
サウンドの再生方法:
(別のテストフォームで)
Dim intSound As Integer = 0
Dim snd As New SOUND 'SOUND is the sound class with mcisendstring
Private Sub PlaySoundBtn_Click(sender As System.Object, e As System.EventArgs) Handles PlaySoundBtn.Click
intSound += 1
With snd
.Name = "SOUND" & intSound 'SOUND is the alias along with the number (this one is SOUND1)
.Play(3, True, 500)
'3 is the song ID, True is for the repeat, 500 is for the optional volume (Max = 1000)
End With
End Sub
PS プロジェクトで XNA Graphics を使用しており、NuGet の BizArk Core も使用しています。したがって、これらのいずれかを使用できる場合は、これらのいずれかを使用して必要なことを行う方法を教えてください. 助けてくれてありがとう。