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

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

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

offline
Опыт: 483
Активность:
Не понятное поведение директивы define
Привет,
Писал абилку и заметил не объяснимое с моей т.зр. поведение директивы define.
Вместо деления вызывается умножение:
define fPushDistanceACount = fPushDistance / fMaxTimerFiredCount
Весь код ниже.
globals
    define      iHaMax = 12
    define      fHaPushTimerPeriod = 0.05
    define      fMaxPushTime = 1.   // in seconds
    define      fMaxTimerFiredCount = fMaxPushTime / fHaPushTimerPeriod
    define      fPushDistance = 300.
    // У МЕНЯ ТУТ ПРОБЛЕМА. ВМЕСТО ДЕЛЕНИЕ 300 / 20 выполняется УМНОЖЕНИЕ
    // И результат получается 6000 вместо 15
    define      fPushDistanceACount = fPushDistance / fMaxTimerFiredCount

    int         iHaActiveSpellsCount = 0
    timer array taHaTimers[iHaMax]
    unit array  uaHaCasters[iHaMax]
    float array faHaCastersFacings[iHaMax]
    unit array  uaHaTargets[iHaMax]
    int array   iaHaTimerFiredCount[iHaMax]
    
endglobals

bool HaPushConditions()
{
    if ( !(GetSpellAbilityId() == 'A002') )
    {
        return false
    }
    
    return true
}

int FindTimerCount( timer t)
{
    int count = 0
    while ( count < iHaActiveSpellsCount )
    {
        if ( taHaTimers[count] == t )
        {
            return count
        }
        
        count++
    }
    
    return -1
}

void HaPushPushingActions()
{
    BJDebugMsg("Horrant Push Actions")
    BJDebugMsg(R2S(fPushDistance))
    BJDebugMsg(R2S(fMaxTimerFiredCount))
    BJDebugMsg(R2S(300. / 20.))

    // ТУТ ПРОБЛЕМА. ВМЕСТО ДЕЛЕНИЕ 300 / 20 выполняется УМНОЖЕНИЕ
    // И результат получается 6000 вместо 15
    BJDebugMsg(R2S(fPushDistance / fMaxTimerFiredCount))
    BJDebugMsg(R2S(fPushDistanceACount))

    timer currentTimer = GetExpiredTimer()    
    int count = FindTimerCount(currentTimer)
    unit caster = uaHaCasters[count]
    unit target = uaHaTargets[count]
    int firedCount = iaHaTimerFiredCount[count]
    float casterFacing = faHaCastersFacings[count]
    float pushAngle = casterFacing + 90
    
    SetUnitPosition( target\
                    , GetUnitX( target ) + fPushDistanceACount * CosBJ( pushAngle )\
                    , GetUnitY( target ) + fPushDistanceACount * SinBJ( pushAngle ) )
    
    if ( firedCount > fMaxTimerFiredCount )
    {
        uaHaCasters[count] = null
        uaHaTargets[count] = null
        taHaTimers[count] = null
        iaHaTimerFiredCount[count] = 0
        faHaCastersFacings[count] = 0.
        
        currentTimer = null
        caster = null
        target = null
        DestroyTimer( currentTimer )
        return
    }
    
    currentTimer = null
    caster = null
    target = null
    iaHaTimerFiredCount[count]++
    return
}

void HaPushEffectActions()
{
    timer t = new timer
    iaHaTimerFiredCount[iHaActiveSpellsCount] = 0
    taHaTimers[iHaActiveSpellsCount] = t
    uaHaCasters[iHaActiveSpellsCount] = GetTriggerUnit()
    faHaCastersFacings[iHaActiveSpellsCount] = GetUnitFacing( GetTriggerUnit() )
    uaHaTargets[iHaActiveSpellsCount] = GetSpellTargetUnit()
    iHaActiveSpellsCount++
    
    TimerStart( t, fHaPushTimerPeriod, true, function HaPushPushingActions )
}

//===========================================================================
void InitTrig_Horrant()
{
    gg_trg_Horrant = new trigger
    
    TriggerRegisterAnyUnitEventBJ( gg_trg_Horrant, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    TriggerAddCondition( gg_trg_Horrant, Condition( function HaPushConditions ) )
    TriggerAddAction( gg_trg_Horrant, function HaPushEffectActions )
}
В итоге всего этого смещение получается слишком большое, юнит вылетает за пределы карты и получается крэш.
Старый 13.04.2011, 17:02
agentex

offline
Опыт: 34,834
Активность:
XGM Forum > Warcraft> Академия: форум для вопросов> Jass
define
в жассе нету никаких дефайн (подсказка: вопрос надо задавать в теме cJaсса)
и вобще дефайн внутри глобалз - бред какойто (хотя мб в сижассе так и есть)
Старый 13.04.2011, 17:05
Nekit1234007

offline
Опыт: 11,916
Активность:
Ты не понял, как работает дефайн.
Миниатюры
Кликните на картинку для увеличения
Название:  itsok.png
Просмотров: 33
Размер:  42.3 Кбайт  
Старый 13.04.2011, 17:08
Revion

offline
Опыт: 483
Активность:
Nekit1234007, Ааааа! Теперь всё понятно.
Спасибо.
Затуп...
Тему можно закрывать
Старый 13.04.2011, 17:19
Закрытая тема

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

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

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

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



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