Показать сообщение отдельно
Старый 20.10.2010, 02:41   #1
Kudesnic
Нуждающийся
 
Аватар для Kudesnic
 
Регистрация: 27.08.2010
Адрес: Лен. область
Сообщений: 58
Написано 21 полезных сообщений
(для 50 пользователей)
Сканирование папки с музыкой с неизвестным содержимым

Иногда в компьютерных играх хочется поменять музыку на что-то свое. Для этого приходится конвертировать и переименовывать свои музыкальные файлы под игровые. И добавлять путем их замены.
Например как в "Героях 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, 21.10.2010 в 06:47.
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо Kudesnic за это полезное сообщение:
ABTOMAT (20.10.2010), Android (07.12.2010), Crayzi (13.11.2010), Harter (08.12.2010), maxturbo (20.10.2010), Nex (20.10.2010), St_AnGer (07.12.2010)