Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 15.02.2011, 00:20   #1
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Организация кода: вопросы хранения переменных

На каждом уровне игрока окружают свои звуки. Соответственно, для каждого звукового фрагмента приходится создавать одну/две глобальные переменные (звук/канал), чтобы можно было управлять ими. Однако, мне такой вариант не очень нравится, поскольку команду очистки уровня, придется модифицировать каждый раз.

В случае с графическими объектами, все решилось достаточно просто: создавая новый графический объект я его привязываю (назначаю Parent) к одному из заведомо существующих объектов (у меня их всего два - sceneMesh и scenePivot). Поэтому при очистке уровне достаточно вызвать
FreeEntity sceneMesh
FreeEntity scenePivot
Хотелось бы, что-то подобное для звука. Кажется через типы можно исхитрится. У кого какие идеи будут?
(Offline)
 
Ответить с цитированием
Старый 15.02.2011, 00:34   #2
is.SarCasm
Бывалый
 
Аватар для is.SarCasm
 
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений
(для 428 пользователей)
Ответ: Организация кода: вопросы хранения переменных

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

Ну тупо создай список со звуками

Type Snd
Field Hndl
End type
Загружай так:

LoadSnd.Snd = New Snd
LoadSnd\Hndl=LoadSound("snd.wav")
И присваивай своим глобальным переменным тот же звук

MySnd=LoadSnd\Hndl
и потом чтобы удалить сделаешь

For DelSnd.Snd=Each Snd
FreeSound DelSnd\Hndl
delete DelSnd
Next
тока учти, что в твоих глобальных переменных останутся идентификаторы звуков. Чисти вручную.

Но зато в списке будут зареганы все звуки.

Кстати вообще рекомендую делать менеджер не только звуков но и объектов также на списках. Так сможешь облегчить себе жизнь.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо trion за это полезное сообщение:
Aikon (15.02.2011), Arles (15.02.2011)
Старый 15.02.2011, 05:33   #4
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Ответ: Организация кода: вопросы хранения переменных

trion, спасибо. Воспользовался идеей, набросал небольшой менеджер для звуков Вроде неплохо получилось, прям не ожидал, что так просто будет.

Использование
Include "sound_manager.bb"
...
smLoadSound ("human_voice.mp3", "aaa")
smPlaySound ("aaa")
...
smDeleteAll()
sound_manager.bb
Type TSound
	Field Name$
	Field Sound
	Field Channel
	Field Volume
	Field Pitch
End Type

Function smSoundByName.TSound (name$)
	For snd.TSound = Each TSound
		If (snd\Name = name) Then Return snd
	Next
	DebugLog "Sound '" + name + "' is not exist!"
End Function
		
Function smLoadSound (filename$, name$, 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
End Function

Function smPlaySound (name$)
	snd.TSound = smSoundByName (name)
	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 (name$)
	snd.TSound = smSoundByName (name)
	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
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Aikon за это полезное сообщение:
LLI.T.A.L.K.E.R. (15.02.2011), trion (15.02.2011)
Старый 15.02.2011, 06:31   #5
trion
Нуждающийся
 
Аватар для trion
 
Регистрация: 30.05.2010
Адрес: г.Чебоксары
Сообщений: 99
Написано 56 полезных сообщений
(для 315 пользователей)
Ответ: Организация кода: вопросы хранения переменных

Вполне! Только потом если оптимизировать будешь старайся уменьшать количество циклов такого типа (причем это касается не только звуков)
	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)
Старый 15.02.2011, 17:14   #6
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Ответ: Организация кода: вопросы хранения переменных

trion, идея с Handle мне не понравилась: использование становится сложнее.
Идея с name заключается в том, что не надо создавать глобальные переменные и к звуковым фрагментам можно обращаться по имени.
Если мы используем имя, то код проигрывания определенного звука прост
smPlaySound ("aaa")
Если же Handle, то несколько сложнее
hdl = smSoundByName ("aaa")
smPlaySound (hdl)
Т.е. все равно выполнять цикл поиска.
Вообще насчет цикла я голову не забиваю: 100 звуковых фрагментов на уровень и то, вряд ли где можно услышать. Да и как я ранее уже говорил в другой теме - для меня Blitz3D это платформа для создания прототипа, т.е. быстро, убого, но играбельно, и поэтому выбирая между удобством написания кода и оптимизацией, следует выбирать первое.

P.S. Ага, косяк с удаляемым
(Offline)
 
Ответить с цитированием
Старый 16.02.2011, 20:31   #7
Alex_Noc
Разработчик
 
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений
(для 289 пользователей)
Ответ: Организация кода: вопросы хранения переменных

а приравнять просто переменную в 0 - не катит? На крайняк в нее грузить другой звук
(Offline)
 
Ответить с цитированием
Старый 16.02.2011, 22:36   #8
trion
Нуждающийся
 
Аватар для trion
 
Регистрация: 30.05.2010
Адрес: г.Чебоксары
Сообщений: 99
Написано 56 полезных сообщений
(для 315 пользователей)
Ответ: Организация кода: вопросы хранения переменных

Ну переменная хранит не звук, а ссылку на звук в памяти. Затрешь ссылку - звук в памяти и останется. Утечка памяти это совсем не клево.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо trion за это полезное сообщение:
Alex_Noc (17.02.2011), h1dd3n (17.02.2011), LLI.T.A.L.K.E.R. (16.02.2011), Nex (17.02.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com