Добавлен , не публикуется
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Наработка
Надоело запускать снаряды с линейной скоростью. Встречайте jQuery Easing Plugin на lua. Сравнить функции можно здесь.
Пример
do
	local InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
		FogEnable(false)
		FogMaskEnable(false)
		PanCameraToTimed(0, 0, 0)
		
		local easing = {}
		local ease   = 0
		for f in pairs(math.ease) do
			table.insert(easing, f)
		end
		
		local TIMER_PERIOD = 0.03125 --> 1/32
		local DISTANCE     = 1200
		local DURATION     = 3
		local DISTANCE_INC = DISTANCE / DURATION / (1 / TIMER_PERIOD)
		
		CreateUnit(Player(0), FourCC('hfoo'), DISTANCE / 2, 0, 180)
		local caster = CreateUnit(Player(0), FourCC('Obla'), -(DISTANCE / 2), 0, 0)
		
		local function cast()
			ClearTextMessages()
			ease = ease + 1
			print(easing[ease])
			
			local xa, ya   = GetUnitX(caster), GetUnitY(caster)
			
			local angle    = math.rad(GetUnitFacing(caster))
			local cos, sin = math.cos(angle), math.sin(angle)
			local missile  = AddSpecialEffect('Abilities/Weapons/DemolisherFireMissile/DemolisherFireMissile.mdl', xa, ya)
			
			local time     = 0
			local way      = 0
			
			TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
				way          = way + DISTANCE_INC
				time         = time + TIMER_PERIOD
				local speed  = way * math.ease[easing[ease]](time / DURATION)
				
				local xb, yb = xa + speed * cos, ya + speed * sin
				
				if time > DURATION then
					if ease < #easing then
					cast()
					end
					DestroyEffect(missile)
					return DestroyTimer(GetExpiredTimer())
				end
				
				BlzSetSpecialEffectX(missile, xb)
				BlzSetSpecialEffectY(missile, yb)
				BlzSetSpecialEffectYaw(missile, angle)
			end)
		end
		
		TimerStart(CreateTimer(), 2, false, function()
			cast()
			DestroyTimer(GetExpiredTimer())
		end)
	end
end
Код
do
	local c1 = 1.70158
	local c2 = c1 * 1.525
	local c3 = c1 + 1
	local c4 = (2 * math.pi) / 3
	local c5 = (2 * math.pi) / 4.5
	local pi = math.pi
	
	---@param x real in the range 0..1
	---@return real
	local function OutBounce(x)
		local n1, d1 = 7.5625, 2.75
		if (x < 1 / d1) then
			return n1 * x * x;
		elseif (x < 2 / d1) then
			x = x - 1.5 / d1
			return n1 * x * x + 0.75
		elseif (x < 2.5 / d1) then
			x = x - 2.25 / d1
			return n1 * x * x + 0.9375
		else
			x = x - 2.625 / d1
			return n1 * x * x + 0.984375
		end
	end
	
	math.ease = {
		---@param x real in the range 0..1
		---@return real
		InQuad       = function(x)
			return x * x
		end,
		---@param x real in the range 0..1
		---@return real
		OutQuad      = function(x)
			return 1 - (1 - x) * (1 - x)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutQuad    = function(x)
			return x < 0.5 and 2 * x * x or 1 - ((-2 * x + 2) ^ 2) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InCubic      = function(x)
			return x * x * x
		end,
		---@param x real in the range 0..1
		---@return real
		OutCubic     = function(x)
			return 1 - ((1 - x) ^ 3)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutCubic   = function(x)
			return x < 0.5 and 4 * x * x * x or 1 - ((-2 * x + 2) ^ 3) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InQuart      = function(x)
			return x * x * x * x
		end,
		---@param x real in the range 0..1
		---@return real
		OutQuart     = function(x)
			return 1 - ((1 - x) ^ 4)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutQuart   = function(x)
			return x < 0.5 and 8 * x * x * x * x or 1 - ((-2 * x + 2) ^ 4) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InQuint      = function(x)
			return x * x * x * x * x
		end,
		---@param x real in the range 0..1
		---@return real
		OutQuint     = function(x)
			return 1 - ((1 - x) ^ 5)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutQuint   = function(x)
			return x < 0.5 and 16 * x * x * x * x * x or 1 - ((-2 * x + 2) ^ 5) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InSine       = function(x)
			return 1 - math.cos(x * pi / 2)
		end,
		---@param x real in the range 0..1
		---@return real
		OutSine      = function(x)
			return math.sin(x * pi / 2)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutSine    = function(x)
			return -(math.cos(pi * x) - 1) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InExpo       = function(x)
			return x == 0 and 0 or 2 ^ (10 * x - 10)
		end,
		---@param x real in the range 0..1
		---@return real
		OutExpo      = function(x)
			return x == 1 and 1 or 1 - (2 ^ (-10 * x))
		end,
		---@param x real in the range 0..1
		---@return real
		InOutExpo    = function(x)
			if x == 0 or x == 1 then return x end
			return x < 0.5 and 2 ^ (20 * x - 10) / 2 or 2 - (2 ^ (-20 * x + 10)) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InCirc       = function(x)
			return 1 - math.sqrt(1 - x * x)
		end,
		---@param x real in the range 0..1
		---@return real
		OutCirc      = function(x)
			return math.sqrt(1 - ((x - 1) ^ 2))
		end,
		---@param x real in the range 0..1
		---@return real
		InOutCirc    = function(x)
			return x < 0.5 and (1 - math.sqrt(1 - ((2 * x) ^ 2))) / 2 or (math.sqrt(1 - ((-2 * x + 2) ^ 2)) + 1) / 2
		end,
		---@param x real in the range 0..1
		---@return real
		InElastic    = function(x)
			return x == 0 and 0 or x == 1 and 1 or -(2 ^ (10 * x - 10)) * math.sin((x * 10 - 10.75) * c4)
		end,
		---@param x real in the range 0..1
		---@return real
		OutElastic   = function(x)
			if x == 0 or x == 1 then return x end
			return (2 ^ (-10 * x)) * math.sin((x * 10 - 0.75) * c4) + 1
		end,
		---@param x real in the range 0..1
		---@return real
		InOutElastic = function(x)
			if x == 0 or x == 1 then return x end
			return x < 0.5 and -((2 ^ (20 * x - 10)) * math.sin((20 * x - 11.125) * c5)) / 2 or (2 ^ (-20 * x + 10)) * math.sin((20 * x - 11.125) * c5) / 2 + 1
		end,
		---@param x real in the range 0..1
		---@return real
		InBack       = function(x)
			return c3 * x * x * x - c1 * x * x
		end,
		---@param x real in the range 0..1
		---@return real
		OutBack      = function(x)
			return 1 + c3 * ((x - 1) ^ 3) + c1 * ((x - 1) ^ 2)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutBack    = function(x)
			return x < 0.5 and (((2 * x) ^ 2) * ((c2 + 1) * 2 * x - c2)) / 2 or (((2 * x - 2) ^ 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2
		end,
		
		---@param x real in the range 0..1
		---@return real
		OutBounce    = function(x)
			return OutBounce(x)
		end,
		---@param x real in the range 0..1
		---@return real
		InBounce     = function(x)
			return 1 - OutBounce(1 - x)
		end,
		---@param x real in the range 0..1
		---@return real
		InOutBounce  = function(x)
			return x < 0.5 and (1 - OutBounce(1 - 2 * x)) / 2 or (1 + OutBounce(2 * x - 1)) / 2
		end
	}
end

Видео

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
17
5 лет назад
1
Потому что в описании написано:
Большинству не понятно. Для них слова линейный, квадратичный, кубический - инопланетная письменность. Я не придираюсь, но если хочется расширить аудиторию, придется расписать как можно проще.
4
29
5 лет назад
Отредактирован nazarpunk
4
если хочется расширить аудиторию, придется расписать как можно проще.
Для большой аудитории нужно пилить наработки в стиле "Находим 10% от любого числа на GUI без утечек".
1
17
5 лет назад
1
"Находим 10% от любого числа на GUI без утечек".
Думаю следует ожидать в будущем продвинутых связок GUI + скрипты. При Lua таких проблем как с библиотеками на жасс для гуишников нету. Так что в этом есть смысл.
3
29
5 лет назад
3
продвинутых связок GUI + скрипты
Не вижу смысла связываться с GUI из-за особой одарённости большинства гуишников.
При Lua таких проблем как с библиотеками на жасс для гуишников нету
Что-то не заметил я проблем с библиотеками на GUI.
1
17
5 лет назад
1
Не вижу смысла связываться с GUI из-за особой одарённости большинства гуишников.
Как минимум странное отношение для ресурса, который вроде позиционирует себя как точку сбора и взаимопомощи, где технари, например, могут помочь гуманитариям. А в итоге мы получаем очередную сегрегацию. Как если бы разработчики моделей выкладывали .max файлы, а эти "особенно одаренные" кодеры пусть сами разбираются, как все это нормально экспортировать для игры.
0
29
5 лет назад
0
Как минимум странное отношение для ресурса, который вроде позиционирует себя как точку сбора и взаимопомощи, где технари, например, могут помочь гуманитариям.
Судя по Q\A помогают тут всем. Но мне например лень возиться с GUI ради тех, кому лень подправить под свои нужды несколько строчек в коде.
3
17
5 лет назад
3
Но мне например лень
Ну это уже совершенно по другому звучит, дескать, "хотите - доделывайте, но мне лень", это просто и понятно. Но ты ведь сделал упор на какую-то "особенную одаренность", то есть выделил отдельную категорию посетителей ресурса по какому-то признаку как недостойных твоего внимания. Ты, как часть команды XGM, тоже формируешь лицо этого ресурса. Кто-то помоложе и поглупее, посмотрев на твою позицию и взяв с тебя пример, придумает свой повод отделиться в отдельную группу, но уже, скажем, по национальности. Потом по каким-то взглядам, потом по вере, потом по расе и так далее, как снежный ком. Наверно, человек с иконкой "XGM-TEAM" в профиле, должен быть поосторожней в высказываниях. Особенно если основная масса посетителей - подростки страдающие от максимализма.
2
19
5 лет назад
Отредактирован KaneThaumaturge
2
Не вижу проблемы, человек делает для тех, кого хочет. Это его ресурс. Если кому-то что-то не нравится, то пускай создаст свою версию с блэкджеком и.... А потом уж можно и помериться полезностью ресурсов.
Другая проблема может заключаться в том, что человек, который сможет обращаться с этой наработкой, скорее всего, напишет такую самостоятельно.
Мне, например, легче создать свою такую систему. Но судить мне сложно, так как я не понимаю Луа. Возможно тем, кто учит луа эта наработка как золотая жила.
2
29
5 лет назад
2
дескать, "хотите - доделывайте, но мне лень"
Недоработанные наработки я как-бы не публикую и настройки всегда вынесены для удобства. За комментариями в них я слежу и исправляю ошибки, если таковые имеются. Но что-то никто не спрашивал о том, как привязать их к GUI, значит как-то сами разобрались и делать лишнюю работу мне не нужно.
Но ты ведь сделал упор на какую-то "особенную одаренность", то есть выделил отдельную категорию посетителей ресурса по какому-то признаку как недостойных твоего внимания.
Не делал я никакого упора, это вы на этой фразе внимание акцентируете.
Кто-то помоложе и поглупее, посмотрев на твою позицию и взяв с тебя пример, придумает свой повод отделиться в отдельную группу, но уже, скажем, по национальности.
Сначала ты для GUI не пишешь, а потом Родину продашь?))
Другая проблема может заключаться в том, что человек, который сможет обращаться с этой наработкой, скорее всего, напишет такую самостоятельно.
Зачем писать, если можно взять готовое? Судя по количеству наработок, брать пока нечего, но я пытаюсь это исправить. Даже github для нработок завёл))
Но судить мне сложно, так как я не понимаю Луа
А жаль, он намного удобней чем jass
8
24
5 лет назад
8
Мне кажется, многие тут даже не поняли о чем эта наработка... Это же не о снарядах, на самом деле, а о математике для разных способов интерполяции... Снаряды я и сам напишу, например, а интерполяцию сложнее линейной мне обычно лень писать и проще взять готовую.
5
28
5 лет назад
5
Мне кажется, многие тут даже не поняли о чем эта наработка...
Потому что нигде не сказано что это и зачем это. Я глянул видос, прикольно, но зачем мне это?
Встречайте jQuery Easing Plugin на lua. Сравнить функции можно здесь.
Есть только такая приписка, но она ничего не объясняет.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.