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

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

Закрытая тема
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Мучает вопрос про обнуление
((кат Код
private void GroupAction(group g,unit u){
        unit e = null
        GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),Range,null)
        do{
            e = FirstOfGroup(g)
            exitwhen e == null
            if IsUnitEnemy(e,GetOwningPlayer(u)) && !IsUnitType(u,UT){
                unit d = CreateUnit(GetOwningPlayer(u),cId,GetUnitX(e),GetUnitY(e),0)
                UnitApplyTimedLife(d,bId,TimeLife)
                IssueTargetOrder(d,Order,e)
                d = null
                DestroyEffect(AddSpecialEffectTarget(eId2,e,attach))
                UnitDamageTarget(u,e,DMG,false,false,AT,DT,WT)
            }
            GroupRemoveUnit(g,e)
        }
        DestroyGroup(g)
    }


....
GroupAction(LoadGroupHandle(h,id,2),u) //Вызов функции
....
))
Итак вы видите функцию,меня мучает вопрос d = null куда вставлять в цикл или нет,и нужно ли обнулять переменные g,u и e?
ведь цикл выходит когда e = null
Старый 20.04.2012, 12:04
DaeDR

offline
Опыт: 8,074
Активность:
d = null в самый конец можно сразу после цикла
g,e конечно надо
DaeDR добавил:
ведь цикл выходит когда e = null
Хотя вот тут не уверен. Но обнуление лишним не будет
Старый 20.04.2012, 12:07
ScorpioT1000
Работаем
online
Опыт: отключен
говорил я адику, не надо разрешать объявления в любом месте, потому что появятся такие как ты, которые не понимают ничерта =)
private void GroupAction(group g,unit u){
        unit e = null
        unit d = null
        GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),Range,null)
        do{
            e = FirstOfGroup(g)
            exitwhen e == null
            if ( IsUnitEnemy(e,GetOwningPlayer(u)) && !IsUnitType(u,UT) ) {
                d = CreateUnit(GetOwningPlayer(u),cId,GetUnitX(e),GetUnitY(e),0)
                UnitApplyTimedLife(d,bId,TimeLife)
                IssueTargetOrder(d,Order,e)
                DestroyEffect(AddSpecialEffectTarget(eId2,e,attach))
                UnitDamageTarget(u,e,DMG,false,false,AT,DT,WT)
            }
            GroupRemoveUnit(g,e)
        }
        DestroyGroup(g)
        e = null
        d = null
}
Старый 20.04.2012, 12:11
Klop
Папа римский
offline
Опыт: 13,006
Активность:
ScorpioT1000, спс),g и u ненадо я так и подозревал)
Klop добавил:
а ведь можно было сделать при обьявлении переменной где попало компилирвоать её
в local unit d = null а не просто local unit d
Старый 20.04.2012, 12:14
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Klop, сJass, выходит не такой удобный как о нём говрят, ибо хер его знает как будет интерпретирован скрипт, хотя тем кто писал адикхелпер, наверное всё таки понятно...
Старый 20.04.2012, 12:16
ScorpioT1000
Работаем
online
Опыт: отключен
g и u ненадо
не надо, т.к. они автоматические, это есть в статьях:
Исключение – локальные переменные, которые являются параметрами функции. Они удаляются автоматически после выхода из функции.
Старый 20.04.2012, 12:20
Klop
Папа римский
offline
Опыт: 13,006
Активность:
ScorpioT1000, дал статью получил ещё вопросы
player это handle обнулять не надо не имеет никаких таблиц?
переменные создавать где душа пожелает можно boolean,integer и real?
Старый 20.04.2012, 12:34
ScorpioT1000
Работаем
online
Опыт: отключен
Значит, не до конца дочитал.
Стоит упомянуть, что некоторые вобще не содержат никаких таблиц хендлов, например, тип player. В Starcraft 2 этот тип заменили на int.
=\ ясно что не надо.
Старый 20.04.2012, 12:37
Klop
Папа римский
offline
Опыт: 13,006
Активность:
и вот это место
UnitDamageTarget(u,e,DMG,false,false,AT,DT,WT)
define{
...
private sId = 'A000'
private DMG = 100.*GetUnitAbilityLevel(u,sId)
...
}
если я добавлю переменную перед циклом
real dmg = DMG
так будет по мужецки не вызывать каждый раз в цикле умножение?
Klop добавил:
я конечно понимаю что так правильно но мне надо убедиться)
Старый 20.04.2012, 12:40
ScorpioT1000
Работаем
online
Опыт: отключен
Не надо так делать, это не переменная, это define, подставляет свое содержимое во время компиляции.
делай примерно так (если уж совсем красиво):
#define SPELLNAME_DAMAGE_K = 100.0
#define SPELLNAME_ID = 'A000'

void тут функция, тоже лучше начинать с spellname {
    real damage = SPELLNAME_DAMAGE_K * GetUnitAbilityLevel(u,SPELLNAME_ID)
// ...
    UnitDamageTarget(u, e, damage, ...
// ...
}
ну и ясно что spellname это имя твоего спелла
код выше это общепринятые нормы написания, большие буквы для констант в том числе
Старый 20.04.2012, 12:45
Klop
Папа римский
offline
Опыт: 13,006
Активность:
ScorpioT1000, спасибо тему можно закрывать)
только в твоём случае мой define переименовывается в DPL (Damage Per Level)
Старый 20.04.2012, 12:47
ScorpioT1000
Работаем
online
Опыт: отключен
Ну, я привык называть это коэффициентом, или множителем...
Старый 20.04.2012, 12:50
Doc

offline
Опыт: 63,163
Активность:
Как-бы адик хелпер сам все обнуляет, окда?
Старый 20.04.2012, 16:40
ScorpioT1000
Работаем
online
Опыт: отключен
Только новый ок нет?
Старый 21.04.2012, 00:38
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
ScorpioT1000, зачем e обнулять, он из цикла выходит при условии, что e==null, значит она уже обнулена, разве нет?
Старый 21.04.2012, 19:01
Закрытая тема

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

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

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

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



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