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

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

Ответ
 
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Команда return совсем прерывает выполнение функции?
Вот например есть такой кусок тригера

Код:
function Trig_Flamethrower_Actions takes nothing returns nothing
local unit u
local effect array s
local integer i
local real a
local location p

if ( GetUnitTypeId(GetAttacker()) != udg_Ft) then
       return
   else
       call DoNothing(  )
   endif

    set u = GetAttacker()
    set a = ( AngleBetweenPoints(GetUnitLoc(GetAttacker()), GetUnitLoc(GetAttackedUnitBJ())))
set p = GetUnitLoc(u)
call MoveLocation(p, GetLocationX(p) + 50 * CosBJ(a), GetLocationY(p) + 50 * SinBJ(a))
    set i=0
loop
 exitwhen i>4      
set i=i+1
...
endfunction


команда return прерывает выполнение if или всю функцию?
Старый 06.03.2008, 16:05
J
expert
offline
Опыт: 48,747
Активность:
всю
Старый 06.03.2008, 16:07
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
call DoNothing( )

ее юзать ненадо... и елсе ненадо, просто if <bool> then ... endif ... и вообще код невнятный)
Старый 06.03.2008, 16:57
J
expert
offline
Опыт: 48,747
Активность:
happy_horror было лучше бы сделать так:
Код:
function AngleBetweenCord takes real AX, real AY, real BX, real BY returns real
    return bj_RADTODEG * Atan2(BY - AY, BX - AX)
endfunction

function Trig_Flamethrower_Actions takes nothing returns nothing
    local unit u = GetAttacker()
    local effect array s
    local integer i = 0         
    local real X = GetUnitX(u) + 50 * Cos(a * bj_DEGTORAD)
    local real Y = GetUnitY(u) + 50 * Sin(a * bj_DEGTORAD)
    local real a  = AngleBetweenCord(X, Y, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()))
    if GetUnitTypeId(u) != udg_Ft then
        return
    endif
    loop
        exitwhen i>4
        set i = i + 1
        ...
endfunction
Старый 06.03.2008, 17:01
adic3x

offline
Опыт: 107,539
Активность:
degres невтему, мало что что я еще невкуриваю, че ты к переменной обращаешься до ее обьявления=/

ADOLF добавил:
просто смысл переводить в дегресы что бы потом для косинуса переводить обратно в радианы, это типочное ТТ
Старый 06.03.2008, 17:24
J
expert
offline
Опыт: 48,747
Активность:
Код:
function AngleBetweenCordRad takes real AX, real AY, real BX, real BY returns real
    return Atan2(BY - AY, BX - AX)
endfunction

function Trig_Flamethrower_Actions takes nothing returns nothing
    local unit u = GetAttacker()
    local effect array s
    local integer i = 0
    local real a  = AngleBetweenCordRad(X, Y, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit())) 
    local real X = GetUnitX(u) + 50 * Cos(a)
    local real Y = GetUnitY(u) + 50 * Sin(a)
    if GetUnitTypeId(u) != udg_Ft then
        return
    endif
    set a = a * bj_RADTODEG
    loop
        exitwhen i>4
        set i = i + 1
        ...
endfunction

доволен?
Старый 06.03.2008, 17:30
adic3x

offline
Опыт: 107,539
Активность:
конечно нет) какого AngleBetweenCordRad(X, Y... если они не обьявлены?

ADOLF добавил:
Цитата:
AngleBetweenCordRad

вобще снеси ее... встявляй атан в код и будешь намного щасливее...
Старый 06.03.2008, 17:36
J
expert
offline
Опыт: 48,747
Активность:
))) да пох короче, я не в настроении)
Старый 06.03.2008, 17:37
Toadcop

offline
Опыт: 53,013
Активность:
Jon тогда не пиши...
Старый 06.03.2008, 17:39
J
expert
offline
Опыт: 48,747
Активность:
фсе щастливы...
Код:
function Trig_Flamethrower_Actions takes nothing returns nothing
    local unit u = GetAttacker()
    local effect array s
    local integer i = 0     
    local real X = GetUnitX(u)
    local real Y = GetUnitY(u)    
    local real a  = Atan2(GetUnitY(GetTriggerUnit()) - Y, GetUnitX(GetTriggerUnit()) - X)
    if GetUnitTypeId(u) != udg_Ft then
        return
    endif       
    set X = X + 50 * Cos(a)
    set Y = Y + 50 * Sin(a)
    set a = a * bj_RADTODEG
    loop
        exitwhen i>4
        set i = i + 1
        ...
endfunction


Jon добавил:
Toadcop неопотным модерам нужно научится чистить ненужные посмты)
Старый 06.03.2008, 17:44
adic3x

offline
Опыт: 107,539
Активность:
угу, всеравно неправильно... вы конечно можете сказать что я ммм... придираюсь к мелочам, но имхо это не мелочи)

я конечно не знаю какой шанс что if GetUnitTypeId(u) != udg_Ft then вернет правду, но если даже 25% то зачем вычислять то тогда?! т.е. если мы сначала проверим тип юнита, мы секономим кучу производительности!

я не говорю про данный пример конкретно, тут не того обьема, но с другой стороны кодер, который привык кодить аля тяп ляп (это я ща не про тебя ^^ не пиши мне в пс что я неправ, плз) когда возметься за нормальную задачу у него толком ниче не выйдет))) как бы я реализовал этот код
Код:
function flameTowerStart takes unit u returns nothing
 ... // тут уже идет код
endfunction

function flameTower takes nothing returns nothing
 if GetUnitTypeId(GetAttacker())==udg_Ft then
  call flameTowerStart(GetAttacker())
 endif
endfunction


set a = a * bj_RADTODEG такое ощущение, что ты влюблен в дегресы, чесслово))) ну а если потом надо создавать теже еффекты по поляркам? =/

и еще, Jon может не обнулять свои локалки, это его вопросы, и доказывать ему я ничего не собераюсь (ибо бесмысленно, кроме обвиненей я ничего не получу) но всем остальным я крайне рекомендую обнулять локалки!!!
Старый 07.03.2008, 11:16
J
expert
offline
Опыт: 48,747
Активность:
там в конце стоит
Цитата:
...

я не эекстрасенс и не берусь предугодять что идет дальше, потому решил оставить нужныен значения переменых более мение приемлемыми... но это так к слову...
и может дальше идет сверх тверение гениальной человеческой мысли, и локалки всеже обнуляются ^^

вот видиш, ты сам понимаеш что это мелочи) вообщем скажу только самое главное правило мироздания заключается в том что не нужно оптимизировать все и вся, и даже утечка в 100 обьектов в триггере спеле АпСоЛюТнО не как не повлияют на игру, и я думаю несогласятся со мной не более нескольких человек которых мы все знаем... да и от темы мы отклонились уж больно сильно, думаю пора зарыть ее...

Отредактировано Jon, 07.03.2008 в 13:23.
Старый 07.03.2008, 13:03
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
придираюсь к мелочам, но имхо это не мелочи)

Цитата:
вот видиш, ты сам понимаеш что это мелочи)

TT =) нет, я просто говорю что если есть возможность сделать хорошо, и при этом не будет сложнее/дольше то надо делать именно хорошо
Цитата:
и даже утечка в 100 обьектов в триггере спеле

повлияют... ой как повлияют... ахха, и после этого ты пишешь что ты не екстрасенс)))

а вообще афтор спрашивал как правильно реализовать спелл, я в 11 посту написал, что ретурн впринципе не нужен, лучше делать так...
Старый 07.03.2008, 21:48
Ответ

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

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

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

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



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