Сейчас 15:48:18 Суббота, 18 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » как принять в функции entered (действия триггера t) массив (именно того юнита в которого вошли)
как принять в функции 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)
---------------------------------------------

Quote (Murador)
да

Тогда лечге проверять не через юнита массив а через 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
Блокировки:
Quote (Murador)
нет

Тогда делай через 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)
---------------------------------------------

Quote (Murador)
YourUnit?

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 не возвращает ничего

 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » как принять в функции entered (действия триггера t) массив (именно того юнита в которого вошли)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz