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

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

Ответ
 
Wortecs

offline
Опыт: 3,146
Активность:
Передвинуть юнита
Можно вопрос который спрашивал но никто мне толком ответа не дал:
Суть в том как например разбросать юнитов вокруг кастера в разные стороны, напишите толком ето не только меня мучает
Зеленый - кастер
Желтый - позиция врага до применения спела
Синий - позиция врага после применения спела
Расстояние(стрелки) равные
Миниатюры
Кликните на картинку для увеличения
Название:  Rosbros.jpg
Просмотров: 39
Размер:  10.2 Кбайт  
Старый 18.01.2011, 23:34
Tornak
За Королевство!
offline
Опыт: 27,646
Активность:
Wortecs, прив. видел сотни таких систем и наработок. и на гуи тоже.
Tornak_96 добавил:
Глянь тут вроде
Старый 18.01.2011, 23:41
spellwerk

offline
Опыт: 4,869
Активность:
real ABU( unit caster, unit victim ) {
	return Atan2( GetUnitY(victim) - GetUnitY(caster), GetUnitX(victim) - GetUnitX(caster) )
}
вернет угол в радианах между кастером и целью.
собственно это и есть тот угол, который тебе нужен
Старый 19.01.2011, 00:00
Klop
Папа римский
offline
Опыт: 13,006
Активность:
set r = Atan2(y2-y1,x2-x1)
и двигаеш под этим углом
x2,y2 - координаты врага
x1,y1 - координаты кастера
Старый 19.01.2011, 00:02
Wortecs

offline
Опыт: 3,146
Активность:
Нет желания подсказать в чем дело?

» раскрыть
function Trig_r_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction

function Trig_r_Actions takes nothing returns nothing
local unit cu
local unit u
local real x1
local real x2
local real y1
local real y2
local real r
set cu = GetSpellAbilityUnit()
set u = GetSpellTargetUnit()
set x1 = GetUnitX(cu)
set x2 = GetUnitX(u)
set y1 = GetUnitY(cu)
set y2 = GetUnitY(u)
set r = Atan2(y2-y1,x2-x1)
call SetUnitPositionLoc( u, PolarProjectionBJ(GetUnitLoc(u), 200, r) )
endfunction

//===========================================================================
function InitTrig_r takes nothing returns nothing
set gg_trg_r = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_r, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_r, Condition( function Trig_r_Conditions ) )
call TriggerAddAction( gg_trg_r, function Trig_r_Actions )
endfunction

Дошло оно ж в радианах возвращает

Отредактировано Wortecs, 19.01.2011 в 01:03.
Старый 19.01.2011, 00:55
reALien

offline
Опыт: 29,211
Активность:
А что не работает то? =О
Старый 19.01.2011, 01:04
Wortecs

offline
Опыт: 3,146
Активность:
set g = r * 180 / bj_PI - тогда пашет
Старый 19.01.2011, 01:13
Hanabishi
COOL STATUS
offline
Опыт: отключен
Wortecs, оптимизация, оптимизация и ещё раз оптимизация
в твоём коде море утечек!
вот, я исправил всё:
function Trig_r_Conditions takes nothing returns boolean
    return GetSpellAbilityId()=='A000'
endfunction

function Trig_r_Actions takes nothing returns nothing
    local real r = Atan2(GetUnitY(GetSpellTargetUnit())-GetUnitY(GetSpellAbilityUnit()),GetUnitX(GetSpellTargetUnit())-​GetUnitX(GetSpellAbilityUnit()))
    call SetUnitX(GetSpellTargetUnit(),GetUnitX(GetSpellTargetUnit())+200*Cos(r))
    call SetUnitY(GetSpellTargetUnit(),GetUnitY(GetSpellTargetUnit())+200*Sin(r))
endfunction

//===========================================================================
function InitTrig_r takes nothing returns nothing
    local integer index = 0
    set gg_trg_r = CreateTrigger()
    call TriggerAddCondition(gg_trg_r, Condition(function Trig_r_Conditions))
    call TriggerAddAction(gg_trg_r,function Trig_r_Actions)
    loop
        call TriggerRegisterPlayerUnitEvent(gg_trg_r,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set index = index+1
        exitwhen index==bj_MAX_PLAYER_SLOTS
    endloop
endfunction
Старый 19.01.2011, 15:06
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Wortecs, лучше использовать bj_DEGTORAD и bj_RADTODEG чтобы каждый раз не считать 180/bj_PI
Старый 19.01.2011, 15:34
XOR

offline
Опыт: 38,159
Активность:
King_Ksel:
Wortecs, лучше использовать bj_DEGTORAD и bj_RADTODEG чтобы каждый раз не считать 180/bj_PI
и #include cj_antibj.j
Старый 19.01.2011, 15:38
Wortecs

offline
Опыт: 3,146
Активность:
Hanabishi, А какая разница у мня триггер не будя возмущаться, я просто упростил себе и записал в локалки значения
Старый 19.01.2011, 22:33
reALien

offline
Опыт: 29,211
Активность:
constant real bj_DEGTORAD=bj_PI/180.0
-.-
Старый 19.01.2011, 22:38
Hanabishi
COOL STATUS
offline
Опыт: отключен
Wortecs, ладно бы если ты эти локалки ещё бы в конце обнулял=)
Старый 19.01.2011, 22:40
reALien

offline
Опыт: 29,211
Активность:
Hanabishi:
bj_MAX_PLAYER_SLOTS
круто конечно гонять цикл 17 раз вместо 13-ти
reALien добавил:
а хотя нет, 11-ти
Старый 19.01.2011, 22:47
Wortecs

offline
Опыт: 3,146
Активность:
Hanabishi, Зачем локальные переменные обнулять?
Старый 19.01.2011, 23:45
F3n1kz

offline
Опыт: 4,548
Активность:
reALien,
constant real bj_DEGTORAD=bj_PI/180.0
Старый 20.01.2011, 01:39
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Wortecs, если локальной переменной ты присваиваеш хендл то он храниться в памяти даже если это локальная переменная и переменные хендлы нужно обнулять обязательно,если это локации или больше не нужные обьекты нужно и удалять
пример:
local unit u = GetTriggerUnit()
//дейсвия заклинания например
set u = null
//так как юнит не удаляется с карты то переменную просто обнуляем
local location loc = GetSpellTargetLoc()
// Дейсвия заклинания
call RemoveLocation(loc) //Обязательно потому что это не юнит которым ты играеш
set loc = null
//и обнуление всёравно нужно,т.к не обнулив всёравно будет висяк
Старый 20.01.2011, 03:47
Wortecs

offline
Опыт: 3,146
Активность:
Klop, Я думал не надо локалки пасибо
Старый 20.01.2011, 11:49
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
reALien, я знаю, но просто смысл кучу раз пересчитывать?
Старый 20.01.2011, 15:17
DioD

offline
Опыт: 45,134
Активность:
-GetSpellTargetLoc()-
GetSpellTargetX
GetSpellTargetY
в остальном указано вполне верно, угол между кастером и целями, с угла вычитаем 180 и применяем полярные координаты или двигаем на -200.
локалки подлежат обнулению по общим правилам типов.
Старый 20.01.2011, 16:15
Ответ

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

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

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

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



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