vJass модуль list

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Модуль небольшой, который вывел из модуля дока, за что credits ему.
Использует interface теперь, и теперь можно запускать хоть методы, хоть функции вне него, короче как вам удобнее.
Также добавил пример использования функции.
Какие приемущества перед другими модулями?
  1. Невесомый, и может использоваться абсолютно в любой структуре, даже не в спеллах
  2. Можно использовать в структуре которая может инициилизировать несколько спеллов (грубо говоря у вас одна структура на все тригерные магии)
vJass
function interface push takes integer this returns nothing defaults nothing
//! nocjass
module list
    readonly static thistype array data
    readonly static integer count = 0
    boolean flush = false
    push    press

    method add takes nothing returns nothing
        set thistype.data[thistype.count] = this
        set thistype.count = thistype.count + 1
    endmethod
    
    method remove takes integer i returns nothing
        set thistype.count  = thistype.count - 1
        set thistype.data[i] = thistype.data[thistype.count]
    endmethod

    static method update takes nothing returns nothing
        local integer i = 0
        loop
            exitwhen i==thistype.count
            if thistype.data[i].flush then
                 call thistype.data[i].destroy()
                 call thistype.data[i].remove(i)
                 set i = i - 1
            else
                call thistype.data[i].press(thistype.data[i]).evaluate()
            endif
            set i = i + 1
        endloop
    endmethod

endmodule
//! endnocjass
cJass
function interface push takes integer this returns nothing defaults nothing
define <implement list>={
    readonly static thistype data[]
    readonly static integer count = 0
    boolean flush = false
    push     press
   
    nothing add(){thistype.data[thistype.count++] = this}
        
    nothing remove(integer i){thistype.data[i] = thistype.data[--thistype.count]}
        
    static nothing update(){
        integer i = 0
        whilenot(i == thistype.count){
        if (thistype.data[i].flush){
           thistype.data[i].destroy()
           thistype.data[i].remove(i--)
        } else {thistype.data[i].press(thistype.data[i]).evaluate()}i++}}
    }
}
Ну и собственно пример.
struct spell
    static timer tt=CreateTimer()
    unit cast
    unit targ
    real time
    implement list
endstruct

function onTimer takes spell this returns nothing
    set this.time = this.time - 0.04
    if this.time < 0.04 then
         if GetWidgetLife(this.targ)>.405 or GetWidgetLife(this.cast)>.405 then
             call SetUnitX(this.targ,GetUnitX(this.cast))
             call SetUnitY(this.targ,GetUnitY(this.cast))
         endif
         call this.remove(this)
         call this.destroy()
         if spell.count == 0 then
             call PauseTimer(spell.tt)
         endif
    endif
endfunction

function Cast takes nothing returns nothing
    local spell this = spell.create
    set this.cast = GetTriggerUnit()
    set this.targ = GetSpellTargetUnit()
    set this.time = GetUnitAbilityLevel(this.cast,GetSpellAbilityId())
    set this.push = onTimer
    call this.add()
    if spell.count==0 then
        call TimerStart(spell.tt,0.04,true,function this.update)
    endif
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
37
12 лет назад
2
Faion, #define TMoveDummyToCoord(spellDummy, xCoord, yCoord, speed, onPeriod, onEnd)
а где же интерполяции, безье, акселерации, деселерации, рикошеты и прочее? Нихрена там не универсально =(
0
24
12 лет назад
0
ScorpioT1000, Блин, не тупи=) Это не мувинг система, не физика, или еще что то. Это шаблон конкретного назначения, который позволяет через аргумент шаблона передать любые инструкции, которые выполнятся на нужном этапе, которые в т.ч. могут даже повлиять на то что в шаблоне. К примеру можно передать код, в котором будет какое то условие + килл юнита и тд. Т.е. это скелет, а дальше навешивай что душе угодно и он позволяет сделать то, что нельзя сделать в любой другой системе без использования костылей.
И да подразумевается использование 1 шаблона под 1 конкретную проблему, офк с поддержкой расширения. Бтв в шаблон можно передавать другой шаблон, с другими параметрами, и прочие эпики творить.
0
8
12 лет назад
0
Да как ей пользоватса)))
0
19
12 лет назад
0
ScorpioT1000:
А вот слабо написать такой класс MUISpell, чтобы данный код безо всяких добавлений начал работать (по логике названий функций из него)
Легко, только тут соль будет в другом, и система будет отлавливать события, что в принципе никак не касается листа, который делает полностью универсальную работу.
Функционально, он быстрее чем представленная функция Faion, и при правильном использовании, она еще и менее абузная, без лишней херни, в виде вызовов и попыток чтения UserData (что по своей сути ненужное дерьмо, зачем юзать это, если ты передаёшь данные напрямую).
бтв по примеру скорпа
interface MUISpell
unit caster
unit target
method onSpellCastStart takes nothing returns nothing
method onSpellCastEffect takes nothing returns nothing
method onSpellCastEnd takes nothing returns nothing
method onSpellCastChannel takes nothing returns nothing
endinterface
Остальное настраиваемое, через struct Init общной функции, наследующей MUISpell
ну в общем то все просто.
0
24
12 лет назад
0
Функционально, он быстрее чем представленная функция Faion
Нет. Ибо темплейт формируется в чистый код, без лишних вызовов и проверок. Ни одна система не может дать гибкость и производительность большую чем дает темплейт. Ибо темплейт формируется в чистый код.
UserData (что по своей сути ненужное дерьмо, зачем юзать это, если ты передаёшь данные напрямую).
:facepalm: что за херню ты спорол? Где тут передача на прямую данных? UserData по умолчанию быстрее, чем перебор циклом, в целях поиска индекса объекта.
1
19
12 лет назад
1
Faion:
Функционально, он быстрее чем представленная функция Faion
Нет. Ибо темплейт формируется в чистый код, без лишних вызовов и проверок. Ни одна система не может дать гибкость и производительность большую чем дает темплейт. Ибо темплейт формируется в чистый код.
Ясно, простой пример. Ты сгенерируешь 300 строк кода, вызовом простой функции в пять строк - 60 раз. Я вызову функцию 60 раз, мой метод, будет оперативно быстрее, как в плане кода, так и в плане обработки, тем более у меня практически не будет возможности заполнить канал, и мне не придётся экзекать новый.
но офк тебе дураку виднее
UserData (что по своей сути ненужное дерьмо, зачем юзать это, если ты передаёшь данные напрямую).
:facepalm: что за херню ты спорол? Где тут передача на прямую данных? UserData по умолчанию быстрее, чем перебор циклом, в целях поиска индекса объекта.
ахахахахаах, нет ну ахахахаха.
твой юзер дата - 20 таймеров пускать будет, итд, куча всякого ненужного дерьма. перебор массива в лупе, лучший способ, угадай почему, потому что больше 12 я не думаю что там будет запусков. И это оперативно быстрее в 12 раз, и не будет всяких неприятных очевидных багов с таймерами (запусти друг более менее нагруженные функции в 12 таймеров, или сейм функцию в 12 разных таймеров, и посмотри как это дерьмо обработается через дебаггер)
короче вывод, ты не шаришь, байтодрочер без каких-либо представлений как работает обработчик кода в вк3
0
24
12 лет назад
0
. Я вызову функцию 60 раз, мой метод, будет оперативно быстрее, как в плане кода, так и в плане обработки, тем более у меня практически не будет возможности заполнить канал, и мне не придётся экзекать новый.
o\ Твой код будет существенно медленнее. В промышленных языках, вызов одной функции, соизмеримо выполнении ~ 10 "базовых" инструкций.
Т.е. 300 строк кода, существенно быстрее 60 вызовов функций, в которых хранится 5 инструкций. Причем сам вызов будет больше жрать процессорного времени, чем исполнение.
тем более у меня практически не будет возможности заполнить канал, и мне не придётся экзекать новый.
Если ты не будешь экзекутить каждую функцию, то обычный вызов функции не будет создавать новый тред, следственно в твоем случае поток быстрее кончится :nate:
твой юзер дата - 20 таймеров пускать будет
Ну ты тупой o\ Юзер дата присваивает индексы объекту, никаких таймеров эта либа не создает.
Ну короче все ясно, ты нуб и не шаришь, видимо даже код не смотрел, раз порешь какую то чушь.
0
37
12 лет назад
0
А вы не знали, что внутрь таймера можно крепить число?
0
24
12 лет назад
0
У меня юзер дата для любых объектов, по этому не особо актуально.
я уже не говорю о том, что реализация конкретного темплейта не относится к дискусу, т.к. это лишь простенький пример, для демонстрации концепции. И в самом темплейте можно реализовать любую архитектуру, хоть цеплять значение на таймер, хоть юзать мейнтаймер, и тд. Факт остается фактом, что быстрее правильного темплейта ничего не может быть, т.к. любой подход реализуется через темплейты.
ScorpioT1000:
А вы не знали, что внутрь таймера можно крепить число?
Собсно знал, вроде бы как раз ты упоминал об этом давно. Однако не особо интересен данный костыль. Я очень сомневаюсь, что метод работает быстрее чем типичный аттач через хт.
0
37
12 лет назад
0
Я очень сомневаюсь, что метод работает быстрее чем типичный аттач через хт.
Кончился чтоли? =)
0
24
12 лет назад
0
ScorpioT1000, пруф?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.