Добавлен Klop,
опубликован
Описание
Маленькая наработка в виде примера как сделать на картах жанра 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)) в координатах создания, это будет выглядеть красиво
`
ОЖИДАНИЕ РЕКЛАМЫ...
Комментарии пока отсутcтвуют.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.