forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Сканирование папки с музыкой с неизвестным содержимым (http://forum.boolean.name/showthread.php?t=13537)

Kudesnic 20.10.2010 02:41

Сканирование папки с музыкой с неизвестным содержимым
 
Иногда в компьютерных играх хочется поменять музыку на что-то свое. Для этого приходится конвертировать и переименовывать свои музыкальные файлы под игровые. И добавлять путем их замены.
Например как в "Героях 3"
Но приятно когда можно только скопировать любимую музыку в игровую папку, ничего не переделывая, И она без проблем воспроизводилась.
Например как в TES4: Oblivion или частично GTA San Andreas

Чтобы музыка в ваших играх ограничивалась только содержимым вашей папки с игровой музыкой, а не конкретным списком, я сделал функцию, которая просканирует указанную папку и запишет пути к каждому музыкальному файлу (.mp3 .wav .ogg) в тип, а еще возвратит количество отсканированного.

Код:

;Вся сканированная музыка записывается в type  musfile.musfile


Type foldermusic
Field n$
End Type

Type tfoldermusic
Field n$
End Type

Type ynfoldermusic
Field n$
End Type

Type musfile
Field name$ ;путь к файлу
Field n; порядковый номер (можно использовать для перемешивания списка музыки)
End Type

Global cdir$

Function musicscan(musicdir$=".")
nmus=0
For musfile.musfile=Each musfile
        Delete musfile
Next
cdir=CurrentDir()
ChangeDir musicdir
foldermusicf()
DebugLog "FOLDERS"
For foldermusic.foldermusic=Each foldermusic
        DebugLog foldermusic\n
Next
For foldermusic.foldermusic=Each foldermusic
        myDir=ReadDir(foldermusic\n)
        Repeat
                file$=NextFile$(myDir)
                If file$="" Then Exit
                If FileType(foldermusic\n+"\"+file$) <> 2
                        If Right$(file$,4)=".mp3"  Or Right$(file$,4)=".wav" Or Right$(file$,4)=".ogg"
                                nmus=nmus+1
                                musfile.musfile=New musfile
                                musfile\name=foldermusic\n+"\"+file$
                                musfile\n=nmus
                        EndIf
                EndIf
        Forever
        CloseDir myDir 
Next
DebugLog "FILES"
For musfile.musfile=Each musfile
        DebugLog musfile\n+" "+musfile\name
Next
DebugLog nmus+" tracks"
For foldermusic.foldermusic=Each foldermusic
        Delete foldermusic
Next
For tfoldermusic.tfoldermusic=Each tfoldermusic
        Delete tfoldermusic
Next
For ynfoldermusic.ynfoldermusic=Each ynfoldermusic
        Delete ynfoldermusic
Next
ChangeDir cdir
Return nmus
End Function

Function foldermusicf(f$=".")
folder$=f$
myDir=ReadDir(folder$)
Repeat
        file$=NextFile$(myDir)
        If file$="" Then Exit
        If FileType(file$) = 2 Then
                If  file$<>"." And file$<>".."
                        foldermusic.foldermusic=New foldermusic
                        foldermusic\n=file$
                EndIf
        End If
Forever
Repeat
        For ynfoldermusic.ynfoldermusic=Each ynfoldermusic
                Delete ynfoldermusic
        Next
        For foldermusic.foldermusic=Each foldermusic
                ynfoldermusic.ynfoldermusic=New ynfoldermusic
                ynfoldermusic\n=foldermusic\n
        Next
        okfoldermusic=0
        For foldermusic.foldermusic=Each foldermusic
                myDir=ReadDir(foldermusic\n)
                Repeat
                        file$=NextFile$(myDir)
                        If  file$<>"." And file$<>".."
                                If file$="" Then Exit
                                If FileType(foldermusic\n+"\"+file$) = 2  And ynfoldermusic(foldermusic\n+"\"+file$)=True
                                        okfoldermusic=okfoldermusic+1
                                        tfoldermusic.tfoldermusic=New tfoldermusic
                                        tfoldermusic\n=foldermusic\n+"\"+file$
                                End If
                        EndIf
                Forever
                CloseDir myDir
        Next
        For tfoldermusic.tfoldermusic=Each tfoldermusic
                foldermusic.foldermusic=New foldermusic
                foldermusic\n=tfoldermusic\n
                Delete tfoldermusic
        Next
Until okfoldermusic=0
foldermusic.foldermusic=New foldermusic
foldermusic\n="."
End Function

Function ynfoldermusic(tfl$)
ynf=True
For ynfoldermusic.ynfoldermusic=Each ynfoldermusic
        If ynfoldermusic\n=tfl Then ynf=False
Next
Return ynf
End Function

Данный код удобно сохранить в файл, а потом его инклудить
Использование:
Вызвать musicscan(dir$)
где dir$ -путь к папке с игровой музыкой
Затем работать в цикле For musfile.musfile=Each musfile c переменными musfile\n и musfile\name, что соответствует порядковому номеру и пути к каждому музыкальному файлу

Пример:
Код:

Include "musicscan.bb"

dir$="data\music\"
nmusic=musicscan(dir)
shuffle=Rand(nmusic)

For musfile.musfile=Each musfile
        If musfile\n=shuffle
                PlayMusic dir+musfile\name
                Print "Now playing: "+musfile\n+"  track"
        EndIf
Next

WaitKey()
End

В данном примере сканируется папка music функцией scanmusic() и заодно в переменную nmusic записывается количество сканированного. Затем в цикле проигрывается музыка со случайным порядковым номером musfile\n который соответствует пути musfile\name

Kudesnic 07.12.2010 14:43

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Я хочу усовершенствовать эту функцию, и у меня возникли трудности.
Как с помощью блитза можно "прочитать" обычный виндосовский ярлык?
То есть как перейти в директорию, на которую ссылается этот ярлык?

impersonalis 07.12.2010 16:35

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Пропарсь. Не думаю, что формат сложен

den 07.12.2010 16:58

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Угу.
Измени в тотал командрс(или другом файловом менеджере) расширение .lnk на .txt например. И там в середине будет написан полный адрес файла на который он ссылается.

impersonalis 07.12.2010 18:23

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Den что за изврат?
Kudesnic:
да просто перетащи на ярлык блокнота lnk-файл, или в открытый блокнот его брось.

Kudesnic 08.12.2010 16:51

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Код:

file=OpenFile("folder.lnk")
string$=ReadLine$(file)
CloseFile file
DebugLog string
End

Попытался таким способом вытянуть текст из ярлыка в строковою переменную string. И, к сожалению туда, записывается только первая буква "L"
Но стоит только с помощью блокнота "открыть" файл ярлыка и тут же его сохранить, то после этого блитз нормально читает всю строку. Правда после такого "сохранения" ярлык становится не читаемым для windows.
Есть ли другой способ вытаскивания текста из файла?

Randomize 08.12.2010 18:23

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
http://www.stdlib.com/art6-Shortcut-...ormat-lnk.html

Kudesnic 08.12.2010 21:45

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Конечно спасибо.
Я только понял, что мне нужно разбираться самому. Но самому никак, значит проще тупо забить на это дело.
Жаль что знающие люди часто вместо нормальной помощи отвечают загадками

;)

ABTOMAT 08.12.2010 21:52

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Какие загадки? Тебе дали ссылку на полное описание формата lnk, где чётко написано, в каком порядке там что находится, и где лежит интересующая тебя информация.
Читать её за тебя и писать код никто не будет, увы...

impersonalis 08.12.2010 22:33

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Задача элементарная (осбенно, если только адрес взять), но времени мало. Автор - я начинаю сомневаться в качестве первого поста =(
апд чо-то, похоже, я не зря волнуюсь; постараюсь в ближ время показать вариант

SBJoker 09.12.2010 00:23

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
А мне кажется что стандартный ShellExecute ярлыку сам сделает всё за вас.

Dream 09.12.2010 03:42

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
мне кажется он топикстартер хочет чтобы была возможность скинуть в папку с мызыкой ярлык на папку, и программа искала там

Kudesnic 09.12.2010 18:23

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Цитата:

Сообщение от ABTOMAT (Сообщение 171413)
Какие загадки? Тебе дали ссылку на полное описание формата lnk, где чётко написано, в каком порядке там что находится, и где лежит интересующая тебя информация.
Читать её за тебя и писать код никто не будет, увы...

Я не прошу написать код :)
Где лежит адрес папки это и в блокноте видно.
Просто блитз ее не видит(

RBK 10.12.2010 02:11

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
Цитата:

Сообщение от Kudesnic (Сообщение 171472)
Я не прошу написать код :)
Где лежит адрес папки это и в блокноте видно.
Просто блитз ее не видит(

Блитз видит достаточно.
Код:

file=OpenFile("folder.lnk")
While  Not Eof(file)
  b=ReadByte(file)
  If b>31 Then String$=String$+Chr$(b)
Wend
CloseFile file
DebugLog String$
Stop


Kudesnic 10.12.2010 03:02

Ответ: Сканирование папки с музыкой с неизвестным содержимым
 
RBK
Спасибо огромное!!! :)
Больше вопросов нет
Дальше я сам)


Часовой пояс GMT +4, время: 17:13.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot