|
|
|
|
как принять в функции entered (действия триггера t) массив
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:03:46 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| Вообщем назрел такой вопрос: допустим у нас есть функция: Code function lol1 takes integer x,integer y,real face,boolean del returns nothing local location l local integer i=LoadInteger(rd_hash,1,1)+1 local trigger t=CreateTrigger() if del==true then set l=Location(GetLocationX(vgui_general_pos)+map_x[x],GetLocationY(vgui_general_pos)+map_y[y]/2) set rd_point[i]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetLocationX(l),GetLocationY(l),face) else set l=Location(GetLocationX(vgui_general_pos)+map_x[x],GetLocationY(vgui_general_pos)+map_y[y]) set rd_point[i]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetLocationX(l),GetLocationY(l),face) endif call TriggerRegisterUnitInRange(t,rd_point[i],60.00,null) call TriggerAddAction(t,function entered) call DisplayTextToPlayer(Player(0),0,0,I2S(i)) call RemoveLocation(l) call SaveInteger(rd_hash,1,1,i) endfunction её суть создать юнита по принимающим координатам, и для созданного юнита создать триггер который будет засекать все что будет в радиусе от юнита в 60 и вопрос: как принять в функции entered (действия триггера t) массив именно того юнита в которого вошли, и например вывести массив игроку на экран
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:21:47 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) как принять в функции entered (действия триггера t) массив именно того юнита в которого вошли Записывай юнита с массивом в хеш а потом записывай его номер ячейки массива в integer. Quote (Murador) и например вывести массив игроку на экран call DisplayTextToPlayer(Player(0),0,0,I2S(i)) ты вроде бы и так сделал или что?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 09 Апреля 2011, 13:25:22 |
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:26:28 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| Quote (lawson) Записывай юнита с массивом в хеш а потом записывай его ячейку массива в integer. да щас проверю на роботоспособность Quote (lawson) call DisplayTextToPlayer(Player(0),0,0,I2S(i)) это выводит грубо говоря кол-во обращений к функциеДобавлено (09-04-2011, 13:26) ---------------------------------------------
Quote (lawson) Записывай юнита с массивом в хеш а потом записывай его номер ячейки массива в integer. это не сработает в случае если к функцие обращались кучу раз, в моем случае - 407
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:27:43 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) да щас проверю на роботоспособность Я так тоже делал когда мне надо было создать timer array для unit array я тоже записывал номер его ячейки а потом в таймере загружал это т же номер.Добавлено (09-04-2011, 13:27) ---------------------------------------------
Quote (Murador) в моем случае - 407 Хмм сейчас подумаю.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:29:16 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| конечно можно перебирать всех созданных юнитов на наличие юнита в нем, но мне кажется это очень утечное дело
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:32:09 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| а тебе обязательно надо записывать созданного юнита в перменную массив? Добавлено (09-04-2011, 13:32) --------------------------------------------- Попробуй так создай еще одну перменную юнит local unit u if del==true then set l=Location(GetLocationX(vgui_general_pos)+map_x[x],GetLocationY(vgui_general_pos)+map_y[y]/2) set rd_point[i]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetLocationX(l),GetLocationY(l),face) else set l=Location(GetLocationX(vgui_general_pos)+map_x[x],GetLocationY(vgui_general_pos)+map_y[y]) set rd_point[i]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetLocationX(l),GetLocationY(l),face) endif set u = rd_point[i] call TriggerRegisterUnitInRange(t, u,60.00,null) А что ты вообще хочешь этим сделать? Зачем юнита записывать в перменную?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 09 Апреля 2011, 13:33:01 |
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:32:20 | Сообщение # 7 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| да, тем более что в будущем мне нужно будет принимать его номер массива
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:33:24 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) да, тем более что в будущем мне нужно будет принимать его номер массива А тогда мой пример не подойдет.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:35:49 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| lawson, а ведь можно перебрать всех rd_point[i]==u то, ведь это будет получше
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:36:37 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (lawson) мне нужно будет принимать его номер массива Вот и решение создай в этой же функции глобалку Integer и записывай номер каждого созданного юнита.Добавлено (09-04-2011, 13:36) ---------------------------------------------
Quote (Murador) rd_point[i]==u Ну ты же сказал что около 400 обращений что будешь делать это через цикл?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:41:37 | Сообщение # 11 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| Quote (lawson) Вот и решение создай в этой же функции глобалку Integer и записывай номер каждого созданного юнита. в массивы?Добавлено (09-04-2011, 13:41) ---------------------------------------------
Quote (lawson) Ну ты же сказал что около 400 обращений что будешь делать это через цикл? да
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:46:07 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) в массивы? Я точно не знаю так как я уже запутолся, если б ты сказал зачем тебе этот номер его ячейки. Добавлено (09-04-2011, 13:43) --------------------------------------------- Тогда лечге проверять не через юнита массив а через integer меньше лагов будет. Добавлено (09-04-2011, 13:46) --------------------------------------------- Кароче я так понял тебе нужно сделать триггер что юнит входит в область 60 ед, вокруг созданного юнита , а потом узнать в область которого юнита вошел юнит да?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 09 Апреля 2011, 13:46:34 |
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:50:05 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| Quote (lawson) Кароче я так понял тебе нужно сделать триггер что юнит входит в область 60 ед, вокруг созданного юнита , а потом узнать в область которого юнита вошел юнит да? даДобавлено (09-04-2011, 13:50) --------------------------------------------- lawson, есть вариант чтобы не делать на каждого юнита триггер, а сделать один генеральный, но в таком случае без гигантских циклов не обойтись =/
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:50:21 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Пфф тогда все просто. Ты создавай не call TriggerRegisterUnitInRange(t,rd_point[i],60.00,null) вот это а создавай rect и для rect регистрируй событие юнит входи в область, во круг юнита и этот rect array - в его ячейки записывай номер созданного юнита. Если не понял могу привести пример.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 09 Апреля 2011, 13:51:02 |
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:51:19 | Сообщение # 15 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| lawson, а rect разве может иметь радиус?
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:56:05 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) , а rect разве может иметь радиус? Да. local rect array set rect[номер ячейки юнита] = Rect(GetUnitX(твою юнит) - 60, GetUnitY() - 60, GetUnitX() + 60, GetUnitY() + 60) - это создаст область в 60 ед.Добавлено (09-04-2011, 13:56) --------------------------------------------- Самое главное забыл спросить твой юнит движеться?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 09 Апреля 2011, 13:52:53 |
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 13:57:01 | Сообщение # 17 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| нет
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 13:59:23 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Тогда делай через rect и не парься.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 14:00:11 | Сообщение # 19 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| lawson, получаеться что нам ещё понадобиться local region reg call RegionAddRect(reg, rect)?
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 14:17:38 | Сообщение # 20 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) получаеться что нам ещё понадобиться Точно. А потом когда юнит будет входить в область проверяй GetTriggeringRegion() == твоя область массив от сюда и находи номер ячейки юнита. Добавлено (09-04-2011, 14:05) --------------------------------------------- Вообще есть еще второй способ, это когда юнит входит в область то пик всех юнитов вокруг TriggerUnit() если выделенный юнита = твой юнит массив то дальше там что тебе надо. Добавлено (09-04-2011, 14:07) --------------------------------------------- Кароче сейчас я тебе пример напишу на JASS Добавлено (09-04-2011, 14:17) --------------------------------------------- Вот пример, i - это твоя глобальная переменная Integer. Code function GetUnitId takes nothing returns boolean return GetUnitTypeId(GetFilterUnit()) == 'n000' endfunction
function YourAction takes nothing returns nothing local unit u = GetTriggerUnit() local group g = CreateGroup() local unit d local integer l = 0 local boolexpr bool = Condition(function GetUnitId) call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 60, bool) set d = FirstOfGroup(g) loop exitwhen l > i if (d == YourUnit[l]) then call DisplayTextToPlayer(Player(0), 0, 0, I2S(l)) endif set l = l + 1 endloop call DestroyGroup(g) call DestroyBoolExpr(bool) set bool = null set g = null set u = null set d = null endfunction
function CreateUnitOnPosition takes nothing returns nothing local trigger t = CreateTrigger() local rect array r local region reg = CreateRegion() local integer l = 0 set YourUnit[i] = CreateUnit() set r[i] = Rect() loop exitwhen l > i set reg = RegionAddRect(reg, r[i]) call TriggerRegisterEnterRegion(t, reg, null) set l = l + 1 endloop call TriggerAddAction(t, function YourAction) call RemoveRect(r) call RemoveRegion(reg) set r = null set reg = null set t null endfunction
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 09 Апреля 2011, 14:05:38 |
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 14:42:15 | Сообщение # 21 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| Quote (lawson) if (d == YourUnit[l]) then YourUnit?
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 14:44:12 | Сообщение # 22 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Я же говорю это пример это знчит что я только показал как делать дальше может сам догадаешься!? Добавлено (09-04-2011, 14:44) ---------------------------------------------
rd_point
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 14:52:01 | Сообщение # 23 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| клоз тему
|
|
|
|
lawson | Дата: Суббота, 09 Апреля 2011, 14:53:04 | Сообщение # 24 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Murador, Сделал?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Суббота, 09 Апреля 2011, 14:59:39 | Сообщение # 25 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| lawson, там баг, например если в функцию lol1 пихнуть добавления созданного юнита в группу, то функция просто напросто не будет выполняться, хз почему Добавлено (09-04-2011, 14:57) --------------------------------------------- точнее будет но только один раз Добавлено (09-04-2011, 14:59) --------------------------------------------- + функция RegionAddRect не возвращает ничего
|
|
|
|
|
|
|
|
|
|
|