Добавлен , не публикуется
Надоело запускать снаряды с линейной скоростью. Встречайте 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

Видео

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
27
NazarPunk, безье интересная штука. видел в редакторе моделей в интерполяции безье, линейная интерполяция и др что это значит в самих моделях, я не понял
была тема в закладки оставил, можно попробовать по дуге. но сначала надо понять какие точки брать, и где еще можно применить кроме движения по дуге
22
мб просто поменять название "Разные поведение скорости снаряда" тогда и нуб поймет так как не все англ знают что это =)
лишь 20% людей знают англ
13
Не вижу смысла связываться с GUI из-за особой одарённости большинства гуишников.
Хотел дизлойснуть это, но по ошибке лойснул.
Есть много хороших мап на ГУИ, в которые играет множество людей и у них даже есть собственное большое комьюнити. Не всем хочется писать код, не всем это интересно. Интерфейс был дан чтобы его использовали и большинство это делают. ГУИшники такая же значимая часть комьюнити, как и ты.
30
не все англ знают
Есть много хороших мап на ГУИ, в которые играет множество людей и у них даже есть собственное большое комьюнити.
Я за них искренне рад. Только вот написать хорошую карту и написать хороший код это две большие разницы.
Не всем хочется писать код, не всем это интересно.
Мне вот интересно, я и пишу. Кому не интересно, того никто не заставляет.
Интерфейс был дан чтобы его использовали и большинство это делают.
Ну так и пусть используют, а я вот нехочу его ипользовать и тратить своё время на то, чтоб его поддерживать.
ГУИшники такая же значимая часть комьюнити, как и ты.
Моделлеры тоже важная часть комьюнити и что с этого? Я что-то не припомню, чтоб я комьюнити по значимости сортировал.
15
Странные претензии к автору наработки, который, хочу заметить так активно вкладывается в столь перспективное направление как Lua. Ведь это так же хороший учебный материал. Мне вот кажется, что человек способный оперировать логическими конструкциями на GUI, может (в теории), загуглить слово «нелинейный» и сделать небольшой вклад в саморазвитие. И кстати о саморазвитии, наверняка мало кто будет отрицать преимущество метода разработки программированием, над GUI. Вы можете сделать хорошую карту на GUI, ведь это всего лишь инструмент реализации хорошей идеи, однако на том же Jass вы сможете сделать это качественней, быстрее и с большими возможностями, без (массивных)утечек в ОЗУ. Не говоря уже о преимуществе Lua... По этому, ориентированность на людей пишущих код - это стимул развивать сообщество, а значит и повышать качество проектов. Следовательно ГУИшники так же часть сообщества, однако преимущество за кодерами. Что-то вроде Junior Jass кодеров) ИМХО
15
мало кто будет отрицать преимущество метода разработки программированием, над GUI
Никто не отрицает данных преимуществ. Проблема в трудозатратах.
Полноценная карта - вещь комплексная. Она включает в себя и ландшафт, и графику, и геймплей, и, естественно, код. Качественное выполнение работы в любой из перечисленных ипостасей требует существенных затрат времени, в том числе на освоение необходимых навыков. Обычное явление, когда гражданин сведущий в ландшафтном дизайне слаб в программировании, поскольку свободное время он тратил непосредственно на качественный ландшафт. То же касается программистов - ты молодец, что можешь написать эффективный и эффектный код, но на голом пустыре он игрока не впечатлит.
Никто не отрицает пользу саморазвития, но в реальной работе на двух стульях не усидишь.
30
Никто не отрицает данных преимуществ. Проблема в трудозатратах.
Так написание lua намного снижает трудозатраты, по сравнению с GUI. Особенно на больших проэктах.
То же касается программистов - ты молодец, что можешь написать эффективный и эффектный код, но на голом пустыре он игрока не впечатлит.
На пустом месте GUI тоже никого не впечатлит. А так у меня будет красивый и рабочий код, который кто-то может использовать в своём проэкте и впечатлить людей)
15
ак написание lua намного снижает трудозатраты
Программисту снижает, но не человеку, который занимается преимущественно ландшафтом. Перед ним встает необходимость освоения основ языка, инструментов и тонкостей программирования именно под WC3. Сколько времени пройдет прежде чем он сможет циклы в уме строить и перестанет писать исключительно детские условия вроде "if myCondition() == true then". Это с высоты уже имеющегося опыта так легко сверху вниз смотреть. А сколько пройдет времени прежде чем он начнет писать код правильно? Код, который действительно работает, а не усложняет жизнь. В вопросах периодически появляются пользователи которые переходят с GUI на код и демонстрируют просто ужасную помесь vJass с cJass без отступов, правил именования и т.д. На все это тоже нужно время, даже на Lua.
22
обычно программисту нужны апи если чел знает толк ландшафта но ноль программирование то через апи гуи берет из луа это и есть стандарт.
13
Ну так и пусть используют, а я вот нехочу его ипользовать и тратить своё время на то, чтоб его поддерживать.
Ну тут тащемта справедливо, хоть и не считаю что правильно.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.