Форум » » Гибкий плейлист » Ответить

Гибкий плейлист

werewolf: Когда я начал озвучивать Лабиринт страха, то ознакомился со всеми реализациями плейлистов, какие только нашел, но у всех был один и тот же недостаток - они были недостаточно гибкими - каждый раз нужно все переписывать под себя. Немного поексперементировав я нашел решение, которое без изменений в логике можно будет использовать практически в любом проекте. В скрипте используется понятие "музыкальной темы" - набора файлов, которые проигрываются один за одним. Причем подключение темы происходит переопределением всего одной переменной. Создавать новую тему тоже очень просто - нужно создать массив с путями к нужным файлам используя очень простое правило именования - если тема будет называться intro, то массив должен называться $tracklist_intro. После этого отается только в нужном месте написать $music_theme = 'intro' и тема будет загружена. Скрипт также поддерживает изменение громкости проигрывания. Жду критики и предложений по улучшению. Потом я думаю можно будет сделать небольшую демку и залить на сайт. Файл со скриптом

Ответов - 14

Byte: Сразу заметил if ARRSIZE('cur_theme')<track:track=0 и if ARRSIZE('tracklist_default')<track_def:track_def=0 здесь <=track, т.к. элементы массива будут с индексами (0)...(ARRSIZE('массив')-1)

Byte: Да, ещё - оправдано ли разделение на tracklist_default и tracklist_<<остальное>> ?

Byte: Проверки [pre2] if volume <> volume_prev: volume_prev = volume play $cur_theme[track],volume end[/pre2] не нужны в принципе - такую проверку делает сам плеер.. то есть можно смело удалить "volume_prev" и писать всегда [pre2]play $cur_theme[track],volume[/pre2]


Byte: Получим [pre2] # counter if music_on: if $music_theme <> $music_theme_prev: CLOSE $cur_theme[track] $music_theme_prev = $music_theme if $music_theme <> '': copyarr 'cur_theme', 'tracklist_<<$music_theme>>' track=0 end end if $music_theme <> '': if no isplay ($cur_theme[track]): track = track+1 if track >= ARRSIZE('cur_theme'):track = 0 end play $cur_theme[track],volume end else: CLOSE $cur_theme[track] end --- counter ---------------------------------[/pre2]

werewolf: Byte пишет: Сразу заметил if ARRSIZE('cur_theme')<track:track=0 и if ARRSIZE('tracklist_default')<track_def:track_def=0 здесь <=track, т.к. элементы массива будут с индексами (0)...(ARRSIZE('массив')-1) Да с этим я немного просчитался Byte пишет: Да, ещё - оправдано ли разделение на tracklist_default и tracklist_<<остальное>> ? Я считаю что да, чаще всего есть одна большая тема и несколько маленьких, и за счте этого в большой теме (которую мы сделали по умолчанию) запоминается текущее положение в списке и тема не начинается с самого начала. У меня была идея запоминать положения в списке в любой теме, но придумать как это реализовать не получилось. Byte пишет: Проверки if volume <> volume_prev: volume_prev = volume play $cur_theme[track],volume end не нужны в принципе - такую проверку делает сам плеер.. то есть можно смело удалить "volume_prev" и писать всегда play $cur_theme[track],volume эту проверку я сделал что-бы не нагружать скрипт - строчка play $cur_theme[track],volume будет выполняться только если пользователь поменял громкость

Byte: Кстати, там нужно присваивать track=ARRSIZE('cur_theme'), чтобы плейлист при смене проигрывался с начала: [pre2] # counter if music_on: if $music_theme <> $music_theme_prev: CLOSE $cur_theme[track] $music_theme_prev = $music_theme if $music_theme <> '': copyarr 'cur_theme', 'tracklist_<<$music_theme>>' track=ARRSIZE('cur_theme') end end if $music_theme <> '': if no isplay ($cur_theme[track]): track = track+1 if track >= ARRSIZE('cur_theme'):track = 0 end play $cur_theme[track],volume end else: CLOSE $cur_theme[track] end --- counter ---------------------------------[/pre2]

Byte: werewolf пишет: У меня была идея запоминать положения в списке в любой теме, но придумать как это реализовать не получилось. Можно ввести массив: track[$music_theme] - будет хранить позицию для темы $music_theme. Использование [pre2]play $cur_theme[track[$music_theme]],volume[/pre2]

werewolf: Тогда версия с сохранением текущей позиции будет такой: [pre2] # counter if music_on=1: if $music_theme <> $music_theme_prev: CLOSE $cur_theme[track[$music_theme_prev]] $music_theme_prev = $music_theme if $music_theme <> '': copyarr 'cur_theme', 'tracklist_<<$music_theme>>' track[$music_theme] = track[$music_theme]-1 if track[$music_theme] < 0: track[$music_theme]=ARRSIZE('cur_theme') end end end if $music_theme <> '': if no isplay ($cur_theme[track[$music_theme]]): track[$music_theme] = track[$music_theme]+1 if ARRSIZE('cur_theme')<=track[$music_theme]:track[$music_theme]=0 end play $cur_theme[track[$music_theme]],volume end else: CLOSE $cur_theme[track[$music_theme]] end --- counter ---------------------------------[/pre2] плюс здесь проигрывание в теме начинается именно с сохраненной позиции а не с следующей за сохраненной. еще предложения по улучшению будут?

Nex: конечно. используй [рre2][/рre2] и отступы для форматирования, а то мешанина получается

werewolf: Nex спасибо, сам хотел уточнить что нужно исползовать, чтобы отступы сохранялись

Byte: Вот так для полного счастья: [pre2] if music_on <> music_on_prev or $music_theme <> $music_theme_prev: CLOSE $cur_theme[track[$music_theme_prev]] music_on_prev = music_on $music_theme_prev = $music_theme if $music_theme <> '': copyarr 'cur_theme', 'tracklist_<<$music_theme>>' track[$music_theme] = track[$music_theme]-1 if track[$music_theme] < 0: track[$music_theme]=ARRSIZE('cur_theme') end end end if music_on=1 and $music_theme <> '': if no isplay ($cur_theme[track[$music_theme]]): track[$music_theme] = track[$music_theme]+1 if ARRSIZE('cur_theme')<=track[$music_theme]:track[$music_theme]=0 end play $cur_theme[track[$music_theme]],volume end[/pre2] Запоминает позицию и при смене music_on.

rrock.ru: Werewolf пишет: эту проверку я сделал что-бы не нагружать скрипт - строчка play $cur_theme[track],volume будет выполняться только если пользователь поменял громкость Ты не понял.. этими строками ты наоборот добавляешь лишние действия, так как плеер при тех же самых зачениях трека и вольюма никаких действий производить не будет..

werewolf: rrock.ru Да, я позже с этим сам разобрался.

Korwin: Byte пишет: Вот так для полного счастья: if music_on <> music_on_prev or $music_theme <> $music_theme_prev: CLOSE $cur_theme[track[$music_theme_prev]] music_on_prev = music_on $music_theme_prev = $music_theme if $music_theme <> '': copyarr 'cur_theme', 'tracklist_<<$music_theme>>' track[$music_theme] = track[$music_theme]-1 if track[$music_theme] < 0: track[$music_theme]=ARRSIZE('cur_theme') end end end if music_on=1 and $music_theme <> '': if no isplay ($cur_theme[track[$music_theme]]): track[$music_theme] = track[$music_theme]+1 if ARRSIZE('cur_theme')<=track[$music_theme]:track[$music_theme]=0 end play $cur_theme[track[$music_theme]],volume end Запоминает позицию и при смене music_on. Страшно то как !!!!



полная версия страницы