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

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

Ответ
 
silumin

offline
Опыт: 11,153
Активность:
Слайд и целевые спеллы
Первая карта на б.нете не покатила, поэтому сейчас заминаюсь картой с мясом...
Столкнулся с такой проблемой:
Вся игра завёрнута на слайде (скольжении). Слайд организовал самостаятельно, прочитав несколько постов на эту тему. Всё хорошо за исключением целевых спеллов. Я нажимаю хоткей спелла и пытаюсь выбрать цель (такой же скользящий юнит как и мой) и тут вся загвоздка: юнит-цель прыгает раз в 0.05 секунд на 10 ед. и точно поймать его в цель практически невозможно, соответственно целевые спеллы как бы отпадают, чего бы не хотелось.
Есть идея такая: все применяемые спеллы сделать с возможностью таргета на пустую землю, потом, при клике мышкой на точку на земле, проверять есть ли в области радиусом 50 ед. вражеский юнит, если есть, то пускать болт или вешать что-нить сразу.
Второй, более простой вариант: просто все спеллы сделать АоЕ с малым радиусом, но тогда имхо будет сложно отследить утечку маны, на тот случай если в области не окажется юнита и не на кого будет пускать болт.

Мб у кого есть уже готорые решения? В поиске ничего конкретного не нашёл.

P.S. при слайде есть утечка памяти "через" точки? Если да, то киньте ссылку как её устранить, заранее спс.
Код:
Считывание кликов мыши
function Trig_PickPoint_Actions takes nothing returns nothing
    set udg_real = AngleBetweenPoints(udg_Move_0, GetOrderPointLoc())
endfunction

//===========================================================================
function InitTrig_PickPoint takes nothing returns nothing
    set gg_trg_PickPoint = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_PickPoint, Player(0), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    call TriggerAddAction( gg_trg_PickPoint, function Trig_PickPoint_Actions )
endfunction

//Сам слайд
function Trig_Slide_Actions takes nothing returns nothing
    set udg_Move_0 = PolarProjectionBJ(GetUnitLoc(udg_TrigUnit), 10.00, GetUnitFacing(udg_TrigUnit))
    call SetUnitPositionLocFacingBJ( udg_TrigUnit, udg_Move_0, udg_real )
endfunction

//===========================================================================
function InitTrig_Slide takes nothing returns nothing
    set gg_trg_Slide = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Slide, 0.03 )
    call TriggerAddAction( gg_trg_Slide, function Trig_Slide_Actions )
endfunction

Отредактировано silumin, 18.03.2008 в 23:02.
Старый 18.03.2008, 22:56
adic3x

offline
Опыт: 108,439
Активность:
Код:
function PolarProjectionBJ takes location source, real dist, real angle returns location
    local real x = GetLocationX(source) + dist * Cos(angle * bj_DEGTORAD)
    local real y = GetLocationY(source) + dist * Sin(angle * bj_DEGTORAD)
    return Location(x, y)
endfunction


утечка есть

для отчистки совести напишу как бы сделал я, потом придумаете какой то более обобщенный вариант моего кода
Код:
library XxX initializer Init

globals
 real x=0.
 real y=0.
 real vx=0.
 real vy=0.
 real f=0.

 timer t=CreateTimer()
 trigger x=CreateTrigger()

 unit u=null
endglobals

function sladePer takes nothing returns nothing
 set x=x+vx
 set y=y+vy

 call SetUnitX(u, x)
 call SetUnitY(u, y)
endfunction

function orderCorrect takes nothing returns nothing
 set f=Atan2(GetOrderPointY()-y, GetOrderPointX()-x)

 set vx=Cos(f)*10.
 set vy=Sin(f)*10.

 call SetUnitFacing(u, f*57.2957)
endfunction

function Init takes nothing returns nothing
 call TriggerRegisterPlayerUnitEvent(x, Player(0x00), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
 call TriggerAddAction(x, function orderCorrect)
 call TimerStart(t, .025, true, function sladePer)

 set u=<your_unit>
 set x=<xCord_of_u>
 set y=<yCord_of_u>
endfunction

endlibrary

Отредактировано ADOLF, 19.03.2008 в 16:11.
Старый 19.03.2008, 12:52
J
expert
offline
Опыт: 48,447
Активность:
silumin как я понимаю юнитов скользящих не один...
судя по триггеру массивы неисаользуются, значит на каждого юнита по одному триггеру, не тру...
можно сделать через массивы, а можно через лут по глобальной группе в которой записаны все юниты что долны скользить
второй вариант более удобный с той точки зрения что над группой лучше всего совершать какието похожии действия, т.е. есть таймер который двигает каждого юнита из группы, не все юниты сразу будут скользить, и можно исключать из группы юнита и он не будет, а можно принять... хотя с массивом будет оптимальнее
Старый 19.03.2008, 15:26
F3n1kz

offline
Опыт: 4,548
Активность:
silumin, щаз сам делаю мапу на слайде, так вот наработку, чтобы тыкать по земле и таргетилсо юнит йа стер =(
Вообщем смысл такой: ловишь событие EVENT_PLAYER_UNIT_SPELL_EFFECT
local location loc = GetSpellTargetLoc
local rect r = Rect(loc-x, loc-y, loc+x, loc+y)
x и y - пнчтное дело <100, смаотря какой радиус
Дальше local group g - юнитс ин Рек (r)
птом пикаем рандомного юнита и уже с ним делаешь все что нада)
(так много переменных нада. чтоб небыло утечек, т.е. их в конце трига удалять оО)

Но идея тупая, все тестеры жалуюца типа "шозанах, сделай норм таргет, на землю около юнита тыкать тупо О_О"
А с пропажей маны и кулдауна - оч животрепещущая тема, хз каг отменять спелл =(
Старый 17.04.2008, 17:33
Ответ

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

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

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

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



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