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

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

Закрытая тема
 
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Движение по кругу -_-
Сразу скажу - поиск врубал, но до меня не дошло
сделал так, но не работает, обьекты дружненько компонуются в кучку и висят в одном месте отказываясь перемещаться вокруг юнита
function s_moving takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real x2 = GetUnitX(u)
    local real y2 = GetUnitY(u)
    local real x1 = GetUnitX(udg_Vergil)
    local real y1 = GetUnitY(udg_Vergil)
    local real a = GetUnitFacing(u)
    local real angle = AngleBetweenCoords(x1,y1,x2,y2)
    call SetUnitX(u, x1 + 75.0 * Cos((angle-5.)* bj_DEGTORAD))
    call SetUnitY(u, y1 + 75.0 * Sin((angle-5.)* bj_DEGTORAD))
    set angle = AngleBetweenCoords(x1,y1,x2+(1.0 * Cos(angle * bj_DEGTORAD)),y2+(1.0 * Sin(angle * bj_DEGTORAD)))
    call SetUnitFacing(u, angle)
    set u = null
endfunction

function Trig_Twisted_Swords_Moving_Actions takes nothing returns nothing
    call ForGroup(udg_Vergil_TwistedSwordsG, function s_moving)
endfunction

//===========================================================================
function InitTrig_Twisted_Swords_Moving takes nothing returns nothing
    set gg_trg_Twisted_Swords_Moving = CreateTrigger(  )
    call DisableTrigger( gg_trg_Twisted_Swords_Moving )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Twisted_Swords_Moving, 0.04 )
    call TriggerAddAction( gg_trg_Twisted_Swords_Moving, function Trig_Twisted_Swords_Moving_Actions )
endfunction
мне не надо карта пример или что то в этом духе - мне нужен принцип/метод/формула/способ как это сделать.

Отредактировано Hatsume_Hate, 12.05.2012 в 09:06.
Старый 12.05.2012, 08:54
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
1.Есть координаты центра
2.Циклом создаешь 12 даммиков со смещением допустим 100 под углом i*30. - получаешь что даммики стоят по кругу от центра равномерно
3.сохраняешь их
4.запускаешь таймер
5.при тиках таймера получаешь угол от даммика каждого до центра,прибавляешь 10 градусов и сдвигаешь в центру со смещением 100 под углом=угол от центра до дамми+10
6.так со всеми дамми
7.???
8.???
9.???
10.профит
даммиков можешь хранить хоть в хт,хоть в группе,хоть в массиве - как удобно
надеюсь ТАК понятно?
Старый 12.05.2012, 14:06
Hanabishi
COOL STATUS
offline
Опыт: отключен
(angle-5.)* bj_DEGTORAD
bj_DEGTORAD не нужен, угол между точками и так в радианах возвращается.
И ещё все действия неправильны, ты запутался между радианами и градусами.
Вот так:
function s_moving takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real x2 = GetUnitX(u)
    local real y2 = GetUnitY(u)
    local real x1 = GetUnitX(udg_Vergil)
    local real y1 = GetUnitY(udg_Vergil)
    local real angle = Atan2(y2-y1, x2-x1)+0.087 // 5 градусов = 0.087 радиан (примерно)
    call SetUnitX(u, x1 + 75.0*Cos(angle))
    call SetUnitY(u, y1 + 75.0*Sin(angle))
    call SetUnitFacing(u, angle*bj_RADTODEG)
    set u = null
endfunction
Старый 12.05.2012, 14:46
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
5.при тиках таймера получаешь угол от даммика каждого до центра,прибавляешь 10 градусов и сдвигаешь в центру со смещением 100 под углом=угол от центра до дамми+10
вот тут я немного не понял.
получил угол и прибавил нужный градус
local real angle = AngleBetweenCoords(x1,y1,x2,y2)-0.087
а как это сдвинуть в центру со смещением 100 под углом angle?
Hatsume_Hate добавил:
впринципе, движение пошло, спасибо Hanabishi и Nerevar, что ткнули меня носом, но есть один баг - при перемещении кастера, юниты складываются в гармошку >.< как это исправить?
Миниатюры
Кликните на картинку для увеличения
Название:  ryr.JPG
Просмотров: 58
Размер:  95.0 Кбайт  Кликните на картинку для увеличения
Название:  ryr2.JPG
Просмотров: 54
Размер:  96.5 Кбайт  
Старый 12.05.2012, 19:35
Hanabishi
COOL STATUS
offline
Опыт: отключен
при перемещении кастера, юниты складываются в гармошку >.< как это исправить?
Синхронизировать движение даммиков, чтобы они имели единую точку отсчёта, т.е. например: a+n*k, где a - угол, n - номер даммика, k - разница угла между даммиками.
Старый 12.05.2012, 20:01
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
k - разница угла между даммиками
а как узнать какими именно? ведь их там 6 штук летает
Старый 12.05.2012, 20:13
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
При создании отдельно сохраняешь начальный "базовый угол",затем в цикле создания дамми сохраняй для каждого свою разницу угла от "базового" (на хендл дамми можно повесить)
допустим базовый = 0
тогда для 1 дамми угол - 30
для 2 - 60
для 3 - 90
...
для 10=300
для 11=330
для 12=360
Это если их 12 то для получения угла в 360 разница между углами увеличивается на 30
И таки хватит юзать смайлы в названиях тем
Старый 12.05.2012, 20:59
Hanabishi
COOL STATUS
offline
Опыт: отключен
а как узнать какими именно? ведь их там 6 штук летает
360/6 = 60 градусов или 1.05 радиан
Старый 12.05.2012, 21:06
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
» создал
function Trig_Twisted_Swords_Create_Actions takes nothing returns nothing
    local integer c = 0
    local real a2 = 0.
    local real a = GetUnitFacing(udg_Vergil)
    local real x = GetUnitX(udg_Vergil)
    local real y = GetUnitY(udg_Vergil)
    local real x1
    local real y1
    local player p = GetOwningPlayer(udg_Vergil)
    local unit u
    local real an
    set udg_Power[GetPlayerId(GetOwningPlayer(udg_Vergil))+1] = 0
    loop
        exitwhen c == 6
            set x1 = x + (75.0 * Cos((a+a2) * bj_DEGTORAD))
            set y1 = y + (75.0 * Sin((a+a2) * bj_DEGTORAD))
            set u = CreateUnit(p, 'h011', x1,y1, a+a2)
            call GroupAddUnit(udg_Vergil_TwistedSwordsG,u)
            call normal_sound("SummonedSwordOpt.wav",x1,y1)
            call SetUnitPathing(u, false)
            set an = Atan2(y1-y, x1-x)
            call SaveReal(udg_hash, GetHandleId(u), 1, a2) // angle of creating
            call SaveReal(udg_hash, GetHandleId(u), 2, a) // angle of verg
            //call SaveReal(udg_hash, GetHandleId(u), 3, a) // angle of verg
            set c = c+1
            call SaveInteger(udg_hash, GetHandleId(u), 0,c)
            set a2 = a2+60.
    endloop
    call EnableTrigger(gg_trg_Twisted_Swords_Moving)
    set p = null
    set u = null
endfunction
» двигаю
function s_moving takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real x2 = GetUnitX(u)
    local real y2 = GetUnitY(u)
    local real x1 = GetUnitX(udg_Vergil)
    local real y1 = GetUnitY(udg_Vergil)
    local real a = GetUnitFacing(u)
    local real a2 = LoadReal(udg_hash, GetHandleId(u), 1)*bj_DEGTORAD // angle of creating
    local real a3 = LoadReal(udg_hash, GetHandleId(u), 2)*bj_DEGTORAD
    local integer an = LoadInteger(udg_hash, GetHandleId(u), 0)
    local real angle = Atan2(y2-y1, x2-x1)-0.087+a2
    call SetUnitX(u, x1 + 75.0*Cos(angle))
    call SetUnitY(u, y1 + 75.0*Sin(angle))
    call SetUnitFacing(u, angle*bj_RADTODEG)
    call SaveReal(udg_hash, GetHandleId(u), 1,angle*bj_RADTODEG) // angle of creating
    set u = null
endfunction
и бред выходит
вообще не врубаюсь что делать
Hatsume_Hate добавил:
что я не так делаю?
Миниатюры
Кликните на картинку для увеличения
Название:  775.JPG
Просмотров: 36
Размер:  94.1 Кбайт  

Отредактировано Hatsume_Hate, 12.05.2012 в 21:57.
Старый 12.05.2012, 22:06
Klop
Папа римский
offline
Опыт: 13,006
Активность:
создаётся нормально или при движении бок?
local real a2 = 0.
local real a = GetUnitFacing(udg_Vergil)
сделай так
loop
        exitwhen c == 6
	 set a = c*60.
            set x1 = x + (75.0 * Cos((a) * bj_DEGTORAD))
            set y1 = y + (75.0 * Sin((a) * bj_DEGTORAD))
            set u = CreateUnit(p, 'h011', x1,y1, a)
            call GroupAddUnit(udg_Vergil_TwistedSwordsG,u)
            call normal_sound("SummonedSwordOpt.wav",x1,y1)
            call SetUnitPathing(u, false)
            set an = Atan2(y1-y, x1-x)
            call SaveReal(udg_hash, GetHandleId(u), 1, a2) // angle of creating
            call SaveReal(udg_hash, GetHandleId(u), 2, a) // angle of verg
            //call SaveReal(udg_hash, GetHandleId(u), 3, a) // angle of verg
            set c = c+1
            call SaveInteger(udg_hash, GetHandleId(u), 0,c)
    endloop
зачем отволливать поворот юнита,они всёранво будут кругом,с отловом вот
((кат
        exitwhen c == 6
	 set a = a+(c*60.)
            set x1 = x + (75.0 * Cos((a) * bj_DEGTORAD))
            set y1 = y + (75.0 * Sin((a) * bj_DEGTORAD))
            set u = CreateUnit(p, 'h011', x1,y1, a)
            call GroupAddUnit(udg_Vergil_TwistedSwordsG,u)
            call normal_sound("SummonedSwordOpt.wav",x1,y1)
            call SetUnitPathing(u, false)
            set an = Atan2(y1-y, x1-x)
            call SaveReal(udg_hash, GetHandleId(u), 1, a2) // angle of creating
            call SaveReal(udg_hash, GetHandleId(u), 2, a) // angle of verg
            //call SaveReal(udg_hash, GetHandleId(u), 3, a) // angle of verg
            set c = c+1
            call SaveInteger(udg_hash, GetHandleId(u), 0,c)
    endloop
))
зачем а2 если у тебя есть переменная цикла которая будет менять угол
Старый 13.05.2012, 00:23
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Klop:
создаётся нормально или при движении бок?
local real a2 = 0.
local real a = GetUnitFacing(udg_Vergil)
сделай так
loop
        exitwhen c == 6
	 set a = c*60.
            set x1 = x + (75.0 * Cos((a) * bj_DEGTORAD))
            set y1 = y + (75.0 * Sin((a) * bj_DEGTORAD))
            set u = CreateUnit(p, 'h011', x1,y1, a)
            call GroupAddUnit(udg_Vergil_TwistedSwordsG,u)
            call normal_sound("SummonedSwordOpt.wav",x1,y1)
            call SetUnitPathing(u, false)
            set an = Atan2(y1-y, x1-x)
            call SaveReal(udg_hash, GetHandleId(u), 1, a2) // angle of creating
            call SaveReal(udg_hash, GetHandleId(u), 2, a) // angle of verg
            //call SaveReal(udg_hash, GetHandleId(u), 3, a) // angle of verg
            set c = c+1
            call SaveInteger(udg_hash, GetHandleId(u), 0,c)
    endloop
зачем отволливать поворот юнита,они всёранво будут кругом,с отловом вот
((кат
        exitwhen c == 6
	 set a = a+(c*60.)
            set x1 = x + (75.0 * Cos((a) * bj_DEGTORAD))
            set y1 = y + (75.0 * Sin((a) * bj_DEGTORAD))
            set u = CreateUnit(p, 'h011', x1,y1, a)
            call GroupAddUnit(udg_Vergil_TwistedSwordsG,u)
            call normal_sound("SummonedSwordOpt.wav",x1,y1)
            call SetUnitPathing(u, false)
            set an = Atan2(y1-y, x1-x)
            call SaveReal(udg_hash, GetHandleId(u), 1, a2) // angle of creating
            call SaveReal(udg_hash, GetHandleId(u), 2, a) // angle of verg
            //call SaveReal(udg_hash, GetHandleId(u), 3, a) // angle of verg
            set c = c+1
            call SaveInteger(udg_hash, GetHandleId(u), 0,c)
    endloop
))
зачем а2 если у тебя есть переменная цикла которая будет менять угол
создаются они где надо, с этим все ок, крутятся тоже нормально, однако если начать движение - начинается гармошка. А как ее убрать я не врубился.
Старый 13.05.2012, 00:28
Doc

offline
Опыт: 63,163
Активность:
xgm.ru/p/sc2/galaxy-basic тут такое есть.
Ну и дело в том, что в такой ситуации, угол между точками получать НЕ НУЖНО.
Его нужно сохранять.
Старый 13.05.2012, 00:35
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Doc:
xgm.ru/p/sc2/galaxy-basic тут такое есть.
Ну и дело в том, что в такой ситуации, угол между точками получать НЕ НУЖНО.
Его нужно сохранять.
какой?
Старый 13.05.2012, 00:41
JassMan
свободен
offline
Опыт: 4,193
Активность:
 
Прикрепленные файлы
Тип файла: w3x CircleUnits.w3x (19.0 Кбайт, 17 просмотров )
Старый 13.05.2012, 01:32
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
уже смотрел, не понял как там юниты не складываются в гармонь)
Старый 13.05.2012, 01:38
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
» закройте тему, все сделал
function r_sw takes nothing returns nothing
    local unit u = GetEnumUnit()
        call FlushChildHashtable(udg_hash, GetHandleId(u))
        call GroupRemoveUnit(udg_Vergil_TwistedSwordsG, u)
        call RemoveUnit(u)
    set u = null
endfunction

function Trig_Twisted_Swords_Create_Actions takes nothing returns nothing
    local integer c = 0
    local real a2 = 0.
    local real a = GetUnitFacing(udg_Vergil)
    local real x = GetUnitX(udg_Vergil)
    local real y = GetUnitY(udg_Vergil)
    local real x1
    local real y1
    local player p = GetOwningPlayer(udg_Vergil)
    local unit u
    set udg_Power[GetPlayerId(GetOwningPlayer(udg_Vergil))+1] = 0
    if CountUnitsInGroup(udg_Vergil_TwistedSwordsG) > 0 then
        call ForGroup(udg_Vergil_TwistedSwordsG, function r_sw)
    endif
    loop
        exitwhen c == 6
            set x1 = x + (75.0 * Cos((a+a2) * bj_DEGTORAD))
            set y1 = y + (75.0 * Sin((a+a2) * bj_DEGTORAD))
            set u = CreateUnit(p, 'h011', x1,y1, a+a2)
            call SaveReal(udg_hash, GetHandleId(u), 1, (a+a2)*bj_DEGTORAD) // !!!
            call GroupAddUnit(udg_Vergil_TwistedSwordsG,u)
            call normal_sound("SummonedSwordOpt.wav",x1,y1)
            call SetUnitPathing(u, false)
            set c = c+1
            set a2 = a2+60.
    endloop
    call EnableTrigger(gg_trg_Twisted_Swords_Moving)
    set p = null
    set u = null
endfunction
//------------------------------------------------------------
function s_moving takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real x2 = GetUnitX(u)
    local real y2 = GetUnitY(u)
    local real x1 = GetUnitX(udg_Vergil)
    local real y1 = GetUnitY(udg_Vergil)
    local integer h = GetHandleId(u)
    local real a2 = LoadReal(udg_hash, h, 1)-0.087
    local real angle = Atan2(y2-y1, x2-x1)-0.087
    call SetUnitX(u, x1 + 75.0*Cos(a2))
    call SetUnitY(u, y1 + 75.0*Sin(a2))
    call SetUnitFacing(u, angle*bj_RADTODEG)
    call SaveReal(udg_hash, h, 1, a2)
    set u = null
endfunction

function s_destr takes nothing returns nothing
    local unit u = GetEnumUnit()
    call FlushChildHashtable(udg_hash, GetHandleId(u))
    set u = null
endfunction

function Trig_Twisted_Swords_Moving_Actions takes nothing returns nothing
    if CountUnitsInGroup(udg_Vergil_TwistedSwordsG) > 0 then
        call ForGroup(udg_Vergil_TwistedSwordsG, function s_moving)
    else
        call ForGroup(udg_Vergil_TwistedSwordsG, function s_destr)
        call GroupClear(udg_Vergil_TwistedSwordsG)
        call DisableTrigger(GetTriggeringTrigger())
    endif
endfunction
Старый 13.05.2012, 19:55
Закрытая тема

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

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

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

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



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