Сейчас 23:01:03 Понедельник, 25 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Наработка] Система столкновений + конструктор скиллов
xomachДата: Четверг, 27 Июня 2013, 19:30:23 | Сообщение # 1
7 уровень
Группа: Проверенные
Сообщений: 484
Награды: 0
Репутация: 128
Блокировки:
Система столкновений:
При столкновении 2ух способностей, выживает тот, у которого больше оставшегося урона. И его урон уменьшается на урон проигравшего и тоже останавливается, если ост. урон у него < минимального. Смысл в возможности остановить сильную способность несколькими слабыми. Или ослабить принимаемый урон своим, менее сильным скиллом. Также есть опция, включающая столкновения с юнитами для скилла по тем же правилам.
Конструктор скиллов:
Очень гибкий конструктор скиллов с "летящим зарядом". Особо актуально для аниме карт.
Инструкция по использованию:
достаточно строчки
Код

call SW_AddSpell(int abilId, int dummy, real spd, real r, real dmg1, real dmg2, real dist, real startDist, bool stoppable, string startFunc, string loopFunc, string attackFunc, string endFunc)

Для добавления скилла.
По пунктам:

Команды пользователя:

Особенности:
  • Поддерживает дамми со способностью "москиты","неуязвимый" и т.д.
  • Сама система столкновений.
  • Легкое в использовании
  • Не требует глубоких познаний в Jass для использования
  • Когда не используется, не грузит процессор.
  • Практически не ограничивает возможности скилла. В крайнем случае "на костылях" в юзерфунках можно всего добиться, а со знаниями cJass и изменить необходимое в коде.
  • Траектория полета снаряда, вопреки первому впечатлению, абсолютно произвольна, можно даже обнулить скорость и в loopFunc двигать снаряд за юнитом, сделав таким образом "пробивные" сталкивающиеся рассенганы(для Нарутофагов)
  • Умеренная нагрузка на комп, при сложности алгоритма (n+1)*n/2 (надеюсь, на этот раз угадал :) ) у меня тянет до 70 одновременно запущенных скиллов.
    Скриншоты:

    Скачать:
    В карте 2 способности, реализованных на ГУИ и Jass2. Особо заморачиваться не стал, просто сделал способности, позволяющие в полной мере потестить систему столкновений(огнемет и местную Shock Wave). Ну и сама библиотека в нестандартном коде канешн.
    скачать карту-тест
    скачать *J
    Требуется jngp со включенным cJass
    Версия:
    Назовем ее 0.1 beta из-за одного бага, который я так и не смог победить. То, что я о нем знаю:
  • возникает от долгого применения огнемета.. Наверное.
  • проявляется в хаосе в индексации дамми в массиве. А последствия сами гляньте.
  • мгновенно показывает себя при использовании огнемета синим и красным игроками, но не появляется при использовании 2умя красными
    А еще забыл добавить callFunc, сильно ограничивает функционал. На днях исправлю.
    Код:




    Сообщение отредактировал xomach - Четверг, 27 Июня 2013, 20:05:22
  •  

    GoodieДата: Четверг, 27 Июня 2013, 20:58:03 | Сообщение # 2
    4 уровень
    Группа: Проверенные
    Сообщений: 84
    Награды: 0
    Репутация: 57
    Блокировки:
    Эмм. а зачем юзать расстояние каждые 0.03 секунды, если можно вычислить время полета?
    Код тяжело читается и мне не понравилось вот что:
    Постоянное сообщение: Расходы....
    При смерти даммика, не показывается эффект
    SetUnitPosition можно использовать SetUnitX SetUnitY
    много дефайнов, что понижает читабельность
    числа real заменяешь на int, что отнимает производительность. Поставь просто точки в конце реалов
    Кстати...native SquareRoot takes real x returns real
    Ах да, зачем юзать две структуры?
    Код
        public unit GetDummy(){
       return LD.u
      }
       
      public unit GetCaster(){
       return LD.caster
      }
       
      public void SetDist(int x){
       LD.Dist=x
      }
       
      public int GetDist(){
       return LD.Dist
      }
       
      public unit GetAttackedUnit(){
       return AttackedUnit
      }

    Можно заменить на дефайны, не?
    Но так как система только вышла на свет, ждемс исправлений. Интересная система выйдет


    cJass рулит!
    Power of Mighty[Work In Progress]
     

    xomachДата: Четверг, 27 Июня 2013, 21:23:26 | Сообщение # 3
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Расходы-это я для теста поставил даммикам пищу 1. Сто бы видеть кол-во. А все "конечные" эффекты в endFunc, согласись, там Removeunit() уместнее KillUnit().
    Цитата
    Можно заменить на дефайны, не?

    Ага, надо бы.
    А две структуры для разных целей:
    Одна-скиллы, статичные данные для передачи заряду при старте.
    Другая-заряд, динамичные данные, содержащие информацию о конкретном запущенном заряде.
    За советы спасибо :) . Еще бы баг мне кто отловить помог :(


     

    GoodieДата: Четверг, 27 Июня 2013, 22:14:05 | Сообщение # 4
    4 уровень
    Группа: Проверенные
    Сообщений: 84
    Награды: 0
    Репутация: 57
    Блокировки:
    Какой баг: Вроде нчиего не заметил
    А насчет 2 структур, почему бы не использовать одну?

    Добавлено (27 Июня 2013, 22:14:05)
    ---------------------------------------------
    Завтра помогу может


    cJass рулит!
    Power of Mighty[Work In Progress]
     

    xomachДата: Четверг, 27 Июня 2013, 22:18:01 | Сообщение # 5
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Goodie, там в коменте самом нижнем в триггерах написано, как его быстро вызвать. Либо тупо с огнеметом минут 5 бегать.
    Ты предлагаешь spell структуру с массивом shell структур, или просто с параллельными массивами? Ну да. Я чет не догадался :)


     

    Ty3uKДата: Четверг, 27 Июня 2013, 22:23:31 | Сообщение # 6
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    Стек в структуре! buba

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    xomachДата: Четверг, 27 Июня 2013, 22:26:00 | Сообщение # 7
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Ty3uK, во-первых, тогда уж очередь, во вторых, не подходит) были бы просто ShochWave'ы, подошло бы
    Или ты не про стек, как структуру данных?)




    Сообщение отредактировал xomach - Четверг, 27 Июня 2013, 22:26:47
     

    Ty3uKДата: Четверг, 27 Июня 2013, 22:44:03 | Сообщение # 8
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    Я про стек как про то, с чем можно делать push/pop

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    xomachДата: Четверг, 27 Июня 2013, 22:55:35 | Сообщение # 9
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Ну. Но принцип стека "последним пришел-первым ушел" тут бесполезен.
    В нашем же случае "входы" и "выходы" даже в пределах одного скилла абсолютно хаотичны. Тут я самую быструю структуру использовал с незначительным по современным меркам ущербом в памяти




    Сообщение отредактировал xomach - Четверг, 27 Июня 2013, 23:04:05
     

    GoodieДата: Четверг, 27 Июня 2013, 23:30:41 | Сообщение # 10
    4 уровень
    Группа: Проверенные
    Сообщений: 84
    Награды: 0
    Репутация: 57
    Блокировки:
    Я бы просто взял и переписал все <_< :p
    Как то всё страшно выглядит...
    Особенно это:
    Код
              SET(abilId)  
               SET(dummy)  
               SET(spd)  
               SET(r)  
               SET(dmg1)  
               SET(dmg2)  
               SET(dist)  
               SET(startDist)  
               SET(stoppable)  
               SET(startFunc)  
               SET(attackFunc)  
               SET(loopFunc)  
               SET(endFunc)

    эти ЗАГЛАВНЫЕ буквы вобще глаза мозолят)
    Надо бы тебе тренироваться в написании читаемых кодов


    cJass рулит!
    Power of Mighty[Work In Progress]
     

    xomachДата: Пятница, 28 Июня 2013, 08:32:58 | Сообщение # 11
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Goodie, С первого раза всегда быдло код прет :)

     

    SirNikolasДата: Пятница, 28 Июня 2013, 10:29:42 | Сообщение # 12
    Группа: Модераторы
    Сообщений: 6729
    Награды: 1
    Репутация: 1867
    Блокировки:
    Цитата (xomach)
    при сложности алгоритма (n+1)*n/2
    Это O(n2)
    Цитата (xomach)
    Код
    private void Ini(){
        #for i(0,15)
            TriggerRegisterPlayerUnitEvent(CastTrg, Player(i),EVENT_PLAYER_UNIT_SPELL_CAST,null)
        #endfor
        TriggerAddAction( CastTrg, function Cast )
    }
    Может, здесь уместнее был бы callback onUnitSpellCast или ...SpellEffect?


     

    xomachДата: Пятница, 28 Июня 2013, 10:39:17 | Сообщение # 13
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Цитата (SirNikolas)
    Это O(n2)

    А вот и нифига, там второй цикл от i+1 идет => у нас будет ар. прогрессия с 1ым членом n и разностью (-1) (n+(n-1)+(n-2)...+1), что понятным образом преобразуется в n(n-1)/2

    Добавлено (28 Июня 2013, 10:39:17)
    ---------------------------------------------

    Цитата (SirNikolas)
    Может, здесь уместнее был бы callback onUnitSpellCast или ...SpellEffect?

    не знаю такого


     

    Ty3uKДата: Пятница, 28 Июня 2013, 10:49:16 | Сообщение # 14
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    xomach, это фишки последнего билда AdicHelper.

    Добавлено (28 Июня 2013, 10:49:16)
    ---------------------------------------------
    this


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    GoodieДата: Пятница, 28 Июня 2013, 10:49:52 | Сообщение # 15
    4 уровень
    Группа: Проверенные
    Сообщений: 84
    Награды: 0
    Репутация: 57
    Блокировки:
    SirNikolas, А защем каллбак, если он тоже самое делает... Лишние действия....
    Ах да... xomach, Не занимайся байтодро***ством


    cJass рулит!
    Power of Mighty[Work In Progress]
     

    Ty3uKДата: Пятница, 28 Июня 2013, 10:54:10 | Сообщение # 16
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    Goodie, затем же, зачем и все плюшки cJASS - писать меньше.

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    xomachДата: Пятница, 28 Июня 2013, 11:03:00 | Сообщение # 17
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Цитата (Goodie)
    байтодро***ством

    эт как? :)

    Добавлено (28 Июня 2013, 11:03:00)
    ---------------------------------------------
    Ty3uK, SirNikolas, ну там же надо spellId указывать. А мне надо обрабатывать все касты


     

    Ty3uKДата: Пятница, 28 Июня 2013, 11:03:58 | Сообщение # 18
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    xomach, а я и не говорил, что надо это юзать. Я просто дал линк и пояснил, в чем смысл.

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    GoodieДата: Пятница, 28 Июня 2013, 11:17:18 | Сообщение # 19
    4 уровень
    Группа: Проверенные
    Сообщений: 84
    Награды: 0
    Репутация: 57
    Блокировки:
    xomach, делать все до минимальных утечек и прочей фигни, типа как переводить числа в HEX и прочее. НАсчет HEX эт можно, ну если привык и раньше писал, а вот насчет того чтобы убрать прям всё чтобы было нереально идеально, бред
    Чем больше ты пытаешься оптимизировать тем хуже ты делаешь

    Просто меня убивает написание кода:

    Написав это:
    Код

         callback onUnitSpellEffect('A000')
         {
             BJDebugMsg("Hello!") s
         }


    Там мы видим это...:
    Код

    function cjCallbacksRegestration__reg_0b takes nothing returns nothing
    local integer i=GetSpellAbilityId()
    if i==0x41303030 then
    call cj_callback_00000000()
    endif    
    endfunction  

    function cjCallbacksRegestration__initX takes nothing returns nothing
    local integer i=0
    local player p
    loop
    set p=Player(i)
    call TriggerRegisterPlayerUnitEvent(cj_callback_trg_0b, p, EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set i=i+1
    exitwhen i==16
    endloop
    call TriggerAddAction(cj_callback_trg_0b, function cjCallbacksRegestration__reg_0b)
    endfunction  


    здесь спелл расчитан на 17 игроков, что не надо и можно поставить на 15
    Так же в функции указано действие, а не условие, a условие быстрее

    Код

    function cjCallbacksRegestration__reg_0b takes nothing returns nothing
    local integer i=GetSpellAbilityId()
    if i==0x41303030 then
    call cj_callback_00000000()
    endif    
    endfunction  


    Зачем вызывать функцию если там можно внутри уже все написать или даже хотябы в вызове написать аргументы

    Добавлено (28 Июня 2013, 11:17:18)
    ---------------------------------------------

    Код
         
    callback onUnitSpellEffect()
         {
             BJDebugMsg("Hello!")  
         }

    Ну если уж вам нравится, то юзайте так



    cJass рулит!
    Power of Mighty[Work In Progress]
     

    xomachДата: Пятница, 28 Июня 2013, 11:45:04 | Сообщение # 20
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    В любом случае, наработка неюзабельна, пока есть это:


     

    GoodieДата: Пятница, 28 Июня 2013, 12:12:04 | Сообщение # 21
    4 уровень
    Группа: Проверенные
    Сообщений: 84
    Награды: 0
    Репутация: 57
    Блокировки:
    xomach, А вобще, толк тогда её выкладывать:D
    Ну ничего, мы поможем


    cJass рулит!
    Power of Mighty[Work In Progress]


    Сообщение отредактировал Goodie - Пятница, 28 Июня 2013, 12:21:44
     

    xomachДата: Пятница, 28 Июня 2013, 12:23:59 | Сообщение # 22
    7 уровень
    Группа: Проверенные
    Сообщений: 484
    Награды: 0
    Репутация: 128
    Блокировки:
    Goodie, ну без такой нагрузки, как 3 дамика за 0.06с этого не произойдет :)
    Цитата (Goodie)
    мы поможем

    а еще вот в этом


     

    • Страница 1 из 1
    • 1
    Поиск:

    Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
    Хостинг от uCoz