Добавлен , не публикуется
Алгоритмы, Наработки и Способности
Способ реализации:
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

Видео

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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, безье интересная штука. видел в редакторе моделей в интерполяции безье, линейная интерполяция и др что это значит в самих моделях, я не понял
была тема в закладки оставил, можно попробовать по дуге. но сначала надо понять какие точки брать, и где еще можно применить кроме движения по дуге
0
23
5 лет назад
0
мб просто поменять название "Разные поведение скорости снаряда" тогда и нуб поймет так как не все англ знают что это =)
лишь 20% людей знают англ
4
13
5 лет назад
Отредактирован NekoriDes
4
Не вижу смысла связываться с GUI из-за особой одарённости большинства гуишников.
Хотел дизлойснуть это, но по ошибке лойснул.
Есть много хороших мап на ГУИ, в которые играет множество людей и у них даже есть собственное большое комьюнити. Не всем хочется писать код, не всем это интересно. Интерфейс был дан чтобы его использовали и большинство это делают. ГУИшники такая же значимая часть комьюнити, как и ты.
2
29
5 лет назад
2
не все англ знают
Есть много хороших мап на ГУИ, в которые играет множество людей и у них даже есть собственное большое комьюнити.
Я за них искренне рад. Только вот написать хорошую карту и написать хороший код это две большие разницы.
Не всем хочется писать код, не всем это интересно.
Мне вот интересно, я и пишу. Кому не интересно, того никто не заставляет.
Интерфейс был дан чтобы его использовали и большинство это делают.
Ну так и пусть используют, а я вот нехочу его ипользовать и тратить своё время на то, чтоб его поддерживать.
ГУИшники такая же значимая часть комьюнити, как и ты.
Моделлеры тоже важная часть комьюнити и что с этого? Я что-то не припомню, чтоб я комьюнити по значимости сортировал.
5
15
5 лет назад
5
Странные претензии к автору наработки, который, хочу заметить так активно вкладывается в столь перспективное направление как Lua. Ведь это так же хороший учебный материал. Мне вот кажется, что человек способный оперировать логическими конструкциями на GUI, может (в теории), загуглить слово «нелинейный» и сделать небольшой вклад в саморазвитие. И кстати о саморазвитии, наверняка мало кто будет отрицать преимущество метода разработки программированием, над GUI. Вы можете сделать хорошую карту на GUI, ведь это всего лишь инструмент реализации хорошей идеи, однако на том же Jass вы сможете сделать это качественней, быстрее и с большими возможностями, без (массивных)утечек в ОЗУ. Не говоря уже о преимуществе Lua... По этому, ориентированность на людей пишущих код - это стимул развивать сообщество, а значит и повышать качество проектов. Следовательно ГУИшники так же часть сообщества, однако преимущество за кодерами. Что-то вроде Junior Jass кодеров) ИМХО
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.