Создание юнитов в случайной локации

Добавлен , опубликован

Описание

Маленькая наработка в виде примера как сделать на картах жанра Survival или HeroDefence, создавать юнита(юнитов) в случайной точке из заданных автором магическими кругами(Она предназначена для начинающих разработчиков, которые хотят что то делать нормальное и уникальное)

Небольшие преимущества

  • Вы всегда сможете изменить точки в редакторе
  • Используются координаты
  • Круги после выполнения своей работы удаляются
  • Вместо генерации случайных координат избежит непроходимость на карте,например:Юнит не создастся в кустах

Для стандартного World Editor

Как она работает

  • Сперва идёт функция(CooInit) инициализация координат основная функция, она создаёт локальную группу и пикает все магические круги на карте нейтрально-пассивные(для этого я в РО создал специально отдельный магический круг и задал RAW код 's000') проводим действие над группой увеличивая переменную udg_Coo_Num на 1 записываем координаты в переменные udg_Coo_X и udg_Coo_Y(реальные массивы) с индексом udg_Coo_Num и удаляем с группы текущий магический круг,тем самым мы создали массив с координатами для каждой из точек.
Jass
function CooInit_Check takes nothing returns boolean
    return GetUnitTypeId(GetFilterUnit()) == 's000'
endfunction

function CooInit takes nothing returns nothing
    local group g = CreateGroup()
    local boolexpr b = Condition(function CooInit_Check)
    local unit e = null
    set udg_Coo_Num = 0
    call GroupEnumUnitsOfPlayer(g,Player(15),b)
    loop
        set e = FirstOfGroup(g)
        exitwhen e == null
        set udg_Coo_Num = udg_Coo_Num + 1
        set udg_Coo_X[udg_Coo_Num] = GetUnitX(e)
        set udg_Coo_Y[udg_Coo_Num] = GetUnitY(e)
        call RemoveUnit(e)
        call GroupRemoveUnit(g,e)
    endloop
    call DestroyBoolExpr(b)
    call DestroyGroup(g)
    set g = null
    set b = null
endfunction
  • Далее использованиe, использовать это уже вы сами должны вставить в своей системе создание атак,вам понадобится с генерировать в локальную переменную случайное число и при создании указать необходимые нам координаты
Jass
    local integer i = GetRandomInt(1,udg_Coo_Num)
    local unit u = CreateUnit(Player(11),'hfoo',udg_Coo_X[i],udg_Coo_Y[i],0)
    ......
    set u = null

Пример

  • Вы можете посмотреть как это реализовано в примере, это очень удобно потому что вы всегда можете переместить круг и изменить координаты в редакторе

Как переместить в мою карту

  • Для этого копируем функцию CooInit и к ней прилежащую CooInit_Check в нестандартный код
  • И в создании волн в цикле последовательного создания юнитов, с генерировать случайное число и создать юнита в нужных координатах

Для тех у кого есть Jass New Gen Pack

Как она работает

  • Сперва идёт функция(Init) инициализация координат основная функция, она создаёт локальную группу и пикает все магические круги на карте нейтрально-пассивные(для этого я в РО создал специально отдельный магический круг и задал рав код 'S000') проводим действие над группой увеличивая переменную Coo_Num на 1 записываем координаты в переменные Coo_X и Coo_Y(реальные массивы) с индексом Coo_Num и удаляем с группы текущий магический круг,тем самым мы создали массив с координатами для каждой из точек.
vJass
library ACooInit initializer Init

    globals
    
        integer Coo_Num = 0 // Переменная для счёта локаций
        real array Coo_X      // Хранение координат Х
        real array Coo_Y      // Хранение координат Y
        
    endglobals
    
    private function Check takes nothing returns boolean
        return GetUnitTypeId(GetFilterUnit()) == 's000'
    endfunction

    private function Init takes nothing returns nothing
        local group g = CreateGroup()
        local boolexpr b = Condition(function Check)
        local unit e = null
        call GroupEnumUnitsOfPlayer(g,Player(15),b)
        loop
            set e = FirstOfGroup(g)
            exitwhen e == null
            set Coo_Num = Coo_Num + 1               //Увеличиваем переменную
            set Coo_X[Coo_Num] = GetUnitX(e)      // Присваиваем координату Х
            set Coo_Y[Coo_Num] = GetUnitY(e)      // Присваиваем координату Y
            call GroupRemoveUnit(g,e)                   // Удаляем круг с группы
            call RemoveUnit(e)                             // Удаляем  записанный круг
        endloop
        call DestroyBoolExpr(b)
        call DestroyGroup(g)
        
        set g = null
        set b = null
    endfunction

endlibrary
  • Далее использованиe, использовать это уже вы сами должны вставить в своей системе создание атак,вам понадобится с генерировать в локальную переменную случайное число и при создании указать необходимые нам координаты
Code
        local integer i = GetRandomInt(1,Coo_Num) //Случайное число от 1 до кол-во кругов
        local unit u = CreateUnit(Player(11),'hfoo',Coo_X[i],Coo_Y[i],0) //Создаём юнита
        ...
        set u = null

Пример

  • Вы можете посмотреть как это реализовано в примере, это очень удобно потому что вы всегда можете переместить круг и изменить координаты в редакторе

Как переместить в мою карту

  • Для этого копируем библиотеку ACooInit куда вам удобно
  • И в создании волн в цикле последовательного создания юнитов, с генерировать случайное число и создать юнита в нужных координатах

Библиотека синтаксиса cJass

cJass
library ACooInit initializer Init{
    
        integer Coo_Num = 0 // Переменная для счёта локаций
        real array Coo_X      // Хранение координат Х
        real array Coo_Y      // Хранение координат Y
    
    private boolean Check(){
        return GetUnitTypeId(GetFilterUnit()) == 's000'
    }

    private nothing Init(){
        group g = CreateGroup()
        boolexpr b = Condition(function Check)
        unit e = null
        GroupEnumUnitsOfPlayer(g,Player(15),b)
        do{
            e = FirstOfGroup(g)
            exitwhen e == null
            Coo_Num = Coo_Num + 1         //Увеличиваем переменную
            Coo_X[Coo_Num] = GetUnitX(e)// Присваиваем координату Х
            Coo_Y[Coo_Num] = GetUnitY(e)// Присваиваем координату Y
            GroupRemoveUnit(g,e)             // Удаляем круг с группы
            RemoveUnit(e)                        // Удаляем  записанный круг
        }
        DestroyBoolExpr(b)
        DestroyGroup(g)
        
        g = null
        b = null
    }

}

Совет от автора

  • Перед созданием юнита используйте функцию call DestroyEffect(AddSpecialEffect(effectmodel,x,y)) в координатах создания, это будет выглядеть красиво
`
ОЖИДАНИЕ РЕКЛАМЫ...