Рывок персонажа

Илья

Друзья CG
25 Сен 2015
2,348
41
Никто не в курсе, как осуществить рывок персонажа, подобно рывку магнуса (magnataur_skewer), без разрушений деревьев? Какие для подобных рывков используют функции?
 
Никто не в курсе, как осуществить рывок персонажа, подобно рывку магнуса (magnataur_skewer), без разрушений деревьев? Какие для подобных рывков используют функции?
На данный момент похоже это единственное решение. Меняй скорость, давай стан и будет что то похожее. Ну и анимацию прикрутить надо будет ручками.
https://github.com/Pizzalol/SpellLibrary/blob/master/game/scripts/vscripts/heroes/hero_stormspirit/ball_lightning.lua
 
Последнее редактирование модератором:
Попробуй сделать абилку с базовым классом magnataur_skewer, а в AbilitySpecial установить значение "tree_radius" в 0.

По типу этого.
 
Последнее редактирование модератором:
[quote author=M@G link=topic=702.msg2619#msg2619 date=1453270943]
Попробуй сделать абилку с базовым классом magnataur_skewer, а в AbilitySpecial установить значение "tree_radius" в 0.

По типу этого.
[/quote]

Это я пробовал, не помогло.
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=702.msg2617#msg2617 date=1453242679]
На данный момент похоже это единственное решение. Меняй скорость, давай стан и будет что то похожее. Ну и анимацию прикрутить надо будет ручками.
https://github.com/Pizzalol/SpellLibrary/blob/master/game/scripts/vscripts/heroes/hero_stormspirit/ball_lightning.lua
[/quote]

Да вот я и гляжу на похожие штуки. Можно замудрить LinearProjectile, и потом просто в конечную точку персонажа кинуть, но это не рывок, а тот же ком тускара, земляного эмбера или же полет шторма.
 
Да вот я и гляжу на похожие штуки. Можно замудрить LinearProjectile, и потом просто в конечную точку персонажа кинуть, но это не рывок, а тот же ком тускара, земляного эмбера или же полет шторма.
А разница с точки зрения игрока? :D
 
Последнее редактирование модератором:
С точки зрения результата - никакая. А с точки зрения игрового процесса и атмосферы - есть)
 
болл лайтинг я примерно знаю как сделать.

если не ошибусь сейчас, то и магнуса рывок можно сделать по типу PolarProjective из редактора варика 3.

То есть SetAbsOrigin() но сдвигаем мы его по фэйсингу (в сторону куда смотрит) и настолько близко, что даже почти не заметно как он двигается. Но двигаем мы его каждые 0.05 сек, поэтому кажется что он двигается плавно)

В баребонс была помоему библиотека) или попробуй в датадривене функцию толчка покрутить, может получится)
 
болл лайтинг я примерно знаю как сделать.

если не ошибусь сейчас, то и магнуса рывок можно сделать по типу PolarProjective из редактора варика 3.

То есть SetAbsOrigin() но сдвигаем мы его по фэйсингу (в сторону куда смотрит) и настолько близко, что даже почти не заметно как он двигается. Но двигаем мы его каждые 0.05 сек, поэтому кажется что он двигается плавно)

В баребонс была помоему библиотека) или попробуй в датадривене функцию толчка покрутить, может получится)


Хахха, вот я точно на такую же мысль пришел, попробовать замудрить все же через позиции. Ну и еще вариант был попробовать потолкать башами/кнокбэками.

Что ж, похоже, если эти варианты будут смотреться плохо, придется от рывка пока отказаться.
 
Последнее редактирование модератором:
не отказывайся от своих идей. пробуй пока не получится.

если не поможет, сделай по типу "нажал - побежал"

имеется ввиду когда герой райткликает на позицию, убираешь ограничение на мувемент спид, даешь 700, и заставляешь туда бежать. уверяю смотреться будет очень эффектно)
 
Последнее редактирование модератором:
не отказывайся от своих идей. пробуй пока не получится.

если не поможет, сделай по типу "нажал - побежал"

имеется ввиду когда герой райткликает на позицию, убираешь ограничение на мувемент спид, даешь 700, и заставляешь туда бежать. уверяю смотреться будет очень эффектно)

Во, натыкался в процессе на эту функцию (MoveToPosition), но не думал про изменение скорости в этот момент. Спс за идею.

Но в любом случае это все будет выглядеть немного иначе. Хотя, я думаю, что оригинальный рывок и делался через позиции, но сдается мне, что гораздо хитрее.
 
Последнее редактирование модератором:
а говорил, что мой гайд само собой разумеющееся))
 
а говорил, что мой гайд само собой разумеющееся))

Не, ну в том гайде, где я это говорил - там просто про связки способностей, про атмосферность, про логику необходимости тех или иных абилок.

Про реализацию рывков и необходимых для этого функций там ничего нет)
 
Последнее редактирование модератором:
Что ж, ребят, спасибо всем за советы. Не зря я вчера после уймы разных махинаций решил сделать перерыв и задать этот вопрос здесь. В результате вышло очень даже неплохо.

MoveToPosition и увеличение скорости перемещения не подошли, ибо, следовало догадаться, что рывка не выйдет , а выйдет простое увеличение скорости на короткое время. При этом можно управлять направлением своего движения.

Зарешал все же SetAbsOrigin() с временным интервалом. Взял 0.05, ибо лень было придумывать иную цифру, а эту уже назвали.

Сливаю код абилки.
Код:
spurt_with_a_knife = class({})


function spurt_with_a_knife:OnSpellStart()
	
	StartSoundEvent("Hero_Axe.BerserkersCall.Start", self:GetCaster())
	local caster = self:GetCaster()
	local step = 100
	local direction = caster:GetForwardVector()
	local StartPosition = caster:GetAbsOrigin()
	local NextPosition = StartPosition + direction * step
	
	local id1 = ParticleManager:CreateParticle("particles/units/heroes/hero_magnataur/magnataur_skewer_rocks.vpcf", PATTACH_ABSORIGIN, caster)	
	Timers:CreateTimer(1,function()
		ParticleManager:DestroyParticle(id1, false)
		return nil
	end)

	Timers:CreateTimer(0.05,function()
	
		local id2 = ParticleManager:CreateParticle("particles/units/heroes/hero_magnataur/magnataur_skewer_dust_b.vpcf", PATTACH_ABSORIGIN, caster)	
		Timers:CreateTimer(0.5,function()
			ParticleManager:DestroyParticle(id2, false)
			return nil
		end)
	
		local units = FindUnitsInRadius( caster:GetTeamNumber(), NextPosition, caster, 100, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false )
			
		if units[ 1 ] then 
			StartSoundEvent("Hero_BountyHunter.Jinada", units[ 1 ])

			local damage = {
				victim = units[ 1 ],
				attacker = self:GetCaster(),
				damage = 20,
				damage_type = DAMAGE_TYPE_PHYSICAL,
				ability = this,
			}		
			ApplyDamage( damage )
			
			local id3 = ParticleManager:CreateParticle("particles/units/heroes/hero_life_stealer/life_stealer_infest_emerge_blood04.vpcf", PATTACH_ABSORIGIN, units[ 1 ])			
			Timers:CreateTimer(2,function()
				ParticleManager:DestroyParticle(id3, false)
				return nil
			end)

			return nil		

		elseif GridNav:IsNearbyTree( NextPosition, 50, true ) then
			StartSoundEvent("Hero_Sven.IronWill", caster)
			return nil		
		else
			caster:SetAbsOrigin(NextPosition)
			NextPosition = StartPosition + direction * step
		end
		
		step = step+100
		if step < 1000 then
			return 0.05
		else 
			return nil
		end		

	end)
	
end

Для её правильной отработки естественно нужно прекэшировать следующие вещи:
Код:
	---------------------------------spells-------------------------------
	PrecacheResource("particle", "particles/units/heroes/hero_magnataur/magnataur_skewer_dust_b.vpcf", context) --spurt with knife
	PrecacheResource("particle", "particles/units/heroes/hero_magnataur/magnataur_skewer_rocks.vpcf", context) --spurt with knife
	PrecacheResource("particle", "particles/units/heroes/hero_life_stealer/life_stealer_infest_emerge_blood04.vpcf", context) --blood 

	-------------------------------sounds--------------------------------
	PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_windrunner.vsndevts", context)
	PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_sven.vsndevts", context)
	PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts", context)

Ну и сделал побыстрому гифку с результатом. Деревья не бьет, юнитов кромсает.

uw1xkQ5.gif
 
Последнее редактирование модератором:
рывок как я понял недалеко, а если пока он делает рывок его лицом развернуть?

будет ли рывок прерываться?
 
насчет MoveToPosition
там нужна просто одна глобальная переменная и отлов приказов.

суть в том, что когда он делает райтклик, мы увеличиваем его скорость до например 700, и потом перехватываем все приказы или смотрим добежал ли.

если не добежал, но приказ сбился, убираем модификатор скорости.

если добежал тоже убираем модификатор.

а чтобы понять бежит ли он или не бежит, во время отдачи приказа, делаем переменную IsRunning = true))))

вот и весь код)
 
сделай более гладко. степ 100 это как то грубо смотрится.

максимально гладко когда степ = 5-10

в твоем случае поставить 25 более менее. если скорости недостаточно, смени таймер на 0.04
 
Не, не прервется, мы же ему в наглую прописываем местоположение. Поэтому никак не успеть с ним что-то сделать.

Про остальные настройки: кому как удобнее. Можно и дальше и плавнее сделать.
 
Реклама: