XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Uncolo

offline
Опыт: 580
Активность:
FirstOfGroup()
после удаления из группы "первого юнита", то сл. запрос на "первого юнита" вернет NULL

каким способом можно присваивать FirstOfGroup юниту, который шел по счету, сразу же за 1ым?

вот пример:
есть 3 юнита в группе (1, 2, 3), после удаления из группы первого, нужно присвоить 2ому юниту FirstOfGroup
Старый 25.04.2012, 16:33
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
local unit u1
local unit u2
local unit u3
local group g
set u1=FirstOfGroup(g)
//действия
call GroupRemoveUnit(g,u1)
set u2=FirstOfGroup(g)
//действия2
call GroupRemoveUnit(g,u2)
set u3=FirstOfGroup(g)
//действия3
call GroupRemoveUnit(g,u3)
Старый 25.04.2012, 16:36
DaeDR

offline
Опыт: 8,074
Активность:
Uncolo, можно ForGroup() сделать. Устанавливаем две переменные. Первая равна нужному номеру юниту, вторая равна нулю. При Пике каждого юнита прибавляем ко второй +1 и проверяем, если равна первой, то заносим юнита в переменную.
Старый 25.04.2012, 16:38
Msey
????
offline
Опыт: 67,346
Активность:
Nerevar, а не проще циклом вышвыривать юнитов из группы?
Старый 25.04.2012, 16:39
Uncolo

offline
Опыт: 580
Активность:
Nerevar, совсем не то... а если юнитов 1000+? переменную на кждого юнита (или массив)? Оо да ну нет.

DaeDR, группа занесена в глобалку, фор груп то незачем. Нужно просто удалять первого из группы и ставить первым, сл. по списку

Msey, дело в том, что цикл тут не нужен, т.к. вышвыривается юнит после опр. действия и добавляется новый.

вообщем на действии это так: каждый созданный юнит заносится в группу, если число юнитов привысит число лимита (к примеру 5), то первый юнит удаляется из игры и из группы, а его место занимает второй по счету и так далее, до бесконечности
Старый 25.04.2012, 16:43
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Msey, ну автор сказал для 3 юнитов - для этих целей использовать цикл нецелесообразно
DaeDR, ты вообще извращенец?автор просит FirstOfGroup() - ты ему объясняешь про ForGroup().Вопрос - Зачем?
ну вообще способ с лупом ниже
local group Group = CreateGroup()
...
call GroupEnumUnitsInRange(Group,X,Y,120,null)
loop
set Picked = FirstOfGroup(Group)
exitwhen Secret_Pirouette_Filter(Caster,Picked) == true or Picked == null
call GroupRemoveUnit(Group,Picked)
endloop
...
call DestroyGroup(Group)
set Group = null
где Secret_Pirouette_Filter - функция,которая проверяет юнита на то что он подходит под "цели" как бы,возвращает boolean
Старый 25.04.2012, 16:44
Uncolo

offline
Опыт: 580
Активность:
Nerevar, я говорил "к примеру", а не конекретно 3х =))) на самом деле юнитов в десятки раз больше будет по факту

Это не то, что нужно. Поидее это ж только "разовая" группа, цикл заменил лишнее действие с группой и всего то.

Вот к примеру. В группе содержатся уже 10 юнитов. При добавлении 11го юнита - удаляется первый, а второй занимает местого первого. Суть этой фигни всей - не превышать число вызванных юнитов, а самого "старого" убирать, при переполнении группы.

Действие не по таймеру, не разовое, ЕнумГруп не нужно. На протяжении всей игры идет отлов. Чем то схоже с системой Суммон Лимит
Старый 25.04.2012, 17:00
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Uncolo:
вообщем на действии это так: каждый созданный юнит заносится в группу, если число юнитов привысит число лимита (к примеру 5), то первый юнит удаляется из игры и из группы, а его место занимает второй по счету и так далее, до бесконечности
ну дак его место и займет другой,если ты первого удалишь из группы действием FirstOfGroup
Старый 25.04.2012, 17:02
ScorpioT1000
Работаем
offline
Опыт: отключен
есть 3 юнита в группе (1, 2, 3), после удаления из группы первого, нужно присвоить 2ому юниту FirstOfGroup
это делается автоматически, для этого и есть эта функция. Она всегда возвращает актуально первого в данной группе.
Старый 25.04.2012, 17:03
Uncolo

offline
Опыт: 580
Активность:
ScorpioT1000, тоесть если удалить юнита этой функцией, то сл. за ним юнит станет первым в группе? если так, то у меня не работает =)

или я что то не то делаю. Раз автоматом присваиается FirstOfGroup, то каждый запрос по этой функции должен убирать юнита из группы, так? но дебаг возвращает Null, а с юнитом ничего не происходит

Код:
GroupRemoveUnit(GROUP, FirstOfGroup(GROUP))
GroupAddUnit(GROUP, u)
Старый 25.04.2012, 17:15
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Предоставь полный код функции,ибо дебага здесь как бы нету
Старый 25.04.2012, 17:19
Uncolo

offline
Опыт: 580
Активность:
Код:
globals
    private group GROUP = CreateGroup()
endglobals

private function addAction takes nothing returns boolean
    local unit u = GetSummoningUnit()
    local unit net = GetSummonedUnit()

    call GroupAddUnit(GROUP, net)
    
    if CountUnitsInGroup(GROUP) == 10
        call GroupRemoveUnit(GROUP, FirstOfGroup(GROUP))
        call RemoveUnit(FirstOfGroup(GROUP))

BJDebugMsg(GetUnitName(FirstOfGroup(GROUP)))
    endif
    
    set u = null    
    set net = null

    return false
endfunction

//===========================================================================

private function OnInit takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
       
    call Setup()   
       
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SUMMON, null )
        
        set i = i + 1
        exitwhen i == 16
    endloop
    
    call TriggerAddCondition(t, Condition(function addAction))
    
    set t = null
endfunction
Старый 25.04.2012, 17:25
prog

offline
Опыт: 32,865
Активность:
Uncolo, если у тебя фиксированное число юнитов, то можно немного извратиться и использовать массив, а чтобы не дергать его туда-сюда хранить индексы первого и последнего юнита и изменять их вместо копирования всего массива. Все усложняется ели юниты могут пропадать в порядке, отличном от того в котором их положили в массив - тогда необходимо предусмотреть счетчик таких "выпавших" из середины очереди юнитов и "сжатие" массива для заполнения пустот когда их становится слишком много.
  • GroupRemoveUnit уберет юнита из группы, но не удалит его из игры
  • заноси результат вызова FirstOfGroup в переменную и выполняй с ним действия
  • если FirstOfGroup возвращает null, а в группе заведомо есть еще юниты, попробуй удалять null из группы, когда-то это помогало
Старый 25.04.2012, 17:32
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
globals
    private group GROUP = CreateGroup()
endglobals

private function addAction takes nothing returns boolean
    local unit u = GetSummoningUnit()
    local unit net = GetSummonedUnit()
local unit d
    call GroupAddUnit(GROUP, net)
    
    if CountUnitsInGroup(GROUP) == 10
set d=FirstOfGroup(GROUP)
        call GroupRemoveUnit(GROUP,d)
        call RemoveUnit(d)

BJDebugMsg(GetUnitName(d))
    endif
    
    set u = null    
    set net = null
set d=null
    return false
endfunction

//===========================================================================

private function OnInit takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
       
    call Setup()   
       
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SUMMON, null )
        
        set i = i + 1
        exitwhen i == 16
    endloop
    
    call TriggerAddCondition(t, Condition(function addAction))
    
    set t = null
endfunction
Попробуй так
Старый 25.04.2012, 17:34
prog

offline
Опыт: 32,865
Активность:
call GroupRemoveUnit(GROUP, FirstOfGroup(GROUP))
call RemoveUnit(FirstOfGroup(GROUP))
это вообще шедеврально
ты удаляешь из группы юнита, а потом удаляешь из игры следующего за ним, не удалив из группы.
Старый 25.04.2012, 17:34
Uncolo

offline
Опыт: 580
Активность:
всем спасибо, зделал как нужно =))

нид клоуз
Старый 25.04.2012, 22:25
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 01:46.