Показать сообщение отдельно
Старый 15.02.2011, 06:31   #5
trion
Нуждающийся
 
Аватар для trion
 
Регистрация: 30.05.2010
Адрес: г.Чебоксары
Сообщений: 99
Написано 56 полезных сообщений
(для 316 пользователей)
Ответ: Организация кода: вопросы хранения переменных

Вполне! Только потом если оптимизировать будешь старайся уменьшать количество циклов такого типа (причем это касается не только звуков)
	For snd.TSound = Each TSound
		If (snd\Name = name) Then Return snd
	Next
Ведь ты можешь сразу при загрузке звуков получать прямой указатель строку в списке
Я пользуюсь Handle() и Object. () - как-то привык (эх помню времена, когда они вообще были недокументированными)
Вот переделал твой пример - БЕЗ цикла проверки при запуске звука (вот представь что у тебя тысячи звуков ). То есть блитз это сделает своими более шустрыми механизмами. Почитай вроде в последних версиях справки про эти команды написано...

Include "sound_manager.bb"
...
aaa=smLoadSound ("human_voice.mp3")
smPlaySound (aaa)
...
smDeleteAll()

Type TSound
	Field Name$
	Field Sound
	Field Channel
	Field Volume
	Field Pitch
End Type

		
Function smLoadSound (filename$, name$="unknown", Volume = 100, Pitch = 0)
	snd.TSound = New TSound
	snd\Sound = LoadSound (filename)
	If (snd\Sound = -1) Then
		DebugLog "Sound '" + name + "' is not load!"
		Delete snd
	EndIf 
	snd\Name = name
           Return Handle(snd) ; <<<<<<<<<<< (!)
End Function

Function smPlaySound (hndl)
	snd.TSound = Object.TSound(hndl) ; <<<<<<<<<<< (!)
	If snd <> Null Then
		If Not ChannelPlaying (snd\Channel) Then snd\Channel = PlaySound (snd\Sound)
	Else
		DebugLog "Sound '" + name + "' not found!"
	EndIf 
End Function

Function smStopSound (hndl)
	snd.TSound = Object.TSound(hndl)  ; <<<<<<<<<<< (!)
	If snd <> Null Then
		StopChannel (snd\Channel)
	Else
		DebugLog "Sound '" + name + "' not found!"
	EndIf		
End Function

Function smDeleteAll ()
	For snd.TSound = Each TSound
		FreeSound snd\Sound
		Delete snd
	Next
End Function

Надеюсь не накосячил тут... Сам не компилил.

И еще желательно добавь проверку на одинаковые звуки при загрузке - чтобы память не засорять - то есть проверять есть ли такой звук в менеджере - если есть - то просто передавай этот хендл - правда не зубдь пометить его в списке так как при попытке стереть несуществующий звук выйдет ошибка. Но тут смотри сам по надобности.

Кстати - при загрузке отсутствующего звука ты получишь Object does not exist...
	snd.TSound = New TSound
	snd\Sound = LoadSound (filename)
	If (snd\Sound = -1) Then
		DebugLog "Sound '" + name + "' is not load!"
		Delete snd
	EndIf 
	snd\Name = name ; <<<< Если отсутствует звук, то тут получишь ошибку - так как ты удалил уже snd выше в условии

PS. Параметр name$ - в принципе нафиг не нужен... Только если соберешься делать скриптовую систему или чего подобное...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (15.02.2011)