Глупый вопрос. Никогда в программировании не занимался, но хотелось бы самому сделать вещь - нужно чтобы рабочий сам находил участок где можно построить здание.
Тут возникают вопросы:
  1. Как определить размеры площадки будущего здания? я так понял нужно базу данных делать: на ощупь определять каждое здание, и записывать так? я так и сделать. Сделал так, поставил на карту здание, и мышкой поводил и проверял, где можно строить. Снизу указаны координаты, с помощью них высчитал приблизительные размеры. Получилось что-то на вроде прямоугольника (круг потяжелее высчитать).
  2. Теперь второй вопрос? А как проверить, что в этом прямоугольном участке можно строить? это надо каждую точку проверить на "можно строить"? я так и сделал два цикла. Вопрос такой - эта хорошая идея? вроде не заметил никаких нагрузок
Еще там от должен быть промежуток между зданием, нужен ли промежуток или без разницы. Просто не все здания могут рядом с друг другом встать (ратуша например с ратушей)
  1. Есть рабочий, ему нужно построить здание. А как узнать как двигать центр прямоугольника? Это что нужно всю карту перебирать? могу конечно от ближнего раба двигать, только не понимаю как. Обычно строят в центре ратушу (недалеко от стартовой позиции и от рудника), а от центра (ратуши) отсчитываешь и проверяешь есть ли постройки рядом. Рабочие строят плавно, иногда тупят и стоят. Раньше такое делал, но потом удалил, сейчас хочу попробовать еще раз.
была тема также

Принятый ответ

Проблема в том, что, если в этой точке построено здание, то IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY) не помогает (это терраин проверяет, а вот то что там построено или нет ему пофиг). Посмотрел в триггерах, есть только текстуры земли - уберспласты (там эти текстурки для здания) - нет функции такой в библиотеке jngp для проверки точки. Пробовал через группу, но там своя заминка (походу выборка ловит тех юнитов, точки которых попали в выборку, а не на целиком. Точно не проверял, но не работает с группой),
Clamp, решил через проверку
if (IssueBuildOrderById(YT, 'hhou', x, y) == false) then если не может построить, значит там здание или что-нибудь еще.
Clamp, помог еще твоя ссылка ExecuteFunc. видимо у меня лимит был, не хотело работать (просто дебаг не отобрал. и раб стоял). Хотя это уже не нужно было
А да слегка подвисает на секунду =(
Урра короче без лагов сделал (версия 3), подредактировать недоработку и будет норм
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
30
7 лет назад
2
Создавать такое здание невидимым для нейтрального игрока, его координаты окажутся равными ближайшей возможной точки для строительства этого здания, здание удаляем, рабочему отдаём приказ в эти координаты строить.

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

Базовый ИИ в варкрафте прописан отдельно, наружу выведены только нативки для управления им и настройки, так что там какие-то внутренние алгоритмы, нам неведомые. Скорее всего, проверяется карта путей карты каким-то образом.
0
27
7 лет назад
Отредактирован MpW
0
Проблема в том, что, если в этой точке построено здание, то IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY) не помогает (это терраин проверяет, а вот то что там построено или нет ему пофиг). Посмотрел в триггерах, есть только текстуры земли - уберспласты (там эти текстурки для здания) - нет функции такой в библиотеке jngp для проверки точки. Пробовал через группу, но там своя заминка (походу выборка ловит тех юнитов, точки которых попали в выборку, а не на целиком. Точно не проверял, но не работает с группой),
Clamp, решил через проверку
if (IssueBuildOrderById(YT, 'hhou', x, y) == false) then если не может построить, значит там здание или что-нибудь еще.
Clamp, помог еще твоя ссылка ExecuteFunc. видимо у меня лимит был, не хотело работать (просто дебаг не отобрал. и раб стоял). Хотя это уже не нужно было
А да слегка подвисает на секунду =(
Урра короче без лагов сделал (версия 3), подредактировать недоработку и будет норм
Загруженные файлы
Принятый ответ
0
27
6 лет назад
Отредактирован MpW
0
Карта путей зданий легко определяется. Используется текстура пути
поле редактора "Пути- Карта путей"
возьмем текстуру фермы:
PathTextures\4x4SimpleSolid.tga
у всех обычно в текстурках цифры какие-то приписываются. Означают они пиксели. То есть там картинка 4x4. Это самая минимальная. Пробовал сделать меньше, но потом здание не ставится нормально при строительстве (ставится только через каждые 4 клетки), сделал по-другому, можно взять иконку 4x4, квадрат с 2x2 середину закрасить розовым, края черным).
вот статья
еще цифры означают и реальный игровой размер площадки здания.
например числа 4x4. здесь 4 означает, что 4 квадрата. короче площадь с размером 4 квадрата на 4 квадрата.
1 маленький квадрат = 32x32 (его можно увидеть в редакторе, сетку включите)
площадь 4квадрата x 4квадрата = 128x128
площадь 10квадрата x 10 квадрата = 320x320 и так далее
можно использовать код
можно брать массив ректы. создаете ректы под разные размеры (их там не много).
set Rect_32x32[2] = (Rect(0, 0, 64,64)) это не существующий сделал для себя
set Rect_32x32[4] = (Rect(0, 0, 128,128)) площадка фермы и др
set Rect_32x32[8] = (Rect(0, 0, 256, 256)) площадка башни грифона и кузницы и др
set Rect_32x32[10] = (Rect(0, 0, 320, 320)) площадка алтаря, лесопилки и др
set Rect_32x32[12] = (Rect(0, 0, 384, 384)) площадка казармы и др
и так далее

короче берем двигаем центр ректа в предполагаемую точку, проверяем функцией GetPathingRect.
в коде каждые 32 координаты смещения точки проверяется точка. Не хотелось бы проверять через каждую координату, лучше через каждые 32 координаты. Тут сразу же выходит из цикла, если например в точке нельзя строить (или что там по условию).
function GetPathingRect takes rect re, pathingtype pt, boolean pathable returns integer
    
    //available pathing types
//PATHING_TYPE_ANY                 //if this is false you can't walk/build/fly on it
//PATHING_TYPE_WALKABILITY         //if this is false you can't walk on it
//PATHING_TYPE_FLYABILITY          //if this is false you can't fly on it
//PATHING_TYPE_BUILDABILITY        //if this is false you can't build on it
//PATHING_TYPE_PEONHARVESTPATHING  //don't know
//PATHING_TYPE_BLIGHTPATHING       //if this is false you can't build ziggs on it
//PATHING_TYPE_FLOATABILITY        //don't know
//PATHING_TYPE_AMPHIBIOUSPATHING   //don't know
    local real r = 32  //size of pathing blocks
    local real x = GetRectMinX(re)
    local real y
    local real x2 = GetRectMaxX(re)
    local real y2 = GetRectMaxY(re)
    local boolean b = pathable
    local integer k = 0
    
    loop
        exitwhen x >= x2 or b!=pathable
        set y = GetRectMinY(re)
        loop
            exitwhen y >= y2 or b!=pathable
            if y < y2 and x < x2 then
                set b = (not IsTerrainPathable(x, y, pt)) //точка где можно строить, функция инверсная.
                if not b then 
                    set k = k + 1 //кол-во точек, в которых нельзя строить  
                endif
                
            endif
            set y = y + r
        endloop
        set x = x + r
    endloop
    set re = null
    set pt = null
   // call BJDebugMsg("проверка на стройку " + I2S(k) )

    return k //если бы хотя бы одна точка не подходит под площадку значит здесь невозможно применить площадку 
endfunction
эти ректы еще помогают записывать площадки в регион. Можно потом проверять не занята ли площадка, или можно здесь копать и др.
или при строительстве записываете площадку в регион. Потом проверяете.
Берете записываете. Например можно взять поле вот, в этом поле можно записать размер здания. Бесполезно поле для большинства здании.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.