Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26a+

Описание

1⁣. Создать образец
local RotatingModels obj = RotatingModels.create()
2⁣. Изменить перед стартом параметры по умолчанию
set obj.z = real // высота относительно рельефа
set obj.scale = real // масштабирование модели
set obj.radius = real // радиус
set obj.count = integer // количество моделей
set obj.red = integer // красный цвет (0-255)
set obj.green = integer // зеленый
set obj.blue = integer // синий
set obj.alpha = integer  // прозрачность (0-255)
set obj.pcolor= playercolor // для моделей с тимколором
set obj.model = string // путь к модели
set obj.dangle = real // скорость изменения угла (rad)
set obj.timeout = real // время обновления анимации
3⁣. Создать и запустить вращающуюся модель
call obj.start(x, y) // real x, real y - координаты
call obj.startUnit(target) // unit target - привязка к юниту
4⁣. Остановить анимацию
call obj.pause()
5⁣. Возобновить анимацию
call obj.resume()
6⁣. Изменить параметры визуальных моделей во время анимации
set obj.x = real // центр по X
set obj.y = real // центр по Y
set obj.target // привязанный юнит
call obj.reCount(count) // integer count - количество 
call obj.reScale(scale) // real scale - масштаб
call obj.reColor(red, green, blue, alpha) // integer - красный зеленый синий прозрачность
call obj.rePlayerColor(pcolor) // playercolor pcolor - тимколор
7⁣. Доступ к данным о визуальных моделях
set integer = obj.count // количество
set unit = obj.unit[1] // первый элемент
set unit = obj.unit[obj.count] // последний элемент
8⁣. Удалить всё
call obj.destroy()

Примеры

set obj.scale = 0.5
call obj.start(0,0)
set obj.count = 2
set obj.model = "Abilities\\Weapons\\SentinelMissile\\SentinelMissile.mdl"
call obj.startUnit(unit)
код
struct RotatingModels
    real x
    real y
    real z = 50.
    real scale = 1.
    real radius = 150.
    integer count = 3
    integer red = 255
    integer green = 255
    integer blue = 255
    integer alpha = 255
    playercolor pcolor = ConvertPlayerColor(12)
    string model = "Abilities\\Weapons\\GlaiveMissile\\GlaiveMissile.mdl"
    unit target
    unit array unit[10]
    real array angle[10]
    real dangle = 0.05
    real timeout = 0.03125
    timer timer = CreateTimer()
    static integer unitid = 'h000'
    private static hashtable H = InitHashtable()
    private static location L = Location(0,0)
    
    private method update takes nothing returns nothing
        local integer cnt = .count
        if .target != null then
            set .x = GetUnitX(target)
            set .y = GetUnitY(target)
        endif
        loop
        exitwhen cnt <= 0
            set .angle[cnt] = .angle[cnt] + .dangle
            call SetUnitX( .unit[cnt], .x + .radius*Cos(.angle[cnt]) )
            call SetUnitY( .unit[cnt], .y + .radius*Sin(.angle[cnt]) )
        set cnt = cnt - 1
        endloop
    endmethod
    
    private static method timerUpdate takes nothing returns nothing
        local thistype val = LoadInteger(thistype.H, GetHandleId(GetExpiredTimer()), 0)
        call val.update()
    endmethod
    
    private method createUnit takes real startAngle returns nothing
        local integer cnt = .count
        local real dangle = 6.283/cnt
        local real height
        if cnt > .unit.size then
            set cnt = .unit.size
            set .count = cnt
        endif
        loop
        exitwhen cnt <= 0
            set .angle[cnt] = startAngle
            set startAngle = startAngle + dangle
            set .unit[cnt] = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), thistype.unitid, .x, .y, 0.)
            call AddSpecialEffectTarget(.model, .unit[cnt], "chest")
            call SetUnitColor(.unit[cnt], .pcolor)
            call SetUnitVertexColor(.unit[cnt], .red, .green, .blue, .alpha)
            call SetUnitScale(.unit[cnt], .scale, .scale, .scale)
            call MoveLocation(thistype.L, .x, .y)
            set height = GetLocationZ(thistype.L)
            call SetUnitFlyHeight(.unit[cnt], height + .z, 0.)
        set cnt = cnt - 1
        endloop
    endmethod
    
    method start takes real x, real y returns nothing
        set .x = x
        set .y = y
        call .createUnit(GetRandomReal(0., 6.283))
        call SaveInteger(thistype.H, GetHandleId(.timer), 0, this)
        call TimerStart(.timer, .timeout, true, function thistype.timerUpdate)
    endmethod
    
    method startUnit takes unit target returns nothing
        set .target = target
        call .start(GetUnitX(target), GetUnitY(target))
    endmethod
    
    private method removeUnit takes nothing returns nothing
        loop
        exitwhen .count <= 0
            call RemoveUnit(.unit[.count])
            set .unit[.count] = null
        set .count = .count - 1
        endloop
    endmethod
    
    method destroy takes nothing returns nothing
        call PauseTimer(.timer)
        call FlushChildHashtable(thistype.H, GetHandleId(.timer))
        call DestroyTimer(.timer)
        set .timer = null
        set .target = null
        call .removeUnit()
        call .deallocate()
    endmethod
    
    method pause takes nothing returns nothing
        call PauseTimer(.timer)
    endmethod
    
    method resume takes nothing returns nothing
        call ResumeTimer(.timer)
    endmethod
    
    method reCount takes integer count returns nothing
        local real angle = .angle[1]
        call PauseTimer(.timer)
        call .removeUnit()
        set .count = count
        call .createUnit(angle)
        call TimerStart(.timer, .timeout, true, function thistype.timerUpdate)
    endmethod
    
    method reScale takes real scale returns nothing
        local integer cnt = .count
        set .scale = scale
        loop
        exitwhen cnt <= 0
            call SetUnitScale(.unit[cnt], scale, scale, scale)
        set cnt = cnt - 1
        endloop
    endmethod
    
    method reColor takes integer red, integer green, integer blue, integer alpha returns nothing
        local integer cnt = .count
        set .red = red
        set .green = green
        set .blue = blue
        set .alpha = alpha
        loop
        exitwhen cnt <= 0
            call SetUnitVertexColor(.unit[cnt], red, green, blue, alpha)
        set cnt = cnt - 1
        endloop
    endmethod
    
    method rePlayerColor takes playercolor pcolor returns nothing
        local integer cnt = .count
        set .pcolor = pcolor
        loop
        exitwhen cnt <= 0
            call SetUnitColor(.unit[cnt], pcolor)
        set cnt = cnt - 1
        endloop
    endmethod
    
endstruct

Установка

1⁣. Скопировать триггер RotatingModels.
2⁣. Скопировать нестандартную боевую единицу Effect. Если рав код модели изменился ('h000'), то изменить static integer unitid в RotatingModels на новый.
3⁣. Импортировать себе модель из карты в Менеджере импорта. Проверить, что у боевой единицы Effect в графе Файл модели установлена импортированная модель.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
3 года назад
0
Ну это не модели, это же юнит. Эффекты можно полноценно вращать на мемхаке или рефордже, что то я вообще не проникся этим костылем с юнитом. И период наверное лучше 0.03125. Но это так я придирался просто )). Разумеется норм всё
0
17
3 года назад
0
Bergi_Bear, зато это работает на всех актуальных патчах
0
21
3 года назад
0
Кнопка скачать скачивает видео, а не карту или код.
0
32
3 года назад
Отредактирован Берги
0
ScopteRectuS, А тут и нет карты и кода, это же рубрика "посмотрите как я могу" от Влода
Починил
Увы только через получить
Приоритет скачивания не меняется другим способом
3
21
3 года назад
3
Bergi_Bear, да нет же. Тут у него есть раздел "Установка".
2
17
3 года назад
2
А тут и нет карты и кода, это же рубрика "посмотрите как я могу" от Влода
Так вот какого ты мнения обо мне)
0
32
3 года назад
0
Vlod, ну за тобой уже были такие грешки =)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.