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

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

Ответ
 
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Revo1teR, а никто и не говорит, что ты украл идею. Тебе советуют вариант решения. Посмотри как там реализовано, разберись.
Старый 02.09.2010, 19:31
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Я вообще не об этом. Я говорю, что если тебе нужно, то ты можешь взять его спелл и переделать под себя. Омг -.-
Старый 02.09.2010, 20:59
Revo1teR

offline
Опыт: 146
Активность:
Аааа!
Ну значит просто не правильно понял. Приношу свои извинения =), а копировать я ничего не буду сам напишу.. уже точнее пишу но у меня появился вопрос по формулам.
вокруг оси X:
set x' = x2
set y' = y1 + (y2 - y1) * Cos( a ) + (z1 - z2) * Sin( a )
set z' = z1 + (y2 - y1) * Sin(a ) + (z2 - z1) * Cos( a )
вокург оси Y:
set x' = x1 + (x2 - x1) * Cos( a ) + (z1 - z2) * Sin( a )
set y' = y2
set z' = z1 + (x2 - x1) * Sin( a ) + (z2 - z1) * Cos( a )
вокруг оси X:
set x' = x1 + (x2 - x1) * Cos( a ) + (y2 - y1) * Sin( a )
set y' = y1 + (x2 - x1) * Sin( a ) + (y1 - y2) * Cos( a )
set z' = z2
Здесь x', y' и z' - новые координаты точки t2.
а что такое x1,x2,y1,y2,z1,z2 пояснения нет.. и там кстати опечатка в последнем комментарии там не вокруг оси X, а вокруг оси Z.
Как я могу только догадываться это координаты юнита 1 и юнита 2, но я подставил под значения с цифрой один значения кастера а под значения с цифрой 2 значения GetEnumUnit(), и получился сущий бред.. юнитов телепортирует в случайные точки на карте.
Старый 04.09.2010, 11:40
ScorpioT1000
Работаем
offline
Опыт: отключен
а что ты подставил в "a" ?
Старый 04.09.2010, 11:43
Revo1teR

offline
Опыт: 146
Активность:
Вот код вобщем..
function Centrifuga takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local unit q=GetEnumUnit()
local real a=Atan2(GetUnitY(u)-GetUnitY(q),GetUnitX(u)-GetUnitX(q))
local real y1=GetUnitY(u)
local real x1=GetUnitX(u)
local real y2=GetUnitY(q)
local real x2=GetUnitX(q)
local real z1=GetUnitFlyHeight(u)
local real z2=GetUnitFlyHeight(q)
local real z3
local real y3
local real x3
set x3 = x2
set y3 = y1 + (y2 - y1) * Cos( a ) + (z1 - z2) * Sin( a )
set z3 = z1 + (y2 - y1) * Sin(a ) + (z2 - z1) * Cos( a )
call SetUnitX(q,x3*Cos(a))
call SetUnitY(q,y3*Sin(a))
endfunction
Старый 04.09.2010, 15:13
ScorpioT1000
Работаем
offline
Опыт: отключен
GetEnumUnit()
ты использовал ForGroup?
ScorpioT1000 добавил:
в целом лучше выглядит, чем я думал, но что-то недоработано, даёшь весь код триггера целиком
Старый 04.09.2010, 17:48
Revo1teR

offline
Опыт: 146
Активность:
хм.. а что же мне еще использовать что бы работало на всех юнитов в области + мои условия ? О_о
Весь код:
function Centrifuga_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00G'
endfunction

function Centrifuga_Filter takes nothing returns boolean
local timer t=GetExpiredTimer()
local unit o=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
return IsPlayerEnemy(GetOwningPlayer(o),GetOwningPlayer(GetFilterUnit()))and(GetWidgetLife(GetFilterUnit())​>0.405)and(not(IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)))
endfunction

function Centrifuga takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local unit q=GetEnumUnit()
local real a=Atan2(GetUnitY(u)-GetUnitY(q),GetUnitX(u)-GetUnitX(q))
local real y1=GetUnitY(u)
local real x1=GetUnitX(u)
local real y2=GetUnitY(q)
local real x2=GetUnitX(q)
local real z1=GetUnitFlyHeight(u)
local real z2=GetUnitFlyHeight(q)
local real z3
local real y3
local real x3
set x3 = x2
set y3 = y1 + (y2 - y1) * Cos( a ) + (z1 - z2) * Sin( a )
set z3 = z1 + (y2 - y1) * Sin(a ) + (z2 - z1) * Cos( a )
call SetUnitX(q,(x3+1)*Cos(a))
call SetUnitY(q,(y3+1)*Sin(a))
set q=null
set u=null
// условие остановки и т.д и т.п допишу потому.
endfunction

function Centrifuga_Call_Group takes nothing returns nothing
local timer t=GetExpiredTimer()
local boolexpr b=Condition(function Centrifuga_Filter)
local group g=CreateGroup()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
call GroupEnumUnitsInRangeOfLoc(g,GetUnitLoc(u),400.,b)
call ForGroup(g,function Centrifuga)
set u=null
endfunction

function Centrifuga_Actions takes nothing returns nothing
local unit u=GetTriggerUnit()
local timer t=CreateTimer()
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u)
call TimerStart(t,0.02,true,function Centrifuga_Call_Group)
set u=null
endfunction

//===========================================================================
function InitTrig_Centrifuga takes nothing returns nothing
    set gg_trg_Centrifuga = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Centrifuga, EVENT_PLAYER_UNIT_SPELL_CAST)
    call TriggerAddCondition( gg_trg_Centrifuga, Condition( function Centrifuga_Conditions ) )
    call TriggerAddAction( gg_trg_Centrifuga, function Centrifuga_Actions )
endfunction

Отредактировано Revo1teR, 05.09.2010 в 13:22.
Старый 04.09.2010, 17:59
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
а что же мне еще использовать что бы работало на всех юнитов в области + мои условия ?
ты уже сделал пик на 400 в рендже, это и есть на всех в радиусе
0.02 - плохо, бессмысленно, ресурсоемко для перемещения. Лучший - 0.035
и да это должен быть ченлинг каст =) разве в этом дело ?
Дело в том что событие ченел срабатывает постоянно пока юнит кастует.
Делается через юнит спел каст, и спелл энд
Коды jass в ковычки заключи тогда будет нормальный читабельный вид.
Старый 04.09.2010, 18:22
Revo1teR

offline
Опыт: 146
Активность:
ScorpioT1000,
ты использовал ForGroup?
Revo1teR
хм.. а что же мне еще использовать, что бы работало на всех юнитов в области + мои условия ? О_о
ясно ?
Насчет 0.02 - знаю ) обычно использую 0.04 не знаю почему сейчас через 0.02 написал.
А насчет ченлинга спасибо не знал.Оно повторяется каждую секунду ? Или какой промежуток времени ?
И еще вопрос, перед и после каждой строчки писать "" ? О_О
p.s Юниты все еще телепортируются +) ы.

Отредактировано Revo1teR, 04.09.2010 в 18:59.
Старый 04.09.2010, 18:40
Doc

offline
Опыт: 63,163
Активность:
0.035
0.04
0.025 лучший период, спросите хотябы енеина.
Старый 04.09.2010, 22:30
ScorpioT1000
Работаем
offline
Опыт: отключен
Revo1teR, юзай тег кода плиз
ScorpioT1000 добавил:
И еще вопрос, перед и после каждой строчки писать "" ? О_О
перед и после всего кода
Старый 04.09.2010, 23:11
JassMan
свободен
offline
Опыт: 4,193
Активность:
вокруг оси X:
set x' = x2
set y' = y1 + (y2 - y1) * Cos( a ) + (z1 - z2) * Sin( a )
set z' = z1 + (y2 - y1) * Sin(a ) + (z2 - z1) * Cos( a )
вокург оси Y:
set x' = x1 + (x2 - x1) * Cos( a ) + (z1 - z2) * Sin( a )
set y' = y2
set z' = z1 + (x2 - x1) * Sin( a ) + (z2 - z1) * Cos( a )
вокруг оси X:
set x' = x1 + (x2 - x1) * Cos( a ) + (y2 - y1) * Sin( a )
set y' = y1 + (x2 - x1) * Sin( a ) + (y1 - y2) * Cos( a )
set z' = z2
это поворот отрезка на угол а, где x1,y1 — координаты одного конца, а x2,y2 — другого
Однако при повороте вращающихся окружностей (каждой её точки) у меня эти формулы коряво сработали
Старый 04.09.2010, 23:58
Revo1teR

offline
Опыт: 146
Активность:
А z1 и z2 это высота одного и второго конца так ?.. Но как-то они действительно очень криво работают. У меня юниты просто телепортируються очень далеко от кастера.
Можно это как-то по другому сделать ? например к углу а прибавлять число зависящее от расстояния от кастера до юнита.Кстати может кинете ссылку на формулу по которой можно это число обчислить ?
Старый 05.09.2010, 13:30
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Revo1teR, рассмотри пример Андреича
вот его центрифуга
или эта немного запамятовал я
Старый 05.09.2010, 18:24
Revo1teR

offline
Опыт: 146
Активность:
Нифига не ясно ж.. я же объяснил что я не работал ни с библиотеками ни с структурами ни с какими либо формами джаза типо vjass и cjass. А там повсюду какие-то точки не понятные команды и длинные переменные в которых хрен разберешься (одним словом код для меня не читабелен).Можете мне на нормальному джазе показать ?
Старый 05.09.2010, 21:47
spellwerk

offline
Опыт: 4,869
Активность:
не забивайте вы голову начинающему. пусть разберется так, потом и до cjass'а дело дойдет.

могу написать тебе на обычном джассе, но только ближе к концу недели
Старый 06.09.2010, 14:11
ScorpioT1000
Работаем
offline
Опыт: отключен
но только ближе к концу недели
Помню, за сутки разобрался в жассе, не спрашивая ничего в темах.
по сабжу, ты всё упростил:
set y3 = y1 + (y2 - y1) * Cos( a ) + (z1 - z2) * Sin( a )
set z3 = z1 + (y2 - y1) * Sin(a ) + (z2 - z1) * Cos( a )
там дб дистанция, я думаю, на которую отдаляемся от точки, а тут какаято каша, лучше всё это в переменные заносить.. хотя вроде всё верно)
ScorpioT1000 добавил:
и почему с y,z есть, а с x нету ?
Старый 06.09.2010, 15:38
Revo1teR

offline
Опыт: 146
Активность:
А я откуда знаю ?) я чтоль статью писал? =)) И как можно двигать юнита основываясь на высоту ? Я явно чего-то не понимаю.. y3 - это точка на которую мы юнита передвинем по оси y-ков, так причем тут его высота к его позиции ? О_о
Старый 06.09.2010, 17:44
ScorpioT1000
Работаем
offline
Опыт: отключен
вот формула для перевода сферических координат в декартовы
// z - vertical

//spheric -> decart(x,y,z)
x = Cos(a)*Cos(b)*distance
y = Sin(a)*Cos(b)*distance
z = Sin(b)*distance
у нас есть два угла - угол поворота a (например юнита) и угол высоты b (вертикальный), а также дистанция этого вектора
требуется получить вектор в x,y,z, вот выше формула
и не забывать, что синусы и косинусы принимают углы в радианах, а взятие угла поворота юнита - в градусах (переводить надо будет)

Отредактировано ScorpioT1000, 09.09.2010 в 22:56.
Старый 06.09.2010, 17:46
Ответ

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

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

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

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



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