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

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

Закрытая тема
 
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Код:
function Trig_Black_Hole_Move_1_Func001Func001A takes nothing returns nothing
     local unit u = GetEnumUnit()
     local location lu = GetUnitLoc(u)
     local real x = GetLocationX(lu)
     local real y = GetLocationY(lu)
     local real x2 = GetLocationX(udg_Point[udg_integer])
     local real y2 = GetLocationY(udg_Point[udg_integer])
     local real l = SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y)) / 100.00
     local real an = Atan2(x2 - x,y2 - y)
    if ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(gg_unit_Hblm_0007)) and  not(IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE)) then
        call SetUnitPathing( u, false )
        call SetUnitX  (u, ( x + ( Cos(an) * l )
        call SetUnitY  (u, ( y + ( Sin(an)) * l)
        call SetUnitPathing( u, true )
    else
    endif
        call RemoveLocation (lu)
        set lu = null
        set u = null
endfunction

function Trig_Black_Hole_Move_1_Actions takes nothing returns nothing
    local group g = CreateGroup()
    local integer i1 = 1
    local integer i2 = udg_integer
    call EnumUnitsInRangeOfLoc(g,udg_Point[udg_integer],900,null)
    loop
        exitwhen i1 > i2
        call ForGroup( g, function Trig_Black_Hole_Move_1_Func001Func001A )
        set i1 = i1 + 1
    endloop
    call DestroyGroup (g)
    set g = null
endfunction

//===========================================================================
function InitTrig_Black_Hole_Move_1 takes nothing returns nothing
    set gg_trg_Black_Hole_Move_1 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Black_Hole_Move_1, 0.05 )
    call TriggerAddAction( gg_trg_Black_Hole_Move_1, function Trig_Black_Hole_Move_1_Actions )
endfunction

могут быть Синтаксические ошибки ибо писал я без редактора

ELDAR добавил:
Цитата:
вот как нужно было делать (шаблон, скажем так)

помоему, слишком для него сложно :)
Старый 21.05.2009, 15:34
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
alexkill Длительность спела просто 6 сек, функции private это что то типо локальных переменных которые действуют на весь тригер? У тебя МУИ?

ELDAR Спасиб

Может кто нибудь написать формулу чтобы юнит притягивался тем быстрее, чем ближе находится точка к которой он мувится, а то у меня наоборот (замедляется при приближении к центру, и двигается очень быстро если юнит находится далеко)
Старый 21.05.2009, 15:57
alexkill

offline
Опыт: 18,872
Активность:
ELDAR
Код:
local location lu = GetUnitLoc(u)
local real x = GetLocationX(lu)
local real y = GetLocationY(lu)

легко преобразовывается в
Код:
local real x = GetUnitX(u)
local real y = GetUnitY(u)

+ на создание, удаление локалок тратися время (локация и группа в твоем случае). глобалки же не нужно постоянно создавать и удалять.

Цитата:
функции private это что то типо локальных переменных

глобальные переменные, видимые лишь в библиотеке

Отредактировано alexkill, 21.05.2009 в 17:02.
Старый 21.05.2009, 16:03
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
alexkill хех, мне было в лом перерабатовать весь код и я тупо дописал недостающие части, а так ты конешно прав

ELDAR добавил:
alexkill я конешно с библиотеками разобрался еще не доконца, но разве при каждом вызове функции Actions не будут перезаписываться локация и юнит? или как там происходит ?
Старый 21.05.2009, 16:16
alexkill

offline
Опыт: 18,872
Активность:
переделал в муи и исправил твою ошибку в расчете скорости движения. карта-пример во вложениях.
» раскрыть
Код:
globals
  location loc = Location(0,0)
  group g = CreateGroup()
  filterfunc ff = null
  timer array Tm
  unit array U
  real array X
  real array Y
  real array Dist
endglobals

function H2I takes handle h returns integer
  return h
  return 0
endfunction

function Angle takes real AX, real AY, real BX, real BY returns real
  return Atan2(BY-AY, BX-AX)
endfunction 

function Distance takes real AX, real AY, real BX, real BY returns real
  return SquareRoot((BX - AX) * (BX - AX) + (BY - AY) * (BY - AY))
endfunction

function Ends takes nothing returns nothing
  local timer e = GetExpiredTimer()
  local integer he = H2I(e)-0x100000
  local integer hf = H2I(Tm[he])-0x100000
  set U[hf] = null
  call DestroyTimer(Tm[he])
  call DestroyTimer(e)
  set Tm[he] = null
  set e = null
endfunction

function Filt takes nothing returns boolean
  local integer hf = H2I(GetExpiredTimer())-0x100000
  local unit f = GetFilterUnit()
  local real angle = Angle(GetUnitX(f), GetUnitY(f), X[hf], Y[hf])
  local real dist = Distance(GetUnitX(f), GetUnitY(f), X[hf], Y[hf])
     if IsUnitEnemy(f, GetOwningPlayer(U[hf])) and not IsUnitType(f, UNIT_TYPE_STRUCTURE) and GetUnitState(f, UNIT_STATE_LIFE)>0 then
       call SetUnitPathing(f, false)
       call SetUnitPosition(f, GetUnitX(f)+(1500/dist)*Cos(angle), GetUnitY(f)+(1500/dist)*Sin(angle))
       call SetUnitPathing(f, true)
        if dist<=100 then
          call KillUnit(f) // здесь добавляй действия, когда воин приближается к "дыре"
        endif
     endif     
    set f = null  
   return false
endfunction

function Go takes nothing returns nothing
  local integer hf = H2I(GetExpiredTimer())-0x100000
  set ff = Filter(function Filt)
  call GroupEnumUnitsInRange(g, X[hf], Y[hf], 900, ff)
endfunction

function Actions takes nothing returns nothing
  local timer t 
  local timer te 
  local integer he 
  local integer hf 
   if GetSpellAbilityId() == 'A000' then // равкод подставь свой
     set t = CreateTimer()
     set te = CreateTimer()
     set he = H2I(te)-0x100000 
     set hf = H2I(t)-0x100000 
     set loc = GetSpellTargetLoc() 
     set X[hf] = GetLocationX(loc)
     set Y[hf] = GetLocationY(loc)
     set Tm[he] = t
     set U[hf] = GetTriggerUnit()
     call TimerStart(Tm[he],0.05, true, function Go)
     call TimerStart(te,6.01, false, function Ends)
   endif 
  set t = null 
  set te = null
endfunction

//===========================================================================
function InitTrig_BlackHole takes nothing returns nothing
    set gg_trg_BlackHole = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(0), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(1), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(2), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(3), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(4), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(5), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(6), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(7), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) 
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(8), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(9), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(10), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(11), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_BlackHole, Player(12), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) 
    call TriggerAddAction( gg_trg_BlackHole, function Actions )
endfunction
Прикрепленные файлы
Тип файла: w3x blHole.w3x (19.4 Кбайт, 16 просмотров )
Старый 22.05.2009, 10:51
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
alexkill
Гм, а зачем так нагромождать код айнита, если можно лупом? Айнит триггеров всё равно происходит один раз и тут почти нету разницы как его производить.
Ну и чем мне не нра метод с чистыми хендлами, если они превысят ограничение индекса массивов, то фатал будет.
Ну конечно такое сложно допустить, но бывает всякое..., а я за безопасность кода.
call DestroyTimer(Tm[he])
set Tm[he] = null
А зачем удалять глобальный таймер? =0 Разве после этого глобалка с таймером создастся?

Отредактировано alexkill, 22.05.2009 в 11:21.
Старый 22.05.2009, 11:02
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Гм, а зачем так нагромождать код айнита, если можно лупом?

еще вейтами перемещать юнита предложите
Цитата:
если они превысят ограничение индекса массивов

>8000 одновременных кастов чреваты последствиями, не связанных с превышением индекса )
Цитата:
А зачем удалять глобальный таймер? =0 Разве после этого глобалка с таймером создастся?

а теперь скачайте карту и проверьте. этот индекс может не задействоаться в будущем.
Цитата:
а я за безопасность кода.

молодец

Отредактировано alexkill, 22.05.2009 в 11:47.
Старый 22.05.2009, 11:22
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
alexkill Спасибо, все работает, щяс попробую переделать функцию перемещения на SetUnitX/Y, с ней заклинание более эфектно смотрится (Юниты могут убегать от притягивания или сопротивлятся его действию, и силу тяги будет зависить от их скорости передвижения).
И еще вопрос, а когда закончятся индексы массива (8190) , то будет ли записыватся инфо в первую ячейку опять? или 8190 кастов ето предел количесва каста? (Имеется ввиду не сразу 8190, а вообще за игру)

Отредактировано Ninbous, 25.05.2009 в 00:19.
Старый 22.05.2009, 20:10
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Сообщение от Ninbous
И еще вопрос, а когда закончятся индексы массива (8190) , то будет ли записыватся инфо в первую ячейку опять?

само собой, хендлы ведь обнуляются... только не в первую ячейку, а где-то в сотую (зависит от количества объектов на карте)
вопрос исчерпан, тема закрыта.
Старый 25.05.2009, 10:18
Закрытая тема

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

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

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

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



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