ответ нашелся сам. просто код был не оптимизирован, строки, и много чего такого. Так что тему можно закрыть. тема На самом деле я создал 400 пока что не ощущал сильных подлагов, но дальше не тестировал. Но мне пока что и не надо запариваться этим. Если будет сильно тормозить, то стоит подумать об ограничениях вершин или попробовать эффекты заюзать как посоветовал Bergi_Bear.
От способности, это встроено в самой способности. Есть бланковая способность - канал. Там есть настройка - ручное применение. Это означает то, что вы описали. Либо применют всеодновременно при отдаче приказа, или только конкретный юнит. ссылка
Изменить это никак. Только можно переделать на канал или похожую пустышку, либо использовать фрэймы. Но и канал не всегда может похожим на оригинал: Сбивает приказ, невозможно использовать на ходу таргет-абилку, таргет-эффекты молнии и снарядов, автокаст, и прочее.
На сайте НазерПанк выкладывал наработку LUA определения утечек.
Еще кучу ссылок кидали на LUA
NekoriDes, это только опытные люди знают, где утекает. Как оптимизировать.
ну счетчик просто показывает увеличиваются ли хэндлы. Не жрет ли много код. Если где-то не предусмотрел, и че-то не оптимизировал, то может проверить. Часто бывает полезен метод исключения. Эту часть кода выключил, посмотрел перестало утекать, стало ли меньше. Значит там утекает. Смысл в том, чтобы посмотреть сколько хэндлов на карте, использовать меньше объектов, где-то сократить.
Вот конечный вариант. Переделал на хэш-таблицу
Исправил многие подвисы - большая часть которых эта строки. Именно строки вызывают подвисы. Они не только в дебагах, но в ExecuteFunc, строковое название молнии и пр. И теперь молнии могу миллиардами создавать без проблем. Я тексты строк все сохранил в бд. Без этого почему у юнитов анимация ходьбы поддергивалась. Теперь все работает как надо и как часики. Единственная зараза - когда строю несколько деревней, потом вылетает чего-то с критом. Но это происходит очень и очень редко. где-то с шансом 0.05%. Возможно либо работаю с несуществующими объектами либо пытаюсь выгрузить из хэша не существующие данные. У вара какие то проблемы.
Пробовал вставить проверки GetHandleId(object) > 0 или HaveSavedReal или HaveSavedHandle - теперь сохранять карту не хочет. Пробую снова написать код
На юнитах лучше указать "Движение - Тип движения" - "Нет". Это тоже самое что и disable collision в триггерах. Тогда юнит через других юнитов, декор, ландшафт свободно перемещаются. Затупливает в основном из-за деревьев и зданий. А у зданий и деревьев есть текстура пути, из-за нее затупливает. Еще могут тупить из-за клиффов.
тип текстуры пути здании и деревьев, и блокираторов тоже влияет на проходимость
На зданиях лучше указать "Движение - Тип движения" - "Нет", иначе другие типы движения блокируют проходы (если присмотреться у большинства зданий не указан никакой тип движения, кроме эльфийских древ). У эльфийских древ есть способность "Пустить корни", которая делает неподвижными.
Зданиям и декорациям задают еще "Пути - Карта путей" - например текстура "Портал" или отсутствие текстуры ("Нет") делают здание проходимым. Тогда юниты через это свободно перемещаются. Какая-либо другая текстура может блокировать проход. Точно также происходит с декорациями, разрушаемыми декорациями (блокираторами). Об этом можно прочитать здесь
Чтобы настроить проходимость:
(Тип движения = Нет или Летающий) и (Карта путей = Нет или подходящая текстура) могут сделать здание проходимым насквозь
создай дерево/декор/блокиратор без текстур пути или найди подходящую текстуру
В редакторе JNGP можно текстуру земли настроить, во вкладке UMSWE есть функция Custom Tile Pathability через которую можно редактировать маркеры тайлов на клиффах (на обычных текстурах кажется не работает, но видел в интернете какой то редактор, с возможностью редактировать ландшафт)
или попробовать импортировать измененный Terrain.slk с настройками по пути TerrainArt/Terrain.slk
Физический размер.
Кто-то писал что можно настроить физ. размер так, чтоб проходил. Так ни фига не работает у наземных. Эта позволяет только ходить через узкие проходы (если они есть), как TD-шках. Конечно, физический размер препятствует проходам, так например, толстого большого юнита придется обогнуть. А если уж физ. размер 0, это не значит, что можно пройти насквозь, эта у юнита остается в центре точка, которая создает препятствие. Противник всем своим телом может пройти спокойно через вашего юнита, но может наткнуться на центр-точку, и переступить не сможет, поэтому огибает эту центр-точку. Это можно почувствовать, тестируя
конечно была такая тема
Летающие юниты (тип движения "Летающий")
Норм себя чувствует только летающие юниты (у них нет почти никаких преград). Летающие юниты могут собираться кучкой в одной точке, правда скучиваются не надолго.
Декор тоже может преграждать летающим. Это частично не правда, преграждает текстура пути у декора. Можно посмотреть пример блокиратора пути против воздуха.
Писали, что декорации вроде за преграду отвечают эти строчки (не правда):
Графика - Высота Полета (fly height) - если указать слишком высокую высоту, то летающие юниты взлетают выше (как-будто ходят по горе). Наблюдал несколько похожих наработок. Ходят словно по мосту. У не летающих это не работает, упираются в преграду, если эта текстура пути запрещает наземному.
Графика - Высота Препятствия (occlusion height) - отвечает за обзор видимости. Точнее, за деревьями нельзя будет увидеть ничего, так как покрыт туманом. Если построить стенку из деревьев, то вы не увидите, что творит противник. Есть также блокиратор обзора. что дают эти значения? Так понимаю, что если у юнита есть подходящая высота, то может видеть, что твориться за деревьями. Однако, для наземных высота бесполезна, в ро сколько не задавай высоту, они все равно не могут увидеть за преградой. Есть, даже парящие наземные юниты, если им задать высоту, то они приподнимаются, но, даже, они ничего не видят за преградой. А летающие могут видеть, им даже не нужно, чтоб высота была выше препятствия. Высота препятствия влияет на рельеф: например, наземный юнит находится на возвышенности и видит, что происходит внизу за деревьями. Короче это препятствие для наземных, на летающих это не работает
Вот как будет влиять триггерный подъем вверх наземного юнита с помощью "Превратиться в ворона" неизвестно (не тестил)
Пути - Можно пройти - (да/нет). Да = юниты по ходят деревьям, взбираясь вверх. Нет = наземные упираются в преграду.
Вывод: высота летающих юнитов ни на что не влияет источник
не знаю можно ли декорацию сделать прозрачной через триггеры.смотри в разделе анимации, но вот юнитам можно. Но вот можно в моделях:
если ты хочешь сделать выделяемым здание, но при этом, чтобы само здание невидимым - убираем модель здания: тогда потрет темный и модель невидима, но видим круг выбора.
круг выбора тоже можно убрать, тамно круг выбора напрямую связан с кругом выбора
проблема еще та, если на потретик два раза нажмешь - то камера смещает туда, где магазин. возможно решение есть, но задачу такую не ставил решать себе
Все работа завершена. Работает исправно и без лагов.
Единственное, что это примерная наработка на одну деревню. буду переделывать на несколько
Есть конечно недостатки: это число вершин многоугольника. Чем больше вершин имеет, тем больше вычислении делает на каждый отрезок. Немного подвисало. При разбивке еще больше таких вычислении. Пришлось сделать временную структуру, чтобы из нее удалять точки для уменьшения работ цикла. А также число вершин влияет и на число молнии. 0-100 молнии еще норм. Где-то 300 молнии уже создают лаги на слабом компе. Я просто уже думаю, что сделать надо ограничение вершин на регион, чтобы игрок строил ровно. И еще кнопочку добавить: показать зоны молниями или спрятать, чтоб не мешало. Помню, что молнии можно локально создавать на игрока
не знаю как это работать будет с несколькими игроками
Делаем нейтральным, и примерно как предложил Lord_Teo
+ pro100master хочет, чтобы ты с целями пошаманил, как я понял:
великан не подходит, тк его нет в целях атаки или абилки. Указать не получится. Но можно взять другие типы цели: самоубийца, древа, техника. Вот с ними и шаманить можно. Их можно триггерно добавлять или удалять. Вот например, даем зданию классификацию войск: самоубийца. В целях тех юнитов, которые будут атаковать здание: ставим в целях атаки "не самоубийца". Теперь автоатака у юнита отключена, вернее не отключена, а просто он не может атаковать здание. Что происходит с юнитом, которому ты отдаешь приказ атаковать то здание? У него вместо атаковать (attack), сменяет приказ на smart (следовать в точку). Можно отследить момент атаки: даем невидимый канал с приказом smart. И когда ты даешь приказ атаковать, срабатывает абилка. Нужно сделать триггер, который отслеживает срабатывание канала, и убрать классификацию у цели или может быть переключить атаку.
вот пример, там заменяю на вторую атаку
но вот что делать, если у юнита несколько атак включено. Тогда можно что-то другое придумать, как вариант паузу давать или приказ отмены.
недостаток: активация канала на 1 сек стопит юнита, еще сбивает очередь приказов
ScorpioT1000, я в своей наработке тоже как описал Lotus101 сравниваю. Чтобы повторно точки пересечения в массив не добавлялись. Вроде работает, но наверное...
Мб в моем случае полезнее дробную часть отсекать? хотя у меня погрешностей никогда не должно быть, тк после запятой ноль
ScorpioT1000, а ты можешь сделать такое же для 2D-деталей. Как в компасе?
эх плюсанул. некоторые вещи понятны. А большая часть нет. Как-то не понятно.
Хорошие примеры - symfony на php и разные опенсурс вещи на c# типа monogame
Наверное это для программистов, шарящих в такое. Эх векторы. это php и опенсурс вещи где их взять и чем их открыть. Если бы на наш язык перевести
Это бы заработало в массы народу если бы были практические применения в игре. Всякие примерные наработки.
PT153, ну ладно. если работает. просто это мб не всегда так, я просто уже не помню. Но когда то Диод говорил что не работает. Например, у вас стоит рабочий, его атаковал враг, рабочий естественно убежит от него. Но приказ то он не имеет вообще, тк не получал приказа от игрока вроде. Там надо тогда проверять не сдвинулся. Но и еще много других случаев. Пардон, мы говорим не про бездействие юнита, а про занятость. хотя это почти одно и тоже
ScorpioT1000, спасибо. но информацию я знаю. И как применить эти две точки ректа я знаю. Но все равно че то по своему хочу до конца. Щас я близок к решению, исправляю ошибки. Я просто не понимаю, что там происходит. Почему так работает. То одно, нахожу ошибку, исправляю. то другое появляется. Ранее разные проблемы были. Сейчас такая проблема: То работает как часики, то выдает сообщение: вы не можете строить (а то он может), потом оказывается что там регион каким то образом лежит (это сейчас нашел, оказывается надо boolean проверку отдельно делать).
У меня из-за региона такие проблемы. Криво определяет IsPointInRegion лежит ли точка. Могу доказательства даже показать. Поэтому выверяю лишними проверками. prog, не 9 месяцев. 2 года. У меня такая идея возникла тогда, мне показалось это необычным.
я вот подумал мб код с подробным разбором на обозрение выложить чем карту? Я думаю вы в карту не заглядывете даже
немного мыслей об этом
не хотел писать об этом. а то ругать будут что ты делаешь и прочее. Но все же осмеливаюсь написать.
все говорят, возьми сделай что-то подобие массива ректов. Но это еще надо придумать как их объединить вместе. Это алгоритм составить. И чтобы друг на друга не наслаивались. Потом еще регион то будет не один, планируется что у игрока мб несколько деревней (если он там захочет). А еще допустим игроков то тоже несколько будет. Это сколько регионов. А на каждый регион еще надо эти массивы. Да это наверное самое неудобная идея. А еще надо будет проверять лежит ли точка в регионе. Поэтому это отменяется.
Самое простое это иметь массив регионов udg_Region и туда просто добавлять ректы. Или удалять.
Еще самую хорошую идею подсказал NazarPunk использовать массив вершин многоугольника, и трассировку лучей. До сегодняшнего момента я не знал как этого сделать, поскольку не знал алгоритма пересечения точек. Но этот метод только пока мне кажется показывает, что лежит ли точка внутри многоугольника. И пока что мне проще IsPointInRegion. А как допустим к существующему многоугольнику встроить прямоугольник. Это опять придумать надо.
немного информации про IsPointInRegion. решил сделать такую херню. Но при чем рабочую.
function IsPointInArea takes real x, real y, integer k returns boolean
return (IsPointInRegion(udg_Region[k], x, y))
endfunction
//Проверка IsPointInRegionVillage помогает определить занято место или нет
//У каждого региона udg_Region[] отдельный земельный участок
//В отличии от обычных областей udg_Region[] в udg_Territory_of_the_Village добавляют все все регионы. Это позволяет просто проверить в будущем занято или нет
function IsPointInRegionVillage takes real x, real y returns boolean
return (IsPointInRegion(udg_Territory_of_the_Village, x, y))
endfunction
//лежит ли точка на покупаемом участке
//проверяет лишь нахождение точки на свободном участке
function IsPointInArea_1 takes real x, real y returns boolean
return ( (PointInRect1(x,y,udg_rect_minx_p1,udg_rect_maxx_p1,udg_rect_miny_p1,udg_rect_maxy_p1) ) and (not IsPointInRegionVillage(x, y)))
endfunction
//Точка лежит внутри многоугольника
//Проверяет принадлежность точки внутри земельного участка деревни IsPointInArea вместе с покупаемым участком udg_CheckRect
function IsPointInArea_2 takes real x, real y, integer n returns boolean
return IsPointInArea(x,y,n) or IsPointInArea_1(x, y)
endfunction
//Лежит ли точка внутри многоугольника и свободна точка от udg_Check_Region
//Это проверка необходима для разбивки многоугольника на ректы (прямоугольники)
//Но сперва необходимо проверить, лежит рект снаружи или внутри. Поэтому проверяем лежит ли центр внутри
//Когда мы находим две вершины ректа, то рект добавляем в временный udg_Check_Region, чтобы этот участок больше не трогали
function IsPointInArea_3 takes real x, real y returns boolean
return (IsPointInArea_2(x,y,udg_temp_integer))and (not IsPointInRegion(udg_Check_Region, x,y) )
endfunction
//CountOccupiedVertexsInRegion - ищет число занятых соседних точек
//Проверка позволяет определять касается ли точка с границей региона или ректа udg_CheckRect (k>0), лежит внутри (k=4) или не лежит (k=0).
//Помогает искать и создавать вершины многоугольника
//Проверяются обычно 4 диагональные клетки или... если быть точным, проверяем 4 точки
function CountOccupiedVertexsInRegion takes real x, real y, integer n returns integer
//Ранее boolean-проверкой IsPointInRegion определял ОДНУ соседнюю клетку, тк расчитывал на меньшее число операции. И если boolean-состояние клетки меняется, значит, упирается в границы. И стоит остановиться циклу.
//Но к сожалению, эта boolean-проверка IsPointInRegion не всегда работает точно. Если добавить рект в регион с помощью нативки RegionAddRect, вы получите совсем другие результаты.
//-----
// ПРОБЛЕМА ПЕРВАЯ: Если точнее, регион берет не точками, а ячейками, мин ячейка имеет размер 32x32 (в редакторе можно включить сетку: Вид -> Сетка G -> Мелкая). И вы можете получить совсем другие результаты при проверке IsPointInRegion
// Если у вас какие-то произвольные координаты вершин ректа, то при добавлении в нативку RegionAddRect координаты подправляют на ближайщие кратные числу 32. Типа -96,-64,-32,0,32,64, 96, 128 итд
// Эта нативка RegionAddRect иногда добавляет лишнее, это очень плохо проверка IsPointInRegion. Как говорил, она клеточками занимает область. есть добавить рект с вершинами (minx=0, miny=0,maxx=32.,maxy=32). То рект он добавляет с размерами (minx=0,miny=0,maxx=64.,maxy=64). Короче берет ближайшую координату кратно числу 32. Если взять число 64, то вставит 96. Если 96, то 128. Пробовал меньше 31, подправляет на 32.
// Нсли занять точку (32,32) то регион занимает ячейку (minx=32-maxx=64, miny=32-maxy=64). Теперь вы должны понимать как это работает. Если добавляю рект с вершинами (minx=0, miny=0,maxx=32.,maxy=32). То рект он добавляет с размерами (minx=0,miny=0,maxx=64.,maxy=64).
//-----
// ПРОБЛЕМА ВТОРАЯ: Алгоритм. Проблема как раз возникает, если два игрока делят одну ячейку или точнее два граничащих объекта (пример ректы) имеют общую границу.
// Регион то хранит не в виде точек, а ячеек. Не получится границу линиями, кто-то обязательно отожмет клетку. IsPointInRegion скажет, что клетка занята, поэтому завершит цикл раньше. А на деле оставит лишнюю ячейку, это еще надо будет как-то заранее выверять и мучиться. Придумал два-три алгоритма, не так хорошо работали. Потом еще больше нагромождении в виде доп проверок.
//----
//Поэтому сравнивают сразу несколько соседних клеток, проверяя "лежит ли точка в участке" и выводят те числа, которые приводят изменению.
//Можно было проверять соседние клетки по вертикали и по горизонтали, но по сравнению с "проверкой соседних клеток по диагонали" это не практично.
//Проверка по диагонали позволяет определять направление, двигаясь по часовой стрелке. а еще заранее исключает точку x,y, образующую одну общую вершину
// 1 point \ | / 2 point |
// ----------?-------------
// 3 point / | \ 4 point |
// ----------| ----------|-
local integer a = 0
local real r = 2.00
local real angle
//1) берем 4 точки от точки x,y
//считаем кол-во лежащих точек
if IsPointInArea_2(x-r,y+r,n) then
set udg_px[a] = x-r
set udg_py[a] = y+r
set a = a + 1
endif
if IsPointInArea_2(x+r,y+r,n) then
set udg_px[a] = x+r
set udg_py[a] = y+r
set a = a + 1
endif
if IsPointInArea_2(x+r,y-r,n) then
set udg_px[a] = x+r
set udg_py[a] = y-r
set a = a + 1
endif
if IsPointInArea_2(x-r,y-r,n) then
set udg_px[a] = x-r
set udg_py[a] = y-r
set a = a + 1
endif
//Проверка не образует ли одну общую вершину (2 ректа могут касаться углами)
// ¦ ¦ ¦ ¦ ¦ ¦ ¦
// ¦ ¦ ¦ ¦ ¦ ¦ ¦
//^^^^^^^^^^^?¦ ¦ ¦ ¦ ¦ ¦ ¦
//^^^^^^^^^^^^
//^^^^^^^^^^^^
//Если 2 занятые точки не имеют 90 гр значит это диагонально касаются
if a == 2 then
set angle = Acos(AngleBetweenTwoVectors(udg_px[0]-x,udg_py[0]-y, udg_px[1]-x,udg_py[1]-y)) * bj_RADTODEG
//call DisplayDebugTextToPlayer("угол: " + R2S(angle) )
if angle == 90.00 then
return 2
else
return 5
endif
endif
return a
endfunction
все нашел очень много мелких ошибок. и исправил.
исправил циклы, забыл поставить чистку и из этого цикл не завершал.
уменьшил кол-во шага. и пр
я не везде проставил в нативке call RegionAddRect(re, minx,miny,maxx-32,maxy-32
и многое другое. теперь работает. правда очень много дебагов и проверочных молнии, текстагов и поэтому подлагивает. если код в порядок привести будет норм. пока не закрываю тему. тк не знаю мб баги выявятся новые.
я еще не начинал пробовать как будет несколько регионов работать.
хотел спросить. существует ли лимит на число молнии? сколько могу создавать молнии
Vlod, я кажется понял. Создаем квадратики мин 32x32 или хотя бы 64x64. Но это скока надо квадратов наделать в карте 64x64. С учетом того, что 1x1 в карте это 128x128. Опять алгоритмы придумывать, попробую пока со старым кодом вымучиться. Если не пойдет совсем уж, возьму на заметку
Кстати пробовал массивами точек группировать, но код уж получился ужасным
код
function IsPointInArea takes real x, real y, integer number, integer area returns boolean
local integer max = udg_number_of_areas[number] //максимальное число областей (регионов) у игрока
local integer a = (area-1)*100
local boolean b = false
if max == 0 then //если у игрока нет ни одной области, значит, точка ни на чем не модет лежать
return false
endif
if number == 0 then
loop
exitwhen a>udg_CountRect_p1[area] or b //число ректов в регионе
set b = PointInRect1(x,y,udg_rect_minx_p1[a], udg_rect_maxx_p1[a], udg_rect_miny_p1[a], udg_rect_maxy_p1[a])
set a = a + 1
endloop
endif
return b
endfunction
function IsPointInAreaOfPlayer takes real x, real y, integer number returns boolean
//МИНИ-ОБЗОР: Регионы (area) привязываются к главному зданию рыбацкой деревни, поместья, замка на окраине, фермы, горнодобывающего поместья и пр
//Сами деревни и поместья будут принадлежать определенным игрокам, следовательно, и регионы принадлежат тоже игрокам
//Регионы разделяются на более мелкие прямоугольные формы (ректы).
local integer max = udg_number_of_areas[number] //максимальное число областей (регионов) у игрока
local integer i = 0
local integer a
local boolean b = false
if max == 0 then //если у игрока нет ни одной области, значит, точка ни на чем не модет лежать
return false
endif
if number == 0 then
loop
exitwhen i>max or b
set a = (udg_CountRect_p1[i]-1)*100
if a>= 0 then
loop
exitwhen a>udg_CountRect_p1[i] or b //число ректов в регионе
set b = PointInRect1(x,y,udg_rect_minx_p1[a], udg_rect_maxx_p1[a], udg_rect_miny_p1[a], udg_rect_maxy_p1[a])
set a = a + 1
endloop
endif
set i = i + 1
endloop
endif
return b
endfunction
function IsPointInRegionVillage takes real x, real y returns boolean
local integer i = 0
local boolean b = false
loop
exitwhen i>11 or b
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
//call DisplayDebugTextToPlayer("красный игрок играет" )
set b = IsPointInAreaOfPlayer(x,y,i)
endif
set i = i + 1
endloop
return b
endfunction
DracoL1ch, оно почему-то зацикливается. Короче проблема в loop, не может выйти из цикла. Насчитывает счетчик за 590. Какие то проверки не работают значит. Переделать надо тут. Неизвестно почему, это невидимое. Наверн дело в регионе. Баг работает единожды в едином случае. Этот участок не успевает поделиться и добавиться. Если забить на это, и купить участок в другом месте. Потом там же работает нормально. Vlod, да. не только это.
возможно и есть решения и проще.
эх. как это объяснить.
короче идея в том, чтобы можно было покупать участки земель. каждый игрок может иметь по несколько регионов, а мб и более десятки регионов.
регионы привязываются к определенным главным зданиям: хижина старейшины - деревня фермера, рядом с морем можно переделать в рыбацкую деревню, или деревню лесорубов
крепость - форпост у границы,
шахта - горнодобывающее поселение
когда заканчивается строительство, то дается начальный прямоугольный участок. Участок главного здания мб измениться, если рядом рядом участок принадлежит другому региону. Главные здания не должны строится близ друг друга, у них есть определенный радиус для развития.
На этом регионе проще отследить: строительство, заход противника, ии
эти регионы можно развивать, они могут разрастаться. То есть можно было бы покупать землю через меню главного здания. То есть там обычная игрушечная ферма, пустышка-здание с эффектом москитов, чтобы можно было ставить не только на свободный участок для стройки, но и на месте клифов, море и пр.
Решил я поделить на прямоугольные участки. Так как легче добавлять в регионы. Но этим есть проблемы, может лишнее добавлять. Также поделив на ректы, можно еще подсчитать площадь участка. Кстати у меня это идеально работает деление. С этим проблем нет. Есть другое, это система не работает как часы
кстати пробовал вместо регионов массив вершин ректов юзать. Но пока что это в зачатке находится. Написал пока не рабочий кож
Ред. MpW
» WarCraft 3 / большое количество молнии вызывают лаги
Ред. MpW
» WarCraft 3 / Одновременное и индивидуальное применение способностей
ссылка
Ред. MpW
» WarCraft 3 / Отлов и устранение утечек на LUA
ну счетчик просто показывает увеличиваются ли хэндлы. Не жрет ли много код. Если где-то не предусмотрел, и че-то не оптимизировал, то может проверить. Часто бывает полезен метод исключения. Эту часть кода выключил, посмотрел перестало утекать, стало ли меньше. Значит там утекает. Смысл в том, чтобы посмотреть сколько хэндлов на карте, использовать меньше объектов, где-то сократить.
» WarCraft 3 / Как разобрать эту таблицу?
Ред. MpW
» WarCraft 3 / как разбить фигуры на прямоугольники?
Исправил многие подвисы - большая часть которых эта строки. Именно строки вызывают подвисы. Они не только в дебагах, но в ExecuteFunc, строковое название молнии и пр. И теперь молнии могу миллиардами создавать без проблем. Я тексты строк все сохранил в бд. Без этого почему у юнитов анимация ходьбы поддергивалась.
Теперь все работает как надо и как часики. Единственная зараза - когда строю несколько деревней, потом вылетает чего-то с критом. Но это происходит очень и очень редко. где-то с шансом 0.05%. Возможно либо работаю с несуществующими объектами либо пытаюсь выгрузить из хэша не существующие данные. У вара какие то проблемы.
Пробовал вставить проверки GetHandleId(object) > 0 или HaveSavedReal или HaveSavedHandle - теперь сохранять карту не хочет. Пробую снова написать код
Ред. MpW
» WarCraft 3 / Как сделать так чтобы любая текстура было прозрачной?
Зданиям и декорациям задают еще "Пути - Карта путей" - например текстура "Портал" или отсутствие текстуры ("Нет") делают здание проходимым. Тогда юниты через это свободно перемещаются. Какая-либо другая текстура может блокировать проход. Точно также происходит с декорациями, разрушаемыми декорациями (блокираторами). Об этом можно прочитать здесь
Чтобы настроить проходимость:
(Тип движения = Нет или Летающий) и (Карта путей = Нет или подходящая текстура) могут сделать здание проходимым насквозь
создай дерево/декор/блокиратор без текстур пути или найди подходящую текстуру
В редакторе JNGP можно текстуру земли настроить, во вкладке UMSWE есть функция Custom Tile Pathability через которую можно редактировать маркеры тайлов на клиффах (на обычных текстурах кажется не работает, но видел в интернете какой то редактор, с возможностью редактировать ландшафт)
конечно была такая тема
Декор тоже может преграждать летающим. Это частично не правда, преграждает текстура пути у декора. Можно посмотреть пример блокиратора пути против воздуха.
Писали, что декорации вроде за преграду отвечают эти строчки (не правда):
Графика - Высота Полета (fly height) - если указать слишком высокую высоту, то летающие юниты взлетают выше (как-будто ходят по горе). Наблюдал несколько похожих наработок. Ходят словно по мосту. У не летающих это не работает, упираются в преграду, если эта текстура пути запрещает наземному.
Графика - Высота Препятствия (occlusion height) - отвечает за обзор видимости. Точнее, за деревьями нельзя будет увидеть ничего, так как покрыт туманом. Если построить стенку из деревьев, то вы не увидите, что творит противник. Есть также блокиратор обзора. что дают эти значения? Так понимаю, что если у юнита есть подходящая высота, то может видеть, что твориться за деревьями. Однако, для наземных высота бесполезна, в ро сколько не задавай высоту, они все равно не могут увидеть за преградой. Есть, даже парящие наземные юниты, если им задать высоту, то они приподнимаются, но, даже, они ничего не видят за преградой. А летающие могут видеть, им даже не нужно, чтоб высота была выше препятствия. Высота препятствия влияет на рельеф: например, наземный юнит находится на возвышенности и видит, что происходит внизу за деревьями. Короче это препятствие для наземных, на летающих это не работает
Вот как будет влиять триггерный подъем вверх наземного юнита с помощью "Превратиться в ворона" неизвестно (не тестил)
Пути - Можно пройти - (да/нет). Да = юниты по ходят деревьям, взбираясь вверх. Нет = наземные упираются в преграду.
Вывод: высота летающих юнитов ни на что не влияет
источник
https://www.xgm.guru/p/wc3/teamcolor
https://www.xgm.guru/p/wc3/216684
https://www.xgm.guru/p/100/212944
Ред. MpW
» WarCraft 3 / Как сделать так чтобы любая текстура было прозрачной?
че то вас не понимаю, что вам нужно.
Ред. MpW
» WarCraft 3 / Как сделать так чтобы любая текстура было прозрачной?
круг выбора тоже можно убрать, там но круг выбора напрямую связан с кругом выбора
проблема еще та, если на потретик два раза нажмешь - то камера смещает туда, где магазин. возможно решение есть, но задачу такую не ставил решать себе
Ред. MpW
» WarCraft 3 / как разбить фигуры на прямоугольники?
» WarCraft 3 / Алтарь Королей из Reforged
» WarCraft 3 / Отключение автоатаки по определённому юниту
Ред. MpW
» WarCraft 3 / Отключение автоатаки по определённому юниту
+ pro100master хочет, чтобы ты с целями пошаманил, как я понял:
великан не подходит, тк его нет в целях атаки или абилки. Указать не получится. Но можно взять другие типы цели: самоубийца, древа, техника. Вот с ними и шаманить можно. Их можно триггерно добавлять или удалять. Вот например, даем зданию классификацию войск: самоубийца. В целях тех юнитов, которые будут атаковать здание: ставим в целях атаки "не самоубийца". Теперь автоатака у юнита отключена, вернее не отключена, а просто он не может атаковать здание. Что происходит с юнитом, которому ты отдаешь приказ атаковать то здание? У него вместо атаковать (attack), сменяет приказ на smart (следовать в точку). Можно отследить момент атаки: даем невидимый канал с приказом smart. И когда ты даешь приказ атаковать, срабатывает абилка. Нужно сделать триггер, который отслеживает срабатывание канала, и убрать классификацию у цели или может быть переключить атаку.
но вот что делать, если у юнита несколько атак включено. Тогда можно что-то другое придумать, как вариант паузу давать или приказ отмены.
Ред. MpW
» WarCraft 3 / Сравнение точек в условии
Мб в моем случае полезнее дробную часть отсекать? хотя у меня погрешностей никогда не должно быть, тк после запятой ноль
Ред. MpW
» Commander! Blue Alert / Commander! Blue Alert
Ред. MpW
» WarCraft 3 / wGeometry - 3D библиотека (lua)
эх плюсанул. некоторые вещи понятны. А большая часть нет. Как-то не понятно. Наверное это для программистов, шарящих в такое. Эх векторы. это php и опенсурс вещи где их взять и чем их открыть. Если бы на наш язык перевести
Это бы заработало в массы народу если бы были практические применения в игре. Всякие примерные наработки.
Ред. MpW
» WarCraft 3 / Возможно ли отследить незанятого работника?
Ред. MpW
» WarCraft 3 / как разбить фигуры на прямоугольники?
У меня из-за региона такие проблемы. Криво определяет IsPointInRegion лежит ли точка. Могу доказательства даже показать. Поэтому выверяю лишними проверками.
prog, не 9 месяцев. 2 года. У меня такая идея возникла тогда, мне показалось это необычным.
все говорят, возьми сделай что-то подобие массива ректов. Но это еще надо придумать как их объединить вместе. Это алгоритм составить. И чтобы друг на друга не наслаивались. Потом еще регион то будет не один, планируется что у игрока мб несколько деревней (если он там захочет). А еще допустим игроков то тоже несколько будет. Это сколько регионов. А на каждый регион еще надо эти массивы. Да это наверное самое неудобная идея. А еще надо будет проверять лежит ли точка в регионе. Поэтому это отменяется.
Самое простое это иметь массив регионов udg_Region и туда просто добавлять ректы. Или удалять.
» WarCraft 3 / Возможно ли отследить незанятого работника?
» WarCraft 3 / Возможно ли отследить незанятого работника?
Ред. MpW
» WarCraft 3 / как разбить фигуры на прямоугольники?
исправил циклы, забыл поставить чистку и из этого цикл не завершал.
уменьшил кол-во шага. и пр
я не везде проставил в нативке call RegionAddRect(re, minx,miny,maxx-32,maxy-32
и многое другое. теперь работает. правда очень много дебагов и проверочных молнии, текстагов и поэтому подлагивает. если код в порядок привести будет норм. пока не закрываю тему. тк не знаю мб баги выявятся новые.
я еще не начинал пробовать как будет несколько регионов работать.
Ред. MpW
» WarCraft 3 / как разбить фигуры на прямоугольники?
Кстати пробовал массивами точек группировать, но код уж получился ужасным
» WarCraft 3 / как разбить фигуры на прямоугольники?
» WarCraft 3 / как разбить фигуры на прямоугольники?
» WarCraft 3 / как разбить фигуры на прямоугольники?
Vlod, да. не только это.
возможно и есть решения и проще.
регионы привязываются к определенным главным зданиям: хижина старейшины - деревня фермера, рядом с морем можно переделать в рыбацкую деревню, или деревню лесорубов
крепость - форпост у границы,
шахта - горнодобывающее поселение
когда заканчивается строительство, то дается начальный прямоугольный участок. Участок главного здания мб измениться, если рядом рядом участок принадлежит другому региону. Главные здания не должны строится близ друг друга, у них есть определенный радиус для развития.
На этом регионе проще отследить: строительство, заход противника, ии
эти регионы можно развивать, они могут разрастаться. То есть можно было бы покупать землю через меню главного здания. То есть там обычная игрушечная ферма, пустышка-здание с эффектом москитов, чтобы можно было ставить не только на свободный участок для стройки, но и на месте клифов, море и пр.
Решил я поделить на прямоугольные участки. Так как легче добавлять в регионы. Но этим есть проблемы, может лишнее добавлять. Также поделив на ректы, можно еще подсчитать площадь участка. Кстати у меня это идеально работает деление. С этим проблем нет. Есть другое, это система не работает как часы
кстати пробовал вместо регионов массив вершин ректов юзать. Но пока что это в зачатке находится. Написал пока не рабочий кож