Организация кода: вопросы хранения переменных
На каждом уровне игрока окружают свои звуки. Соответственно, для каждого звукового фрагмента приходится создавать одну/две глобальные переменные (звук/канал), чтобы можно было управлять ими. Однако, мне такой вариант не очень нравится, поскольку команду очистки уровня, придется модифицировать каждый раз.
В случае с графическими объектами, все решилось достаточно просто: создавая новый графический объект я его привязываю (назначаю Parent) к одному из заведомо существующих объектов (у меня их всего два - sceneMesh и scenePivot). Поэтому при очистке уровне достаточно вызвать Код:
FreeEntity sceneMesh |
Ответ: Организация кода: вопросы хранения переменных
|
Ответ: Организация кода: вопросы хранения переменных
Ну тупо создай список со звуками
Код:
Type Snd Код:
LoadSnd.Snd = New Snd Код:
MySnd=LoadSnd\Hndl Код:
For DelSnd.Snd=Each Snd Но зато в списке будут зареганы все звуки. Кстати вообще рекомендую делать менеджер не только звуков но и объектов также на списках. Так сможешь облегчить себе жизнь. |
Ответ: Организация кода: вопросы хранения переменных
trion, спасибо. Воспользовался идеей, набросал небольшой менеджер для звуков :) Вроде неплохо получилось, прям не ожидал, что так просто будет.
Использование Код:
Include "sound_manager.bb" Код:
Type TSound |
Ответ: Организация кода: вопросы хранения переменных
Вполне! Только потом если оптимизировать будешь старайся уменьшать количество циклов такого типа (причем это касается не только звуков)
Код:
For snd.TSound = Each TSound Я пользуюсь Handle() и Object. () - как-то привык (эх помню времена, когда они вообще были недокументированными) Вот переделал твой пример - БЕЗ цикла проверки при запуске звука (вот представь что у тебя тысячи звуков :)). То есть блитз это сделает своими более шустрыми механизмами. Почитай вроде в последних версиях справки про эти команды написано... Код:
Include "sound_manager.bb" Код:
Type TSound Надеюсь не накосячил тут... Сам не компилил. И еще желательно добавь проверку на одинаковые звуки при загрузке - чтобы память не засорять - то есть проверять есть ли такой звук в менеджере - если есть - то просто передавай этот хендл - правда не зубдь пометить его в списке так как при попытке стереть несуществующий звук выйдет ошибка. Но тут смотри сам по надобности. Кстати - при загрузке отсутствующего звука ты получишь Object does not exist... Код:
snd.TSound = New TSound PS. Параметр name$ - в принципе нафиг не нужен... Только если соберешься делать скриптовую систему или чего подобное... |
Ответ: Организация кода: вопросы хранения переменных
trion, идея с Handle мне не понравилась: использование становится сложнее.
Идея с name заключается в том, что не надо создавать глобальные переменные и к звуковым фрагментам можно обращаться по имени. Если мы используем имя, то код проигрывания определенного звука прост Код:
smPlaySound ("aaa") Код:
hdl = smSoundByName ("aaa") Вообще насчет цикла я голову не забиваю: 100 звуковых фрагментов на уровень и то, вряд ли где можно услышать. Да и как я ранее уже говорил в другой теме - для меня Blitz3D это платформа для создания прототипа, т.е. быстро, убого, но играбельно, и поэтому выбирая между удобством написания кода и оптимизацией, следует выбирать первое. P.S. Ага, косяк с удаляемым :) |
Ответ: Организация кода: вопросы хранения переменных
а приравнять просто переменную в 0 - не катит? На крайняк в нее грузить другой звук
|
Ответ: Организация кода: вопросы хранения переменных
Ну переменная хранит не звук, а ссылку на звук в памяти. Затрешь ссылку - звук в памяти и останется. Утечка памяти это совсем не клево.
|
Часовой пояс GMT +4, время: 18:12. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot