Добавлен
Прочёл мануал по vJass, возникло несколько вопросов:
Например, если 2+ библиотеки имеют одинаковые названия функций, будут ли они конфликтовать? (если сделать их приватными)
Будут ли функции типа ивент работать в них? (если приватные/если нет)
раскрыть
function InitTrig_Skillz takes nothing returns nothing
    set gg_trg_Skillz = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Skillz, EVENT_PLAYER_UNIT_SPELL_FINISH) //<--
    call TriggerAddAction( gg_trg_Skillz, function Trig_Skills_Actions )
endfunction
хочу запихать спеллы каждого чара в либы и не делать 100500 гуишных триггеров, чтобы не путаться в них
и что значит static/constant/method/this?

Принятый ответ

Приватные функции различных библиотек не конфликтуют между собой, так как для таких функций компилятор устанавливает название НазваниеБиблиотеки__Название функции (после компиляции).
Ничто не мешает событию быть зарегистрированным (функция его регистрации для триггера работает ровно также, как и в любом другом месте кода).
static - общий объект для разных экземпляров структур (то есть, можно создать структуру Unit с публичными параметрами (то есть доступными для изменения извне, то есть не только структурными методами, а и функциями, не относящимися к ней, и статический счетчик кол-ва - целочисленную переменную, к которой каждая структура будет обращаться, чтобы увеличить или уменьшить счетчик при создании или удалении).
constant - переменная, которой присваивается значение лишь один раз без возможности его перезаписи.
method - функция внутри структуры, которая имеет право работать со структурными переменными (а если точнее - полями, если брать во внимание ООП), причем даже приватными, так как находится непосредственно внутри нее.
this - ссылка на структуру внутри метода (this.Mass = 80 - установит для данной структуры "массу" равной 80; это удобно, потому что так приходилось бы писать каждый раз myStruct.Mass = 80; myStruct.Height = 10, когда можно просто myStruct.SetParams (где уже обращение к ее переменным будет происходить через this)).
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
Steal nerves:
это объявление глобальных переменных, так используются и в обычном редакторе. только, если нужно создать свои, мы заходим в редактор переменных и создаем (хоть мы не видим код, а редактор переменных автоматом тип и название внесет в эту конструкцию, что ты выше написал). А в vjass и cjass мы можем объявлять свои переменные в любом участке кода, все что нужно, так это написать так это тип переменной и название переменной на английском.
пример
globals
тип и название переменной
unit U //пример
endglobals
глобальная переменная в отличии от локальной работает везде: в триггере, коде и др. Для всех игроков вроде общие. Не слышал об этом. Похоже, что, да, придется создавать массивы, чтобы у каждого был свой индекс массива.
чтобы создать массив пишут array
unit array U
для новичков
но нужно понимать, что все эти vjass и cjass - это для удобства, компилятор переведет его в обычный jass: все объявленные переменные в разных кусках перенесет наверх при компиляции, вон та же библиотека добавляет в main (главная функция карты) нужные функции, у структур наблюдаются изменения в имени переменных (добавляются в названии переменных и функции приставки от имени структуры и др) и прочее. Если новичок, бери прочитай мануал, потом что-то не понятно (библиотеки, структуры и др), бери пустую карту, напиши код, сохрани и компилируй код, потом архиватором вытащи j-файл, и в текстовике посмотри, сравни. Единственное что не привычно и сложно - синтаксис, ведь не знаешь, какими правилами и сочетаниями слов использовать, к примеру call можно не писать, вместо if endif скобочки и др.
ответ
всего нету
юзай гугл переводчик
вот частичный рус
ответ
Функшн поинтеров помимо типа code в жассе нет. Можно полагаться только на ExecuteFunc, куда аргументы передаются только глобалками, соответственно никакого тайпчекинга.
Использовать можно например так
struct mystruct
    static method mymethod takes nothing returns nothing
        call BJDebugMsg("this works")
    endmethod
endstruct

function myfunction takes nothing returns nothing
    call ExecuteFunc(mystruct.mymethod.name) //ExecuteFunc compatibility

    call OnAbilityCast('A000',mystruct.mymethod.name)
    //for example, caster system's OnAbilityCast, requires a function name
endfunction
Взято из vjass manual.
ответ
- Я использую это:
struct linkedList
        private  static  constant  timer     period  =  CreateTimer( )
        private                    thistype  prev
        private                    thistype  next


        private stub method destroy takes nothing returns nothing

//          Здесь должен находится Ваш код.

            set  this.prev.next  =  this.next
            set  this.next.prev  =  this.prev

            if ( thistype( 0 ).next == 0 ) then
                call PauseTimer( thistype.period )
            endif

            call thistype.deallocate( this )
        endmethod


        private static method iterate takes nothing returns nothing
            local  thistype  this  =  thistype( 0 ).next

            loop
                exitwhen ( this == 0 )

//              Здесь должен находится Ваш код.

                call this.destroy( )

                set  this  =  this.next
            endloop
        endmethod


        private static method create takes nothing returns thistype
            local  thistype  this  =  thistype.allocate( )

            set  this.next         =  thistype( 0 )
            set  this.prev         =  thistype( 0 ).prev
            set  this.next.prev    =  this
            set  this.prev.next    =  this

//          Здесь должен находится Ваш код.
            
            if ( this.prev == 0 ) then
                call TimerStart( thistype.period, 0.03125, true, function thistype.iterate )
            endif

            return this
        endmethod


    endstruct
static method create takes nothing returns nothing
static method iterate takes nothing returns nothing
method destroy takes nothing returns nothing
Для работы этого двусвязного списка требуется создать 2-е переменные с именами next, prev.
ответ
видиш верху со словом "Статьи" нажми его и найди jass и изучай.. За эту время освоиш

0
26
6 лет назад
0
если у вас возникли такие вопросы, то значит нужно еще раз прочитать мануал, только на этот раз вдумчиво и внимательно
1
13
6 лет назад
1
Приватные функции различных библиотек не конфликтуют между собой, так как для таких функций компилятор устанавливает название НазваниеБиблиотеки__Название функции (после компиляции).
Ничто не мешает событию быть зарегистрированным (функция его регистрации для триггера работает ровно также, как и в любом другом месте кода).
static - общий объект для разных экземпляров структур (то есть, можно создать структуру Unit с публичными параметрами (то есть доступными для изменения извне, то есть не только структурными методами, а и функциями, не относящимися к ней, и статический счетчик кол-ва - целочисленную переменную, к которой каждая структура будет обращаться, чтобы увеличить или уменьшить счетчик при создании или удалении).
constant - переменная, которой присваивается значение лишь один раз без возможности его перезаписи.
method - функция внутри структуры, которая имеет право работать со структурными переменными (а если точнее - полями, если брать во внимание ООП), причем даже приватными, так как находится непосредственно внутри нее.
this - ссылка на структуру внутри метода (this.Mass = 80 - установит для данной структуры "массу" равной 80; это удобно, потому что так приходилось бы писать каждый раз myStruct.Mass = 80; myStruct.Height = 10, когда можно просто myStruct.SetParams (где уже обращение к ее переменным будет происходить через this)).
Принятый ответ
0
17
6 лет назад
Отредактирован N1ghtSiren
0
Пушистый:
method - функция внутри структуры, которая имеет право работать со структурными переменными (а если точнее - полями, если брать во внимание ООП), причем даже приватными, так как находится непосредственно внутри нее.
this - ссылка на структуру внутри метода (this.Mass = 80 - установит для данной структуры "массу" равной 80; это удобно, потому что так приходилось бы писать каждый раз myStruct.Mass = 80; myStruct.Height = 10, когда можно просто myStruct.SetParams (где уже обращение к ее переменным будет происходить через this)).
т.е. имея вначале
local unit u
мы можем спустя несколько действий сделать
this.u = FirstOfGroup(g) 
//что равно
set u=FirstOfGroup(g)
?
плохой пример :c
0
28
6 лет назад
0
struct SomeStruct
    unit u

    method someMethod takes unit k returns nothing
        set u = k // set this.u = k
    endmethod

    static method someStaticMethod takes thistype this, unit k returns nothing
        set u = k // set this.u = k
    endmethod
endstruct
...
function funct takes nothing returns nothing
    local SomeStruct str = SomeStruct.create()
    local SomeStruct the = SomeStruct.create()
    call str.someMethod(CreateUnit(Player(0), 'hfoo', 0., 0., 0.))
    call SomeStruct.someStaticMethod(the, CreateUnit(Player(0), 'hfoo', 0., 0., 0.))
endfunction
мы можем спустя несколько действий сделать
Не понял, что ты хочешь сделать.
3
21
6 лет назад
3
this - это название локальной переменной, которая указывает на ячейку массива. В нестатичных методах это переменная передаётся сама:
method myMethod takes nothing returns nothing
call KillUnit( this.u )
endmethod
function myMethod takes integer this returns nothing
call KillUnit( u[ this ] )
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.