Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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 InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
		rect = Rect(0, 0, 128, 128)
		item = CreateItem(DUMMY, 0, 0)
		SetItemVisible(item, false)
	end
	
	local items = {}
	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

Скачать

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
5 лет назад
0
Что лучше ( dx * dx ) или ( dx ^ 2 ) ?
1
16
5 лет назад
1
ScopteRectuS:
Что лучше ( dx * dx ) или ( dx ^ 2 ) ?
примерно равны, слева два поиска переменных и операнд, справа одна переменная, константа и использование функции Pow
8
29
5 лет назад
8
примерно равны, слева два поиска переменных и операнд, справа одна переменная, константа и использование функции 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
0
28
5 лет назад
0
NazarPunk, ура, хоть где-то я могу нормально тестить производительность.
0
29
5 лет назад
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
Правда в игре немного другие значения
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.