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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Нерабочая структура
Хотелось бы знать, что за проблема в следующем коде?
struct moving
    real x
    real y
    unit m
endstruct

function Trig_Attack2_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A002'
endfunction

function Checking takes nothing returns boolean
    return GetFilterUnit() != ololo[n]
endfunction

function Move takes nothing returns nothing
local moving data

call DisplayTimedTextToPlayer(Player(0), 0, 0, 3, GetUnitName(data.m))
    call GroupEnumUnitsInRange(g, GetUnitX(data.m), GetUnitY(data.m), 50, Condition(function Checking))
    
    if FirstOfGroup(g) == null then
        call SetUnitPosition(data.m, GetUnitX(data.m)+5*Cos(GetUnitFacing(data.m)*bj_DEGTORAD), GetUnitY(data.m)+5*Sin(GetUnitFacing(data.m)*bj_DEGTORAD))
    else 
        call SetUnitExploded(data.m, true)
        call RemoveUnit(data.m)
        call DestroyGroup(g)
        set g = null
    endif
    call data.destroy()

endfunction

function Trig_Attack2_Actions takes nothing returns nothing
local moving data = moving.create()
local timer t = CreateTimer()
local unit c = GetSpellAbilityUnit()
local unit mis = CreateUnit(Player(0), 'h004', GetUnitX(c), GetUnitY(c), GetUnitFacing(ololo[n]))
local real xc = GetUnitX(c)
local real yc = GetUnitY(c)
set data.x = xc
set data.y = yc
set data.m = mis
call DisplayTimedTextToPlayer(Player(0), 0, 0, 3, GetUnitName(data.m))

    call TimerStart(t, 0.3, true, function Move)

endfunction

//===========================================================================
function InitTrig_Attack2 takes nothing returns nothing
    set gg_trg_Attack2 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attack2, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Attack2, Condition( function Trig_Attack2_Conditions ) )
    call TriggerAddAction( gg_trg_Attack2, function Trig_Attack2_Actions )
endfunction
Старый 02.02.2010, 04:14
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
struct moving
    real x
    real y
    unit m
    
    static method create takes real x, real y, unit m returns moving
        local moving newStruct=moving.allocate()
        newStruct.x=x
        newStruct.y=y
        newStruct.m=m
        return newStruct
    endmethod
endstruct

function Trig_Attack2_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A002'
endfunction

function Checking takes nothing returns boolean
    return GetFilterUnit() != ololo[n]
endfunction

function Move takes nothing returns nothing
    А компьютер здесь сам за тебя находит юнита, да?
    local unit u=?????
    local moving data=GetUnitUserData(u)

call DisplayTimedTextToPlayer(Player(0), 0, 0, 3, GetUnitName(data.m))
    call GroupEnumUnitsInRange(g, GetUnitX(data.m), GetUnitY(data.m), 50, Condition(function Checking))

//Отсюда    
    if FirstOfGroup(g) == null then
        call SetUnitPosition(data.m, GetUnitX(data.m)+5*Cos(GetUnitFacing(data.m)*bj_DEGTORAD), GetUnitY(data.m)+5*Sin(GetUnitFacing(data.m)*bj_DEGTORAD))
    else 
//И до сюда - говно, которое нужно немедленно выпилить. Почитай, как выполнять действия над юнитами через энум.
        call SetUnitExploded(data.m, true)
        call RemoveUnit(data.m)
        call DestroyGroup(g)
        set g = null
    endif
    moving.destroy(data)
endfunction

function Trig_Attack2_Actions takes nothing returns nothing
local timer t = CreateTimer()
local unit c = GetSpellAbilityUnit()
local real xc = GetUnitX(c)
local real yc = GetUnitY(c)
local unit mis = CreateUnit(Player(0), 'h004', GetUnitX(c), GetUnitY(c), GetUnitFacing(ololo[n]))
local moving data = moving.create(x,y,mis)
call SetUnitUserData(mis,data)
call DisplayTimedTextToPlayer(Player(0), 0, 0, 3, GetUnitName(data.m))

    call TimerStart(t, 0.3, true, function Move)

endfunction

//===========================================================================
function InitTrig_Attack2 takes nothing returns nothing
    set gg_trg_Attack2 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attack2, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Attack2, Condition( function Trig_Attack2_Conditions ) )
    call TriggerAddAction( gg_trg_Attack2, function Trig_Attack2_Actions )
endfunction
Старый 02.02.2010, 04:40
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Откровенно говоря, я большую часть дернул с одного небезизвестного кода (кажеццо), который содержится в карте Arrow и имхо, я не вкуриваю, что за юнита я должен пихать в "local unit u" в "move", а также что за забавная вещь, эта GetUnitUserData(u)? Будь добр, объясни пжалста..А по поводу метода, я уже подумывал. И еще - что делает .allocate()?
Старый 02.02.2010, 04:51
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vampirrr, по порядку:
  1. Абсолютно все равно откуда ты дернул часть кода =)
  2. Ну а я-то откуда знаю твои цели... Универсальный вариант - занести юнита в массив/переменную. И доставать его оттуда.
  3. Это Custom Value в ГУИ. В данном случае мы записываем туда номер структуры, а потом достаем. Ещё есть вариант создать массив структур и искать там, но это... ммм... несколько глупо, когда можно сделать так =)
  4. .allocate() - выделяет уникальный номер структуре.
Старый 02.02.2010, 04:57
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
1, 3 и 4 понятно =) по поводу 2 - я не дошол, что за юнит туда должен помещаться..но собственно по моим догадкам это тот самый дамми-снаряд? И еще одно - по поводу того куска гофна, дай мне пожалста хоть наводку где искать + насколько я понимаю ты так предлагаешь заменить ЭнумВРейнже для ФорГруп?)
Старый 02.02.2010, 05:06
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Старый 02.02.2010, 05:16
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Спасибо) Ну и вопрос на засыпку (на сегодня) - мне лучше дамми этого через SCV передавать в функцию move или просто можно через глобалку?
Старый 02.02.2010, 05:23
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vampirrr, занеси его в глобалку. И зачем ты запускаешь периодический таймер, которой, кстати, потом не уничтожаешь, когда после первого же вызова функции ты и снаряд уничтожаешь и структуру?
Старый 02.02.2010, 05:26
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
эм..а как мне снаряд то перемещать, циклом? О_о да и вообще, я итак уже забыл почти все что знал(( P.S.: меня на данный момент больше интересует структура + само передвижение снаряда..На утечки на данный момент положил..
Старый 02.02.2010, 05:33
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vampirrr, ну тогда наверное не нужно снаряд и структуру уничтожать, м? +У тебя нету ограничения на движения. Дамми будет двигаться бесконечно.
Старый 02.02.2010, 05:45
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
дада) я впринципе собирался заносить этот таймер в глобальный массив, с таким же индексом как у дамми, после чего уничтожать и то и другое и обнулять..ну а время летания я уж как нибудь ограничу)) Я кстати не пойму, почему, когда я делаю тест, то ракетка выпускается и летит, но даже если я период ставлю в 0.03, она тупо летит со скоростью 0 целых, 1 блин милионная в секунду..Пока она пролетит хотя бы 300 по расстоянию, можно будет спокойно сходить чайку замутить..
Старый 02.02.2010, 05:50
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Народ? Проблема изложенная выше так и осталась нерешенной - скорость перемещения чрезвычайно низка даже при периоде в 0.03 секунды. Неужели причина в структуре? Вдобавок если выстрелить 2 снаряда подряд, первый зависает, а второй увеличивает свою скорость..Тем более как бы заношу снаряд в переменные под новыми индексами, т.е. теоретически они вообще должны независимо друг от друга летать =/

Отредактировано Vampirrr, 03.02.2010 в 05:42.
Старый 03.02.2010, 05:33
SRes
1110101000
offline
Опыт: 9,997
Активность:
Посоветую 2 вещи :
1) Добавить дебаг-сообщения (везде где только можно, отслеживай каждую функцию и каждую переменную), помогает на 99%.
2) Избавится от структур и переписать на хеше\параллельных массивах, без использования структур.
Старый 03.02.2010, 09:19
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Ппц, объясните тогда пожалуйста мне, идиоту, нафига же нужны эти структуры?
Старый 04.02.2010, 03:26
XOR

offline
Опыт: 38,159
Активность:
Это ооп в варе ) просто удобная связка переменных.
Старый 04.02.2010, 07:43
Nekit1234007

offline
Опыт: 11,916
Активность:
Не пойму, зачем тут вообще структура, если из неё используется только юнит?
Старый 04.02.2010, 07:58
SRes
1110101000
offline
Опыт: 9,997
Активность:
Vampirrr, Симуляция ООП, но толку от нее не так уж много, лучше написать самому, имхо.
Появись в аське к вечеру - я тебе все объясню.
Старый 04.02.2010, 09:26
agentex

offline
Опыт: 34,834
Активность:
local moving data
это что такое? Взял, обьявил локалку, не инициализировал ее, а потом работаешь с ней как ни в чем не бывало?
И да, не слушай еретиков. Структуры - прекрасная вещь
Старый 04.02.2010, 10:05
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
agentex, структуры - прекрасная вещь, если там более 2х значений хранится =)
Старый 04.02.2010, 12:31
agentex

offline
Опыт: 34,834
Активность:
почему, например структа где хранится x и y точки - отличная замена location (хоть и не особо нужная)
а у методов структур есть одно неоспоримое преимущество - их можно вызывать из любого участка кода, не парясь со всякими библиотеками.
Старый 04.02.2010, 12:59
Ответ

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

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

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

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



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