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

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

Ответ
 
denonlink

offline
Опыт: 1,112
Активность:
Multiple Functions на JASS (unit group/for each integer)
У меня возникла проблема.
Создаю спелл, который будет в течении десяти секунд демажить всех окружающий врагов раз в секунду. На триггерах все работает.

Код:
Unit Group - Pick every unit in (Units within 512.00 of (Position of (Casting unit))) and do (Actions)
    Loop - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                ((Owner of (Picked unit)) is an ally of (Owner of (Casting unit))) Equal to False
                ((Picked unit) is A structure) Equal to False
            Then - Actions
                Unit - Cause (Casting unit) to damage (Picked unit), dealing <столькото> damage of attack type Spells and damage type Normal
                Special Effect - Create a special effect attached to the overhead of (Picked unit) using Abilities\Spells\Orc\FeralSpirit\feralspirittarget.mdl
            Else - Actions


Все это в лупе 10 раз с задержкой 1 секунду. Работает.
Решил испробовать локальные переменные.

Код:
cs: local unit u
set JASS_Unit <глобальная переменная> = Casting Unit
cs: set u = udg_JASS_Unit


Работает. В локальной переменной u теперь хранится наш кастинг юнит.
Теперь самое сложное - использовать его в самом триггере.ъ
Я использую WEU, всемто Casting Unit использую Advanced - JASS code(u).
в обычных действиях все всегда отлично работало, но в цикле Pick every unit появляется ошибка.

Я пока в Jass'е не мастер, но конвертировал триггер в текст.
Цикл Pick every unit описывается как отдельная функция, к которой обращается основная:
Код:
function <название функции> takes nothing returns nothing

И в этой функции используется переменная u. Но она локальная. и в этой функции не работает.
Я знаком с программированием, программировал в delphi и понимаю суть проблемы, но не знаю как это реализовать на Jass'е.
Я так понимаю что нужно создать функцию с внутренними параметрами. Как это сделать?
Как реализовать? Что сделать чтобы все нормально работало?
Подскажите, желательно готовый код(в ответ на форуме) и обьяснения что к чему.

И еще:
1. Триггер - If/then/else - multiple functions - как эти multiple functions сделать на джассе, сразу несколько условий(действия и else я разобрался).
2. Как описать вот эти два условия на конкретном примере? Причем как впихнуть второе условие - я с ним долго голову ломал? Я видел какое оно в джасс-коде? Как return ((Picked unit) is A structure) присвоить в какую-нить болеан(естественно)-переменную?
Код:
((Owner of (Picked unit)) is an ally of (Owner of (Casting unit))) Equal to False
 ((Picked unit) is A structure) Equal to False

3. loop - endloop(или как там его?:)
Как описывать условия эндлупа? Допустим при а=10? или если булеан-переменная равна false(если юнит умер - прекратить цикл)?
4. Что значит takes nothing returns nothing? Какие варианты кроме этого могут быть при описании функции? takes - это параметры функции, которые берутся извне? returns - это чтобы функция возвращала значение? Как это описать в функции чтобы эти takes и returns работали как положено?

Все напишите на джассе, пожалуйста, я думаю что это поможет многим, не только мне, разобраться с функциями.
Заранее спасибо.
Старый 27.02.2008, 11:12
adic3x

offline
Опыт: 107,539
Активность:
Код:
1)
if true then
elseif true then
elseif true then
else
endif

2)
constant native IsUnitType          takes unit whichUnit, unittype whichUnitType returns boolean

3)
loop
 exitwhen true
endloop

4)
function MyFunc takes unit u, integer int returns boolean
 return false
endfunction
Старый 27.02.2008, 11:50
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
denonlink, советую в первую очередь прочитать Осваиваем JASS, для того, чтобы получить основные знания по джассу.
Насчет переноса значений локальных переменных в другие функции - Game Cache + JASS
Старый 27.02.2008, 11:54
denonlink

offline
Опыт: 1,112
Активность:
ADOLF
А можно первый и второй пункты немного обьяснить - я не совсем понял...
Старый 27.02.2008, 12:11
J
expert
offline
Опыт: 48,747
Активность:
1)
Код:
if УСЛОВИЕ А then
    //Действия если УСЛОВИЕ А верну
elseif УСЛОВИЕ Б then
    //Действия если УСЛОВИЕ А неверно, а УСЛОВИЕ Б верно
elseif УСЛОВИЕ В then
    //Действия если условие А и Б неверно, а В верно
else
    //Действия если условия А, Б и В неверны
endif

2)
Нативе функция
Код:
constant native IsUnitType takes unit whichUnit, unittype whichUnitType returns boolean

эта функция возвращает бул.
Первый параметр это юнит которого проверяем, а второй пораметр это любая из этих переменных
Код:
constant unittype UNIT_TYPE_HERO                        = ConvertUnitType(0)
    constant unittype UNIT_TYPE_DEAD                        = ConvertUnitType(1)
    constant unittype UNIT_TYPE_STRUCTURE                   = ConvertUnitType(2)

    constant unittype UNIT_TYPE_FLYING                      = ConvertUnitType(3)
    constant unittype UNIT_TYPE_GROUND                      = ConvertUnitType(4)

    constant unittype UNIT_TYPE_ATTACKS_FLYING              = ConvertUnitType(5)
    constant unittype UNIT_TYPE_ATTACKS_GROUND              = ConvertUnitType(6)

    constant unittype UNIT_TYPE_MELEE_ATTACKER              = ConvertUnitType(7)
    constant unittype UNIT_TYPE_RANGED_ATTACKER             = ConvertUnitType(8)

    constant unittype UNIT_TYPE_GIANT                       = ConvertUnitType(9)
    constant unittype UNIT_TYPE_SUMMONED                    = ConvertUnitType(10)
    constant unittype UNIT_TYPE_STUNNED                     = ConvertUnitType(11)
    constant unittype UNIT_TYPE_PLAGUED                     = ConvertUnitType(12)
    constant unittype UNIT_TYPE_SNARED                      = ConvertUnitType(13)

    constant unittype UNIT_TYPE_UNDEAD                      = ConvertUnitType(14)
    constant unittype UNIT_TYPE_MECHANICAL                  = ConvertUnitType(15)
    constant unittype UNIT_TYPE_PEON                        = ConvertUnitType(16)
    constant unittype UNIT_TYPE_SAPPER                      = ConvertUnitType(17)
    constant unittype UNIT_TYPE_TOWNHALL                    = ConvertUnitType(18)    
    constant unittype UNIT_TYPE_ANCIENT                     = ConvertUnitType(19)
    
    constant unittype UNIT_TYPE_TAUREN                      = ConvertUnitType(20)
    constant unittype UNIT_TYPE_POISONED                    = ConvertUnitType(21)
    constant unittype UNIT_TYPE_POLYMORPHED                 = ConvertUnitType(22)
    constant unittype UNIT_TYPE_SLEEPING                    = ConvertUnitType(23)
    constant unittype UNIT_TYPE_RESISTANT                   = ConvertUnitType(24)
    constant unittype UNIT_TYPE_ETHEREAL                    = ConvertUnitType(25)
    constant unittype UNIT_TYPE_MAGIC_IMMUNE                = ConvertUnitType(26)
Старый 27.02.2008, 14:13
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Код:
constant native IsUnitType takes unit whichUnit, unittype whichUnitType returns boolean

при использовании сравнивать с true обязательно, то есть:
Код:
IsUnitType(u, type) == true
Старый 27.02.2008, 16:26
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
df Hunter
Обязательно? Почему?
Старый 27.02.2008, 16:38
denonlink

offline
Опыт: 1,112
Активность:
Jon
elseif так и пишется вместе?
и хватит ли одного endif на все if?

я еще: как вот этот бул, который возвращает функция constant native IsUnitType takes unit whichUnit, unittype whichUnitType returns boolean записать в какую-нить переменную?
мож я торможу но вре равно не понял)
Старый 27.02.2008, 17:04
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Сообщение от DFlyer
df Hunter
Обязательно? Почему?

баг такой, если будешь сравнивать без тру, то есть if IsUnitType(u,type) then то он false возвращает
Старый 27.02.2008, 17:21
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
denonlink
elseif пишется вместе.
endif - всегда один.
Чтоб записать в переменную:
Код:
set var = IsUnitType(u, type)
// var - переменная булевого типа
Старый 27.02.2008, 17:32
denonlink

offline
Опыт: 1,112
Активность:
О. Вот так понятно сразу. Огромное спасибо, буду делать спелл и читать мануалы) Скоро и скришоты карты покажу:) Скучно точно не будет ;)
Старый 27.02.2008, 17:39
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Сообщение от DFlyer
denonlink
elseif пишется вместе.
endif - всегда один.
Чтоб записать в переменную:
Код:
set var = IsUnitType(u, type)
// var - переменная булевого типа


Цитата:
Сообщение от df Hunter
Код:
constant native IsUnitType takes unit whichUnit, unittype whichUnitType returns boolean

при использовании сравнивать с true обязательно, то есть:
Код:
IsUnitType(u, type) == true

!!!
Старый 27.02.2008, 18:52
Ответ

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

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

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

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



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