0

さて、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 も使用しています。したがって、これらのいずれかを使用できる場合は、これらのいずれかを使用して必要なことを行う方法を教えてください. 助けてくれてありがとう。

4

2 に答える 2

0

これが非常に古いスレッドであることは知っていますが、誰かに役立つ場合は、ここに解決策があります.

フルパスを使用する必要がありますが、リソースが保存されていると仮定すると、/projectfolder/resources/使用できます

Dim filePath As String = Chr(34) & Application.StartupPath & "/../../Resources/myMusic.mp3" & Chr(34)
mciSendString("open " & filePath & " alias myMusic", CStr(0), 0, 0)

VB.NET プロジェクトでApplication.StartupPathは、 は が格納されているフォルダーへのフル パス.exeです。通常、それはpath/projectfolder/bin/debug/またはにありpath/projectfolder/bin/release/ます。それに追加/../../resources/すると が/projectfolder/resources/表示され、VB.NET 自体がフォルダーを検出するため、フォルダーへのフル パスを知ることができなくなります。

于 2015-11-02T12:27:51.580 に答える