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

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

Закрытая тема
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
method, allocate, struct
allocate - что значит?
Пробовал написать спел волна силы
Примером для кода брал старый спел bee из библиотеки
Пытаюсь понять принцип если пункт не правильный объясните\скажите:
1)создается структура с таймером, который постоянно методом перебора двигает юнита из разных структур, если юнита в них нет то таймер останавливаться и очищаеться структура с помощью метода ондестрой
2)все происходит в структуре с помощью методов
3)В действиях создаеться структура, делается вызов к методу создающий юнита, и присваивающий переменные из действий
.allocate() вообще не понятно мне что эт =\
Вроде ясно, но тяжело понять работу переменных в разных методах итд
Постоянно смущает ".переменная"
Что в коде неправильно?
» code
scope A initializer Init 
include "cj_types_priv.j"
define {
private Radius = 200.00
}
globals
private boolexpr b = null
private group g = null
private unit TempU
endglobals
private struct Data
    static Data array D
    static integer count=0
    static timer tim=CreateTimer()
    unit u
    real a
    group g
    private bool UnitDamage() {
    unit u = GetFilterUnit()
    if not IsUnitInGroup(u,g) and IsUnitEnemy(u,GetOwningPlayer(.u)) then
    UnitDamageTarget(TempU,u,100.00,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
    GroupAddUnit(g,u)
    endif
    u=null
    return false }
    method OnDestroy takes nothing returns nothing
    KillUnit(.u)
    DestroyGroup(.g)
    .destroy()
    endmethod
    static method OnTimer takes nothing returns nothing
    integer i=0
    real x
    real y
    loop
    exitwhen i>=.count
        x=GetUnitX(.D[i].u)+30.00*Cos(.D[i].a)
        y=GetUnitY(.D[i].u)+30.00*Sin(.D[i].a)
        .D[i].r=.D[i].r+30.00
        if .D[i].r < 900.00 then //мап контейн коордс
            SetUnitX(.D[i].u,x) ; SetUnitY(.D[i].u,y)
	    TempU=.u
            GroupEnumUnitsInRange(.g,x,y,Radius,b)
        else
            .D[i].OnDestroy()
            .count=.count-1
            .D[i]=.D[.count]
            i=i-1
            if .count==0 then
                PauseTimer(.tim)
            endif
        endif
        i=i+1
    endloop
    endmethod
    static method OnCast takes real x,real y,real a returns nothing
    Data s=Data.allocate()
    s.u=CreateUnit(GetOwningPlayer(c),'hpea',x+50.00*Cos(a),y+50.00*Sin(a),a*bj_RADTODEG)
    s.a=a
    s.r=0.00
    s.g=CreateGroup()
    if .count==0 then
        call TimerStart(.tim,.035,true,function S.OnTimer)
    endif
    .Data[.count]=s
    .count=.count+1
    endmethod
endstruct
private void Act() {
unit u = GetTriggerUnit()
real x = GetUnitX(u)
real y = GetUnitY(u)
real a = Atan2(GetSpellTargetY()-y,GetSpellTargetX()-x)
OnCast(u,x,y,a)
u=null }
private bool Cond() { ; return GetSpellAbilityId() == 'A000' }
//===========================================================================
private void Init() {
    trigger t = CreateTrigger()
    TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(1),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(2),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(3),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(4),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(5),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(6),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(7),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(8),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(9),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerAddAction(t,function Act)
    TriggerAddCondition(t,function Cond)
    b = Condition(function UnitDamage)
    g = CreateGroup()
    t=null }
endfunction
endscope
У кого есть свободное время объясните, тк я тугодум еще тот..
Спасибо за прочтение

Отредактировано AlexKARASb, 19.06.2010 в 16:21.
Старый 19.06.2010, 16:15
XOR

offline
Опыт: 38,159
Активность:
прочитайте мануал vJass что ли .allocate() придает структуре уникальный ID, т.к. структура на самом деле просто интегер.
Старый 19.06.2010, 16:25
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
XimikS:
прочитайте мануал vJass что ли .allocate() придает структуре уникальный ID, т.к. структура на самом деле просто интегер.
а почему тогда я всегда юзаю .create() и ничего?
Старый 19.06.2010, 17:11
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
потому что это делается автоматически..в данном случае т.е.
вали читать мануал, пока тебя не поругали)
Старый 19.06.2010, 17:43
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
я недавно проводил тест ну так ради интереса после create / allocate в методе запускал debug функцию выводящую I2S(струтура). выводил 1; 2; 3; 4; ... во обоих случаях
Старый 19.06.2010, 19:19
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
код обновил но ошибку выдает
Expected a name
и вместо endglobals компилирует в endfunction -.-
» code
scope FireWave initializer Init 
include "cj_types_priv.j"

define {
private Radius = 200.00
private DummyId = 'h000' }

globals
private boolexpr b = null
private group G = null
private unit TempU = null
endglobals

private bool UnitDamage() {
    unit u = GetFilterUnit()
    if not IsUnitInGroup(u,g) and IsUnitEnemy(u,GetOwningPlayer(TempU)) then
        UnitDamageTarget(TempU,u,100.00,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
        GroupAddUnit(G, u)
    endif
    u=null
    return false }

private struct Data
    static Data array dd
    static integer count = 0 
    static timer tim = CreateTimer()
    unit u
    real a
    real r
    group g
    
    method OnDestroy takes nothing returns nothing
    KillUnit(.u)
    DestroyGroup(.g)
    .g=null
    .u=null
    .a=0.00
    .r=0.00
    .destroy()
    endmethod

    static method OnTimer takes nothing returns nothing
    integer i = 0
    real x = 0.00
    real y = 0.00
    loop
    exitwhen i >= .count
        x=GetUnitX(.dd[i].u)+30.00*Cos(.dd[i].a)
        y=GetUnitY(.dd[i].u)+30.00*Sin(.dd[i].a)
        .dd[i].r=.dd[i].r+30.00
        if .dd[i].r < 900.00 then
            SetUnitX(.dd[i].u, x) 
            SetUnitY(.dd[i].u, y)
            TempU = .dd[i].u
            GroupEnumUnitsInRange(.g, x, y, Radius, b)
        else
            .dd[i].OnDestroy()
            .count = .count - 1
            .dd[i] = .dd[.count]
            i = i - 1
            if .count == 0 then
                PauseTimer(.tim)
            endif
        endif
    i=i+1
    endloop
    endmethod

    static method OnCast takes unit u, real a returns nothing
        Data d = Data.allocate()
        d.u = u
        d.a = a
        d.r = 0.00
        d.g = CreateGroup()
        if .count==0 then
            TimerStart(.tim,0.035,true,function Data.OnTimer)
        endif
        .dd[.count] = d
        .count= .count + 1
    endmethod

endstruct

private void Act() {
unit u = GetTriggerUnit()
real x = GetUnitX(u)
real y = GetUnitY(u)
real a = Atan2(GetSpellTargetY()-y,GetSpellTargetX()-x)
unit dummy = CreateUnit(GetOwningPlayer(u),DummyId,x+50.00*Cos(a),y+50.00*Sin(a),a*bj_RADTODEG)
Data.OnCast(dummy,a)
u=null ; d=null }

private bool Cond() { ; return GetSpellAbilityId() == 'A000' }
//===========================================================================
private void Init() {
    trigger t = CreateTrigger()
    TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(1),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(2),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(3),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(4),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(5),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(6),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(7),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(8),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerRegisterPlayerUnitEvent(t,Player(9),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    TriggerAddAction(t,function Act)
    TriggerAddCondition(t,function Cond)
    b = Condition(function UnitDamage)
    G = CreateGroup()
    t=null }
endfunction
endscope
AlexKARASb добавил:
T_T я много уровневый болван
думаю почему endfunction мне выписывает ошибкой
писал на с и не заметил что в конце кода поставил и скобку и кодом энд >.<
Старый 19.06.2010, 22:03
XOR

offline
Опыт: 38,159
Активность:
Мне доподлинно неизвестно зачем юзать globals если юзаешь cJASS..
XimikS добавил:
Старый 19.06.2010, 22:20
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
XimikS, чисто личная привычка, так же как и: "хеш везде хеш всегда" :D
Для проверки оптимизации и наличия ошибок в законченом коде,
можно спросить и выложить код тут или же нужно создать новую тему?
[+] 1 пункт от Hellfim: 1.2 (учим русский язык)

Отредактировано AlexKARASb, 19.06.2010 в 22:32.
Старый 19.06.2010, 22:22
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
AlexKARASb, нельзя нигде спрашивать. Ищи сам, проводи тесты. Выставляют код и просят найти ошибку только идиоты, исключением является код, в котором 100% ошибка (работает не так, как надо), но автор уже голову разбил об стену, но ошибку не нашел. Оптимизацию ты должен проводить сам.
А насчет личной привычки это омг. Это дурная привычка, от таких избавляются, обычно.
Писать на сжассе методы внутри структуры это круто! Сжасс сам переводит функцию, написанную внутри структуры в метод (или сразу переводит в обычную Jass-функцию, но я в этом не уверен).
Старый 19.06.2010, 22:32
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Hellfim, вразумел.
Тогда тема исчерпала себя.
Благодарю всех за объяснения.
Можно закрыть.
Старый 19.06.2010, 22:36
Закрытая тема

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

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

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

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



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