, Гильдия «Черамор»

[lua] Pathable

» опубликован
» Способ реализации: Lua
» Тип: Наработка
Наработка, позволяющая проверять проходимость точки используя скрытый предмет. По сути является TerrainPathability переписанной на lua.
» Список функций
---@param x real
---@param y real
---@return boolean
function IsTerrainWalkable(x, y) end

---@param x real
---@param y real
---@return boolean
function IsTerrainDeepWater(x, y) end

---@param x real
---@param y real
---@return boolean
function IsTerrainShallowWater(x, y) end

---@param x real
---@param y real
---@return boolean
function IsTerrainLand(x, y) end
» Настройка
local RANGE = 10 -- Расстояние, на котором проходит проверка
local DUMMY = FourCC('wolg') -- Ид предмета для проверки проходимости
» Код
do
	local RANGE = 10 -- Расстояние, на котором проходит проверка
	local DUMMY = FourCC('wolg') -- Ид предмета для проверки проходимости
	
	local rect---@type rect
	local item ---@type item
	
	local InitGlobals_hook = InitGlobals
	function InitGlobals()
		InitGlobals_hook()
		rect = Rect(0., 0., 128., 128.)
		item = CreateItem(DUMMY, 0, 0)
		SetItemVisible(item, false)
	end
	
	local items = {} ---@type table
	local function hide()
		local target = GetEnumItem()
		if not IsItemVisible(target) then return end
		table.insert(items, target)
		SetItemVisible(target, false)
	end
	
	---@param x real
	---@param y real
	---@return boolean
	function IsTerrainWalkable(x, y)
		MoveRectTo(rect, x, y)
		EnumItemsInRect(rect, nil, hide)
		
		SetItemPosition(item, x, y)
		local dx = GetItemX(item) - x
		local dy = GetItemY(item) - y
		SetItemVisible(item, false)
		
		for i = 1, #items do
			SetItemVisible(items[i], true)
		end
		items = {}
		
		return dx * dx + dy * dy <= RANGE * RANGE and not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)
	end
end

---@param x real
---@param y real
---@return boolean
function IsTerrainDeepWater (x, y)
	return not IsTerrainPathable(x, y, PATHING_TYPE_FLOATABILITY) and IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)
end

---@param x real
---@param y real
---@return boolean
function IsTerrainShallowWater (x, y)
	return not IsTerrainPathable(x, y, PATHING_TYPE_FLOATABILITY) and not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY) and IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY)
end

---@param x real
---@param y real
---@return boolean
function IsTerrainLand(x, y)
	return IsTerrainPathable(x, y, PATHING_TYPE_FLOATABILITY)
end

---@param x real
---@param y real
---@return boolean
function IsTerrainPlatform (x, y)
	return not IsTerrainPathable(x, y, PATHING_TYPE_FLOATABILITY) and not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY) and not IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY)
end


Просмотров: 385

» Лучшие комментарии


ScopteRectuS #1 - 3 месяца назад 0
Что лучше ( dx * dx ) или ( dx ^ 2 ) ?
DracoL1ch #2 - 3 месяца назад 1
ScopteRectuS:
Что лучше ( dx * dx ) или ( dx ^ 2 ) ?
примерно равны, слева два поиска переменных и операнд, справа одна переменная, константа и использование функции Pow
NazarPunk #3 - 3 месяца назад 6
примерно равны, слева два поиска переменных и операнд, справа одна переменная, константа и использование функции Pow
Написал маленький тест, оказалось степень тяжёлая.
loop = 10000000
xa = 1.3
ya = 2.3
xb = 3.3
yb = 4.3

s = 0
start = os.clock()
for i=0, loop do
	local dx = xb-xa
	local dy = yb-ya
	s = s + dx * dx + dy * dy
end
print(os.clock()-start, s) --> 0.55 - 0.59

s = 0
start = os.clock()
for i=0, loop do
	s = s + (xb-xa)^2 + (yb-ya)^2
end
print(os.clock()-start, s) --> 0.9 - 0.95
PT153 #4 - 3 месяца назад 0
NazarPunk, ура, хоть где-то я могу нормально тестить производительность.
NazarPunk #5 - 3 месяца назад 0
ура, хоть где-то я могу нормально тестить производительность.
Мелкие тесты я запускаю здесь.
local loop, xa, ya, xb, yb = 10000000, 1.3, 2.3, 3.3, 4.3

local sum, start           = 0, os.clock()
for i = 0, loop do
	local dx = xb - xa
	local dy = yb - ya
	sum      = sum + dx * dx + dy * dy
end
print(os.clock() - start, sum) --> ~0.22

sum, start = 0, os.clock()
for i = 0, loop do
	sum = sum + (xb - xa) ^ 2 + (yb - ya) ^ 2
end
print(os.clock() - start, sum) --> ~0.56
Правда в игре немного другие значения
прикреплены файлы