Loading...
Smeshan avatar Smeshan 89 Точки

SDL_Mixer

Здравейте,

какво е игра без звуци? :)
Та мисля успях да повторя пътя на Image и Text и да направя обект Sound. (положил съм основи и за обект Music)

Ето ми проекта:
https://github.com/Smeshan/SFX

И сега въпросите:
1. Аудио ресурсите имат ли нужда от Flyweight design pattern? Защото доколкото разбрах, ако в същия момент се пусне друг звук, той просто се пуска по-друг канал и толкова? Или?
2. Това ли е начина по-който съм го направил (подобен на Image и Text)?
3. За звуци има ли някакъв друг дизайн или методика? 
4. Дебъгвах около 1-2 часа един проблем и накрая хванах грешката тук в MediaMgr.cpp:

void MediaMgr::addPlaySoundCmd(const int32_t sndId) {
    SoundContainer::playSoundCmd(sndId);   
    //QUESTION
    // why is not working with _soundContainer.playSoundCmd(sndId):
}

Нали мениджъра всъщност притежава контейнера и той го инициализира и т.н.? И ако го достъпя директно след playSoundCmd() фунцкията идва празен контейнер и гърми. :? Нещо не мога да си визуализирам последователността и това малко ме обърква.
5. Правилно ли разсъждавам: Ако имам обект бутон и в него си вкарвам хедъра Sound.h и при инициализацията на този обект, създавам и неговия прилежащ звук. И вече при InputHandle-a на бутона го плейвам, когато си искам? Това ли е идеята?

Толкова от мен. Бих видял и на някой друг кода, ако е писал за звук (или ще пише) :)

Поздрави,
Илиян

 

Тагове:
3
C++ Applications Development 28/10/2021 22:47:47
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Илиян,

Браво за труда в посока звуци! Железен си!
Точно това е нещото, което трябваше да направиш.
Бих тръгнал в почти същата посока, ако го преподавах. Реших, обаче да го премахна от курса, защото ставаше много като материал.

Отговарям на въпросите:
4) MartinBG ти е отговорил доста ясно. Просто имаш контейнера 2 пъти. Веднъж от наследяването и веднъж като private member.
Изтриий едното от двете.

1) Аудио ресурсите имат ли нужда от Flyweight design pattern?
Не, нямат нужда. Но е добре да го направиш.
Вече имаш целият backbone на твоето приложение, което е имплементирало flyweigh обекти за картинки, анимации и текстове.
Звуците и музиката не са нещо по-различно. "Backend" информация, към която имаш handle (в случая един прост int32_t).


1.1) доколкото разбрах, ако в същия момент се пусне друг звук, той просто се пуска по-друг канал и толкова? Или?
Тук е малко tricky. Правилно си разбрал - да. Можеш да ползваш целият sound backend като просто извикаш playSound и това би се play-нало на друг канал.
Лошото е че не можеш да спираш звуците.
Ако искаш да имаш възможност да ги спираш (прекъсваш) преди да са приключили - имаш не-малко работа.
Вече сам трябва да управляваш каналите, на които се пускат. Да знаеш кой канал е сводбоден и кой не.
От там пък трябва да разбереш кога даден звук е приключил.
Това става като регистрираш свой callback, който SDL_Mixer-а да ти извика.
За жалост на младшия разработчик - SDL_Mixer-а работи в друг thread различен от основния.
Т.е. callback-а, който си подал ще ти се викне от друг thread.
Трябва да си подсигуриш, че ще защитиш своите данни и няма да имаш data race.
Това са multithreading знания, които идват в повече за някой тепърва учещ се човек.
Не, че е rocket-science де...но и то си има своите специфики.


2. Това ли е начина по-който съм го направил (подобен на Image и Text)?
Абсолютно правилно - поздравления. Единствено бих направил малка модификация в хедъра ти Media.h.
Говорихме, че sdl_utils библиотеката ще бъде wrapper на SDL.
По начина по който си include-нал хедъра <SDL_Mixer.h> в Media.h този файл не може да бъде използван извън библиотеката, защото SDL_INCLUDE_DIR са маркирани като PRIVATE include path.
Просто направи forward declaration на Mix_Chunk и Mix_Music и включи хедъра в cpp файла.


3. За звуци има ли някакъв друг дизайн или методика?
Когато говорим за базови функционалности - не.
Звуците си имат свои специфики, в които за жалост нямам много опит.
Например можеш да създадеш  ефекта за 3D аудио като модифицираш panning на някой канал.
Все едно звука да е по-силен на левия speaker спрямо десния, ако обекта ти идва "от ляво".
SDL_Mixer-а обаче е доста отраничен, ако искаш истински 3D sound. Там вече трябва да ползваш някаква по-специализирана библиотека за аудио.


5) Правилно ли разсъждавам: Ако имам обект бутон и в него си вкарвам хедъра Sound.h и при инициализацията на този обект, създавам и неговия прилежащ звук. И вече при InputHandle-a на бутона го плейвам, когато си искам? Това ли е идеята?
Кратко, точно и ясно - да. Браво :)

Поздрави и все така смело напред,
Живко

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.