Добавлен , не публикуется
Алгоритмы, Наработки и Способности
Способ реализации:
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
"Находим 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. Сравнить функции можно здесь.
Есть только такая приписка, но она ничего не объясняет.
2
29
5 лет назад
2
она ничего не объясняет.
Каюсь, описание на скорую руку слепил, на днях реализую cubic-bezier и распишу как этим пользоваться.
0
27
5 лет назад
Отредактирован MpW
0
NazarPunk, безье интересная штука. видел в редакторе моделей в интерполяции безье, линейная интерполяция и др что это значит в самих моделях, я не понял
была тема в закладки оставил, можно попробовать по дуге. но сначала надо понять какие точки брать, и где еще можно применить кроме движения по дуге
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.