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

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

Ответ
 
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
Даем басу под ДжаЗс
Стандартных функций ВЕ мне стало мало, и я полный оптимизма и решимости решил занятся изучением джасса.
Вопрос такой возник: можно ли использовать параметры функции в названии локальной переменной?
Тоесть примерно так:
function XxX takes integer n returns nothing
set c(n) = GetLastCreatedUnit()
и тд и тп
endfunction
Просто у меня несколько дамми кастеров, каждый в своей лок переменной с1 с2 с3 и тд, выполняют одни и теже действия, хотел так сократить код.

Отредактировано Mefist, 08.12.2005 в 22:52.
Старый 08.12.2005, 22:45
NETRAT

offline
Опыт: 83,712
Активность:
Что-то не разу не видел, да и фичу не понял, если в С такого нет, то в Жассе и подавно...
Старый 08.12.2005, 23:45
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Mefist, некорректно ставишь вопрос. Не понимаю, что ты имеешь ввиду.
Переменная есть переменная. Ее название нужно только для того, чтобы к ее содержимому можно было обратиться. Больше с названием ничего делать нельзя.
В твоем примере вообще нету локальных переменных, а c(n) - я вообще не понял, что это такое. То ли массив, то ли функция...
Старый 09.12.2005, 15:39
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
Не привык я еще ко всему этому ...
Это я написал функцию изковерканную и не полною
Вообщем так:
у меня есть 4 лок переменные: c1 c2 c3 c4. Можно ли сделать так, чтобы цифра ставилась в зависимости от аргумента? Тоесть, если аргумент 1 была переменная с1, если 2 - с2 и тд. Только не if/then
Старый 09.12.2005, 15:45
tysch_tysch
Работаем
offline
Опыт: отключен
аргумент чего? Если я правильно понял, то в данном примере : c(n) у тебя н "аргумент"
массив или if\then, других вариантов нет
интересно что я такой вопрос ставил года полтора назад. только про названия регионов=)
Старый 09.12.2005, 15:50
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Mefist, я понял о чем ты. Нет, такого нельзя. В лучшем случае, можно обращаться к функции по имени, да и то только в некоторых случаях.
Проще сделать локальный массив с b и в зависимости от переменной i обращаться к c[i]
Старый 09.12.2005, 16:12
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
Эм, а как массив создать? И где есть список функций? В Blizzard.j?
Старый 09.12.2005, 16:22
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Блин, кому я статьи писал? :) Там все это есть.
local array integer c
  • массив c типа integer
Т.е. можно вводить
c[1]
c[2]
c[3]
...
Целую кучу переменных с индексом.
Старый 09.12.2005, 16:26
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
сенкс, я только первую половину статьи прочитал =)
Старый 09.12.2005, 17:10
Iron
Листовой
offline
Опыт: 24,427
Активность:
Цитата:
Просто у меня несколько дамми кастеров, каждый в своей лок переменной с1 с2 с3 и тд, выполняют одни и теже действия, хотел так сократить код.

Насколько я понял, ты несовсем понимаешь что такое локальная переменная.
Если у тебя есть функция с локальной переменной, то при 2-ом 3-ем и т.д. запусках функции будет создаваться новая C, причем если 2-ой 3-ий и т.д. запуск функции будет производится еще до завершения работы функции предыдущих запусков, то всеравно C каждого запуска будут не равны.
Локальная переменная она на то и локальная, чтобы работать в пределах одного запуска функции, а на все остальное ей начхать.
А если ты имел ввиду, что тебе нужно в одной функции создать N-ное число локальных переменных, то лучше делать не одной функцией, а разбить на 2-е, тогда 1-ая будет получать число N и запускать 2-ую N раз, причем сделать так, чтобы на первый запуск она передала 2-ой функции 1-ого кастера, на 2-ой второго, ... ,на N-ный N-ного. И все будет тип-топ.

PS: Если я просто чего-то не понял, то не обижайся.
Старый 09.12.2005, 17:13
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
Да не, это я понимаю, там другая фигня была. Щас уже подругому думаю сделать

Mefist добавил:
Хм, а что это за ошибка?
Ругается на строки объявления переменной в Custom Script Code

function FNCast takes nothing returns nothing
local array integer c
local unit target
endfunction

Говорит: Expected a reserved type or handle type
Старый 09.12.2005, 20:00
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Насчет первого вопроса:
такое есть в Pascal - работа с пееременной "по адресу"
local integer array а не наоборот
Старый 09.12.2005, 21:54
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
С этим разобрался, но чертов скрипт всеравно не хочет нормально работать :) Хорошее начало.

Такой спелл:
Не геройский, 3 уровня. Кастуешь пустышку, и на <уровень+1> юнитов кастуется фрост нова, если цель простой юнит, то он умирает полюбому, если герой - только наносятся повреждение.

Делал так: Отлавливаешь каст, в переменную группа юнитов заносятся все потенциальные жертвы, поочереди создается <уровень+1> дамми кастеров, каждый выбирает себе цель, кастует нову и эта цель убирается из группы (чтобы несколько кастеров не выбрали одну и туже цель). При касте новы негерои убиваются.

Сам код
Код:
function Trig_FrostNova_Copy_2_Func003001003001 takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction

function Trig_FrostNova_Copy_2_Func003001003002 takes nothing returns boolean
    return ( IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetSpellAbilityUnit())) == true )
endfunction

function Trig_FrostNova_Copy_2_Func003001003 takes nothing returns boolean
    return GetBooleanAnd( Trig_FrostNova_Copy_2_Func003001003001(), Trig_FrostNova_Copy_2_Func003001003002() )
endfunction

function Trig_FrostNova_Copy_2_Actions takes nothing returns nothing
    local unit array c
    local unit target
if ( GetSpellAbilityId() == 'Acht' ) then
    call GroupAddGroup( GetUnitsInRangeOfLocMatching(512, GetUnitLoc(GetSpellAbilityUnit()), Condition(function Trig_FrostNova_Copy_2_Func003001003)), udg_FrostNovaTargets )
//
    call CreateNUnitsAtLoc( 1, 'hdhw', GetOwningPlayer(GetSpellAbilityUnit()), GetUnitLoc(GetSpellAbilityUnit()), bj_UNIT_FACING )
    set c[1] = GetLastCreatedUnit()
    set target = GroupPickRandomUnit(udg_FrostNovaTargets)
    call GroupRemoveUnitSimple( target, udg_FrostNovaTargets )
    call IssueTargetOrderBJ( c[1], "frostnova", target )
    if ( IsUnitType(target, UNIT_TYPE_HERO) == false ) then
        call KillUnit(target)
    else
    endif
//
    call CreateNUnitsAtLoc( 1, 'hdhw', GetOwningPlayer(GetSpellAbilityUnit()), GetUnitLoc(GetSpellAbilityUnit()), bj_UNIT_FACING )
    set c[2] = GetLastCreatedUnit()
    set target = GroupPickRandomUnit(udg_FrostNovaTargets)
    call GroupRemoveUnitSimple( target, udg_FrostNovaTargets )
    call IssueTargetOrderBJ( c[2], "frostnova", target )
    if ( IsUnitType(target, UNIT_TYPE_HERO) == false ) then
        call KillUnit(target)
    else
    endif
//
    if ( ( GetUnitAbilityLevelSwapped('Acht', GetSpellAbilityUnit()) >= 2 ) ) then
      set c[3] = GetLastCreatedUnit()
      set target = GroupPickRandomUnit(udg_FrostNovaTargets)
      call GroupRemoveUnitSimple( target, udg_FrostNovaTargets )
      call IssueTargetOrderBJ( c[3], "frostnova", target )
      if ( IsUnitType(target, UNIT_TYPE_HERO) == false ) then
        call KillUnit(target)
      else
      endif
    else
    endif
//
    if ( ( GetUnitAbilityLevelSwapped('Acht', GetSpellAbilityUnit()) >= 3 ) ) then
      set c[4] = GetLastCreatedUnit()
      set target = GroupPickRandomUnit(udg_FrostNovaTargets)
      call GroupRemoveUnitSimple( target, udg_FrostNovaTargets )
      call IssueTargetOrderBJ( c[4], "frostnova", target )
      if ( IsUnitType(target, UNIT_TYPE_HERO) == false ) then
        call KillUnit(target)
      else
      endif
    else
    endif
    call GroupClear( udg_FrostNovaTargets )
    call TriggerSleepAction( 10.00 )
    call RemoveUnit( c[1] )
    call RemoveUnit( c[2] )
    call RemoveUnit( c[3] )
    call RemoveUnit( c[4] )
    set c[1] = null
    set c[2] = null
    set c[3] = null
    set c[4] = null
    set target = null
else
endif
endfunction

//===========================================================================
function InitTrig_FrostNova_Copy_2 takes nothing returns nothing
    set gg_trg_FrostNova_Copy_2 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_FrostNova_Copy_2, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( gg_trg_FrostNova_Copy_2, function Trig_FrostNova_Copy_2_Actions )
endfunction


На первом уровне все работает как часы, а на втором и третем создаются то 4 то 3 то 2 кастера, раз на раз. В чем проблема?
Старый 10.12.2005, 00:50
NETRAT

offline
Опыт: 83,712
Активность:
советую еще добавить функцию DestroyGroup куда надо
в структурах
Код:
if () then
else
endif

не обязательно писать else

по сабжу - попробуй заносить GetSpellAbilityUnit() в переменную в самом начале триггера - ибо во время выполнения она может измениться, то же и с GetSpellAbilityId() - кажется трабла именно в этом, если не получится, кидай мапу, проверим

вместо
Код:
call CreateNUnitsAtLoc( 1, 'hdhw', GetOwningPlayer(GetSpellAbilityUnit()), GetUnitLoc(GetSpellAbilityUnit()), bj_UNIT_FACING )
        set c[1] = GetLastCreatedUnit()

лучше писать
Код:
set c[1] = CreateUnit(GetOwningPlayer(GetSpellAbilityUnit()),'hdhw',GetUnitX(GetSpellAbilit  yUnit()),GetUnitY(GetSpellAbilityUnit()),bj_UNIT_FACING)
Старый 10.12.2005, 02:48
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
Епрст, там такая тупая ошибка, я просто забыл для для 2 и 3 юнита действие создания кастера.
Старый 10.12.2005, 13:53
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
А как правильно оформлять Conditions And?
Я наверно тупой, но в BJ и CJ я просто ничего не понимаю
Старый 30.01.2006, 18:42
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
держи , возможно это писалось откровенно мне. Но думаю ты найдешь там некоторую систематизацию знаний в джасс.
Старый 31.01.2006, 06:26
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
это все я читал встатье
Старый 31.01.2006, 16:25
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
тук тук тук, ответте плз :)
Старый 31.01.2006, 22:35
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
if (true==true and true==true)
---
Так и будет : Суффикс "and"
-
Суффикс or , так и звучит : "or"

vlad_C0M добавил:
Mefist , это есть кстати в Серегиной статье.
Старый 02.02.2006, 12:31
Ответ

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

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

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

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



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