Добавлен Hate,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Наработка
Версия Warcraft:
1.31+
Наработка предоставляет новые функции по работе со звуками для более удобного их использования.
CreateNew3DSound(name, x, y, z, volume, cutoff, loop)
Создает 3д звук. Не запускает его сразу же.
PlayLocalSound(name, player_id, volume)
Проигрывает звук определенному игроку по айди с громкостью. Не 3д.
Play2DSound(name, volume)
Проигрывает звук всем игрокам. Не 3д.
AddLoopingSoundOnUnit(soundpack, target, fadein_offset, fadeout_offset, delay, volume, cutoff)
Создает и проигрывает звук на юните. Использует набор звуков в таблице soundpack. fadein_offset и fadeout_offset отвечают за время до окончания/старта следующего звука, с которого начинается плавный переход. например 200 при длительности звука 1 секунда означает что смешение начнется на 0.8. 200 - количество милисекунд. delay отвечает примерно за то же самое, только это буквально задержка при котором следующий звук начнет свое проигрывание. cutoff отвечает за расстояние, на которое звук будет распространяться. Возвращает soundpack для последующей передачи в функцию уничтожения.
Пример использования:
Пример использования:
AddLoopingSoundOnUnit({"Sounds\\Spell\\whirlwind_1.wav", "Sounds\\Spell\\whirlwind_2.wav", "Sounds\\Spell\\whirlwind_3.wav", "Sounds\\Spell\\whirlwind_4.wav"}, unit, 200, 200, -0.15, 110, 1700.)
AddLoopingSound(soundpack, x, y, z, fadein_offset, fadeout_offset, delay, volume, cutoff)
То же самое, только на позиции.
DestroyLoopingSound(soundpack, fadetime)
Уничтожает набор закицленных звуков с плавным затуханием fadetime выраженными в милисекундах.
AddSound(s, x, y)
Проигрывает звук на 2д плоскости.
AddSoundVolume(s, x, y, vol, cutoff)
Проигрывает звук на 2д плоскости с громкостью и радиусом
AddSoundVolumeZ(s, x, y, z, vol, cutoff)
Проигрывает звук на 3д плоскости с громкостью и радиусом
AddSoundForPlayerVolumeZ(s, x, y, z, vol, cutoff, player)
Проигрывает звук на 3д плоскости с громкостью и радиусом для определенного игрока. player - цифра игрока
do
local function ConfigureSound(sound, volume, cutoff)
SetSoundChannel(sound, 5)
SetSoundVolume(sound, volume or 128)
SetSoundPitch(sound, 1)
SetSoundDistances(sound, 600., 10000.)
SetSoundDistanceCutoff(sound, 99999999999999999.)
local timer = CreateTimer()
TimerStart(timer, 0.000, false, function()
SetSoundDistanceCutoff(sound, cutoff or 2100.)
DestroyTimer(GetExpiredTimer())
end)
SetSoundConeAngles(sound, 0.0, 0.0, 127)
SetSoundConeOrientation(sound, 0.0, 0.0, 0.0)
end
---@param name string
---@param x real
---@param y real
---@param z real
---@param volume integer
---@param cutoff real
function CreateNew3DSound(name, x, y, z, volume, cutoff, loop)
local snd = CreateSound(name, loop or false, true, false, 100, 100, "CombatSoundsEAX")
ConfigureSound(snd, volume, cutoff)
SetSoundPosition(snd, x, y, z)
return snd
end
---@param name string
---@param player_id integer
---@return sound
---@param volume integer
function PlayLocalSound(name, player_id, volume)
local snd = CreateSound(name, false, false, false, 10, 10, "")
SetSoundChannel(snd, 5)
if GetLocalPlayer() ~= Player(player_id) then SetSoundVolume(snd, 0) else SetSoundVolume(snd, volume or 128) end
SetSoundPitch(snd, 1)
StartSound(snd)
KillSoundWhenDone(snd)
return snd
end
---@param name string
---@param volume integer
function Play2DSound(name, volume)
local snd = CreateSound(name, false, false, false, 10, 10, "")
SetSoundChannel(snd, 5)
SetSoundVolume(snd, volume or 128)
SetSoundPitch(snd, 1)
StartSound(snd)
KillSoundWhenDone(snd)
return snd
end
---@param soundpack table
---@param fadetime real
function DestroyLoopingSound(soundpack, fadetime)
if soundpack.fading ~= nil or soundpack == nil then return
else soundpack.fading = true end
if fadetime <= 0. then soundpack.current_volume = 0. end
fadetime = fadetime / 0.025
local timer = CreateTimer()
TimerStart(timer, 0.025, true, function()
soundpack.current_volume = soundpack.current_volume - (soundpack.volume_max / fadetime)
if soundpack.current_volume <= 0 then
DestroyTimer(soundpack.loop_timer)
if soundpack.fadeout_timer then DestroyTimer(soundpack.fadeout_timer) end
DestroyTimer(GetExpiredTimer())
StopSound(soundpack.current_sound, true, true)
end
SetSoundVolume(soundpack.current_sound, soundpack.current_volume)
end)
end
local function FadeSound(sound, soundpack, fadetime, vector)
local step = R2I(soundpack.volume_max / (fadetime / 0.025))
if not vector then step = -step end
local volume = vector and 0 or soundpack.current_volume
local timer = CreateTimer()
TimerStart(timer, 0.025, true, function()
volume = volume + step
if volume <= 0 and not vector then
DestroyTimer(GetExpiredTimer())
volume = 0
StopSound(sound, true, false)
return
elseif (volume >= soundpack.current_volume and vector) or soundpack.fading then
volume = soundpack.current_volume
DestroyTimer(GetExpiredTimer())
end
SetSoundVolume(sound, R2I(volume))
end)
end
---@param soundpack table
---@param volume integer
---@param cutoff real
---@param fadein_offset integer
---@param fadeout_offset integer
---@param delay real
---@param target unit
function AddLoopingSoundOnUnit(soundpack, target, fadein_offset, fadeout_offset, delay, volume, cutoff)
soundpack.loop_timer = CreateTimer()
soundpack.volume_max = volume
soundpack.current_volume = volume
fadein_offset = fadein_offset * 0.001
fadeout_offset = fadeout_offset * 0.001
local function loop_sound()
local sound_file
if #soundpack == 1 then sound_file = soundpack[1]
else sound_file = soundpack[GetRandomInt(1, #soundpack)] end
soundpack.current_sound = CreateSound(sound_file, false, true, false, 150, 150, "CombatSoundsEAX")
ConfigureSound(soundpack.current_sound, 1, cutoff)
if fadein_offset > 0 then SetSoundVolume(soundpack.current_sound, 0)
else SetSoundVolume(soundpack.current_sound, soundpack.current_volume) end
AttachSoundToUnit(soundpack.current_sound, target)
StartSound(soundpack.current_sound)
FadeSound(soundpack.current_sound, soundpack, fadein_offset, true)
local sound_duration = (GetSoundDuration(soundpack.current_sound) * 0.001)
local mysound = soundpack.current_sound
soundpack.fadeout_timer = CreateTimer()
local fadepoint = sound_duration - fadeout_offset
if fadepoint < 0 then fadepoint = 0. end
TimerStart(soundpack.fadeout_timer, fadepoint, false, function()
FadeSound(mysound, soundpack, fadeout_offset, false)
DestroyTimer(soundpack.fadeout_timer)
soundpack.fadeout_timer = nil
end)
TimerStart(soundpack.loop_timer, sound_duration + delay, false, loop_sound)
end
loop_sound()
return soundpack
end
---@param soundpack table
---@param x real
---@param y real
---@param z real
---@param volume integer
---@param cutoff real
---@param fadein_offset integer
---@param fadeout_offset integer
---@param delay real
function AddLoopingSound(soundpack, x, y, z, fadein_offset, fadeout_offset, delay, volume, cutoff)
soundpack.loop_timer = CreateTimer()
soundpack.volume_max = volume
soundpack.current_volume = volume
fadein_offset = fadein_offset * 0.001
fadeout_offset = fadeout_offset * 0.001
local function loop_sound()
local sound_file
if #soundpack == 1 then sound_file = soundpack[1]
else sound_file = soundpack[GetRandomInt(1, #soundpack)] end
soundpack.current_sound = CreateSound(sound_file, false, true, false, 150, 150, "CombatSoundsEAX")
ConfigureSound(soundpack.current_sound, 1, cutoff)
if fadein_offset > 0 then SetSoundVolume(soundpack.current_sound, 0)
else SetSoundVolume(soundpack.current_sound, soundpack.current_volume) end
SetSoundPosition(soundpack.current_sound, x, y, z)
StartSound(soundpack.current_sound)
FadeSound(soundpack.current_sound, soundpack, fadein_offset, true)
local sound_duration = (GetSoundDuration(soundpack.current_sound) * 0.001)
local mysound = soundpack.current_sound
soundpack.fadeout_timer = CreateTimer()
TimerStart(soundpack.fadeout_timer, sound_duration - fadeout_offset, false, function()
FadeSound(mysound, soundpack, fadeout_offset, false)
DestroyTimer(soundpack.fadeout_timer)
end)
TimerStart(soundpack.loop_timer, sound_duration + delay, false, loop_sound)
end
loop_sound()
return soundpack
end
---@param s string
---@param x real
---@param y real
function AddSound(s, x, y)
local snd = CreateSound(s, false, true, true, 10, 10, "CombatSoundsEAX")
ConfigureSound(snd, 128, 2100.)
SetSoundPosition(snd, x, y, 35.)
StartSound(snd)
KillSoundWhenDone(snd)
return snd
end
---@param s string
---@param x real
---@param y real
---@param vol integer
---@param cutoff real
function AddSoundVolume(s, x, y, vol, cutoff)
local snd = CreateSound(s, false, true, true, 10, 10, "CombatSoundsEAX")
ConfigureSound(snd, vol or 128, cutoff or 2100.)
SetSoundPosition(snd, x, y, 35.)
StartSound(snd)
KillSoundWhenDone(snd)
return snd
end
---@param s string
---@param x real
---@param y real
---@param z real
---@param vol integer
---@param cutoff real
function AddSoundVolumeZ(s, x, y, z, vol, cutoff)
local snd = CreateSound(s, false, true, true, 10, 10, "CombatSoundsEAX") --CombatSoundsEAX
ConfigureSound(snd, vol or 128, cutoff or 2100.)
SetSoundPosition(snd, x, y, z)
StartSound(snd)
KillSoundWhenDone(snd)
return snd
end
---@param s string
---@param x real
---@param y real
---@param z real
---@param vol integer
---@param cutoff real
---@param player integer
function AddSoundForPlayerVolumeZ(s, x, y, z, vol, cutoff, player)
local snd = CreateSound(s, false, true, true, 10, 10, "CombatSoundsEAX") --CombatSoundsEAX
SetSoundChannel(snd, 5)
if GetLocalPlayer() == Player(player) then SetSoundVolume(snd, vol or 128) else SetSoundVolume(snd, 0) end
SetSoundPitch(snd, 1)
SetSoundDistances(snd, 600., 10000.)
SetSoundDistanceCutoff(snd, cutoff or 2100.)
SetSoundConeAngles(snd, 0.0, 0.0, 127)
SetSoundConeOrientation(snd, 0.0, 0.0, 0.0)
SetSoundPosition(snd, x, y, z)
StartSound(snd)
KillSoundWhenDone(snd)
return snd
end
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
ScorpioT1000
3 года назад
2
Мда, там есть много интересных вещей можно со звуками мутить - тот же мягкий питч, чтоб звук не приелся, красивые дистанции. А тут почти ничего нет(
2
Hate
3 года назад
2
ScorpioT1000:
ну те же дистанции есть, а на практике мне не приходилось менять что то с питчем. в целом это просто удобное взаимодействие со звуками когда у тебя есть путь до него
Чтобы оставить комментарий, пожалуйста, войдите на сайт.