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

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

Закрытая тема
 
sleepw

offline
Опыт: 8,449
Активность:
Дистанция между точками
опядь сделал спелл и опять вылазит моё незнание математики:)
» spell

Код:
globals
unit sscaster
unit ss
location ssloc
real fh=60
endglobals
 
function Trig_Ssault_Conditions takes nothing returns boolean
   return GetSpellAbilityId()=='A01W'
endfunction

function DistanceBC takes real AX, real AY, real BX, real BY returns real
    local real dx = BX - AX
    local real dy = BY - AY
    return SquareRoot(dx * dx + dy * dy)
endfunction 

function ssmove takes nothing returns nothing
    local real X = GetUnitX(ss)
    local real Y = GetUnitY(ss)
    local real len = DistanceBC(X, Y, GetLocationX(ssloc), GetLocationY(ssloc))
    local real a
    if len > 25 then
        set a = Atan2(GetLocationY(ssloc) - Y, GetLocationX(ssloc) - X)
        call SetUnitX(ss, X + 20 * Cos(a))
        call SetUnitY(ss, Y + 20 * Sin(a))
        call SetUnitFlyHeight(ss,fh,0)
     if X!=len/2 then
        set fh=fh+15
     else
        set fh=fh-15
     endif
    else
        call SetUnitPositionLoc(sscaster,ssloc)
        call ShowUnit(sscaster,true)
        call RemoveUnit(ss)
        call SetUnitInvulnerable(sscaster,false)
        call SelectUnitAddForPlayer(sscaster,GetOwningPlayer(sscaster))
        call DestroyTimer(GetExpiredTimer())
        set fh=60
        set ss=null
        set sscaster=null
        set ssloc=null
    endif
endfunction

function Trig_Ssault_Actions takes nothing returns nothing
   local timer t=CreateTimer()
   set sscaster=GetSpellAbilityUnit()
   set ssloc=GetSpellTargetLoc()
   set ss=CreateUnitAtLoc(GetOwningPlayer(sscaster),'h00G',GetUnitLoc(sscaster),GetUnit  Facing(sscaster))
   call ShowUnit(sscaster,false)
   call SetUnitInvulnerable(sscaster,true)
   call TimerStart(t, 0.03, true, function ssmove)
endfunction

//===========================================================================
function InitTrig_Ssault takes nothing returns nothing
    set gg_trg_Ssault = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Ssault, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Ssault, Condition( function Trig_Ssault_Conditions ) )
    call TriggerAddAction( gg_trg_Ssault, function Trig_Ssault_Actions )
endfunction



если позишн ов "ss" неравно половине дистанции до точки делать тота.
Код:
if len!=len/2 then
        set fh=fh+15
     else
        set fh=fh-15
     endif

тоесть иными словами: До половины он взлетает,после половины снижаецо.
и ещё как сделать фейсинг юнита в сторону таргет поинт ов абилити биинг каст?

Отредактировано sleepw, 11.03.2008 в 05:24.
Старый 11.03.2008, 05:14
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Код:
function DistanceBetweenUnits takes unit u1, unit u2 returns real
    local real dx = GetUnitX(u2) - GetUnitX(u1)
    local real dy = GetUnitY(u2) - GetUnitY(u1)
    return SquareRoot(dx * dx + dy * dy)
endfunction

if len < DistanceBetweenUnits(uint1, unit2)/2 then
  call DoSomething1() //если дистанция меньше половины.
else
  call DoSomething2() //если дистанция больше или равно половине.
endif


А сравнивать len=len/2 - нельзя, всегда вернёт false. Как просто по себе переменная может равняться сврей половине, абсурд.
Старый 11.03.2008, 06:39
sleepw

offline
Опыт: 8,449
Активность:
DFlyer
ну дык переменная это ж число)

sleepw добавил:
зы зочем ты поменяль функцию?
мне юниты ненадо) мне надо точги. у мну в спеле всё прально просто вот с полётом никак немогу решитЬ:)

sleepw добавил:
тобишь мне надо точку юнита сравнить с ssloc

sleepw добавил:
DFlyer
зы нащёт лена то я просто тестил уже что в голову приходило..) токо понял о чём ты))

sleepw добавил:
вот она, истина!)
я совсем забыл что на позиции откуда летит снаряд стоит никому ненужный кастер:) я от него пощиталь..
Код:
function DistanceBC takes real AX, real AY, real BX, real BY returns real
    local real dx = BX - AX
    local real dy = BY - AY
    return SquareRoot(dx * dx + dy * dy)
endfunction 
---
local real len2 = DistanceBC(XX, YY, GetLocationX(ssloc), GetLocationY(ssloc))
---
if  len2/2<len then


теперь остаёцо вопрос как Фейсинг снаряда сделать в точку каста?
Старый 11.03.2008, 08:19
Hexus
Looking for a victim
offline
Опыт: 19,166
Активность:
Двигать facing point, или make unit facing... как-то так.
Старый 11.03.2008, 09:04
sleepw

offline
Опыт: 8,449
Активность:
Hexus
не смеши мну плез
Старый 11.03.2008, 09:05
adic3x

offline
Опыт: 108,439
Активность:
совершенно неправильная реализация движения прожектила

Цитата:
Atan2(GetLocationY(ssloc) - Y, GetLocationX(ssloc) - X)


угол вектора идущего из точки ху к локации сс
если есть вектор, то смысл считать координаты?

как бы я считал
Код:
vx=GetLocationX(l)-x // TT, фтопку локации вообщето
vy=GetLocationY(l)-y // а поэтому

vx=xTarget-x
vy=yTarget-y

r=SquareRoot(vx*vx+vy*vy) // длина вектора

if r<20. then
 ...
else
x=x+vx*20./r // прибавляем к координатам вектор
y=y+vy*20./r  // обрезанный до длины 20.
endif


ADOLF добавил:
тем более что при более сложных вычислениях (к примеру трехмерный вектор) либо сложение векторов так работать намного удобней

Отредактировано ADOLF, 11.03.2008 в 13:34.
Старый 11.03.2008, 13:28
sleepw

offline
Опыт: 8,449
Активность:
ADOLF
ну х3..

а как же всё такие выкупить точку каста?

sleepw добавил:
ADOLF
зы. насчет твоего примера,реализуй его плз в скрипте,я не особо понял о чём речь :[
Старый 11.03.2008, 15:47
J
expert
offline
Опыт: 48,447
Активность:
sleepw я переделал процес полета под свое усмотрение, думаю что так тебе подойдет больше, если неподходит то извени...
Я проверил код работоспособный:
Код:
globals
    unit sscaster
    unit ss
    real sslocX
    real sslocY
    real MaxHeight
endglobals

function Trig_Ssault_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A01W'
endfunction

function DistanceBC takes real AX, real AY, real BX, real BY returns real
    local real dx = BX - AX
    local real dy = BY - AY
    return SquareRoot(dx * dx + dy * dy)
endfunction

function ssmove takes nothing returns nothing     
    local real X = GetUnitX(ss)
    local real Y = GetUnitY(ss)
    local real len = DistanceBC(X, Y, sslocX, sslocY) 
    local real lenmax = DistanceBC(GetUnitX(sscaster), GetUnitY(sscaster), sslocX, sslocY) 
    local real a
    if len > 25 then
        set a = Atan2(sslocY - Y, sslocX - X)
        call SetUnitX(ss, X + 20 * Cos(a))
        call SetUnitY(ss, Y + 20 * Sin(a))
        call SetUnitFlyHeight(ss, 60 + 4*(lenmax-len)*MaxHeight*len/(lenmax*lenmax), 0)
    else
        call SetUnitPosition (sscaster, sslocX, sslocY)
        call ShowUnit (sscaster, true)
        call RemoveUnit (ss)
        call SetUnitInvulnerable (sscaster, false)
        call SelectUnitAddForPlayer (sscaster, GetOwningPlayer(sscaster))
        call DestroyTimer(GetExpiredTimer())
        set ss = null
        set sscaster = null
    endif
endfunction

function Trig_Ssault_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    set sscaster  = GetSpellAbilityUnit()
    set sslocX    = GetLocationX(GetSpellTargetLoc())
    set sslocY    = GetLocationY(GetSpellTargetLoc())
    set ss = CreateUnit (GetOwningPlayer(sscaster), 'h00G', GetUnitX(sscaster), GetUnitY(sscaster), GetUnitFacing(sscaster))
    set MaxHeight = DistanceBC(GetUnitX(sscaster), GetUnitY(sscaster), sslocX, sslocY)/3 //Максимальная высота которую достигает прожектил в процесе полета
    call ShowUnit (sscaster, false)
    call SetUnitInvulnerable (sscaster, true)
    call TimerStart(t, 0.03, true, function ssmove)
endfunction

function InitTrig_Ssault takes nothing returns nothing
    set gg_trg_Ssault = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Ssault, EVENT_PLAYER_UNIT_SPELL_EFFECT            )
    call TriggerAddCondition          (gg_trg_Ssault, Condition(function Trig_Ssault_Conditions))
    call TriggerAddAction             (gg_trg_Ssault,           function Trig_Ssault_Actions    )
endfunction
Старый 11.03.2008, 18:33
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
зы. насчет твоего примера,реализуй его плз в скрипте,я не особо понял о чём речь :[


м, тока ща понял что у тя вообще вектор статичный

Код:
globals
 real x
 real y
 real vx
 real vy
 integer i
endglobals

function Mover
 set x=x+vx
 set y=y+vy

 if i!=0x00then
   set i=i-0x01
   call SetUnitX(x)
   call SetUnitY(y)
 else
   // снаряд прилетел к цели
 endif
endfunction

...
 set x=GetUnitX(caster)
 set y=GetUnitY(caster)

 set vx=GetUnitX(target)-x
 set vy=GetUnitY(target)-y

 set i=R2I(SquareRoot(vx*vx+vy*vy)/20.)

 set vx=vx/i
 set vy=vy/i
...


Jon, небуду говоритьо мелких ошибках, важно то, что третья координата считается неправильно - в том плане, что снаряд прилетитк точке, находящейся на той же высоте, что и кастер относительно террайна, т.е. правильно считать снаряд с учетом высоты террайна...
Старый 11.03.2008, 21:24
J
expert
offline
Опыт: 48,447
Активность:
ADOLF так у sleepw тоже тирайн не учитывается...
Старый 12.03.2008, 05:54
sleepw

offline
Опыт: 8,449
Активность:
Jon каг не учитываецо? 60

sleepw добавил:
минимальная высота на котрой должен быть прож,июо дальше он в пол провалицо)
или я просто не понял о чём вы

sleepw добавил:
я вот так подумал идея глупая конечно,но что если дамми стрельнуть просто с траекторией ракеты этим снарядегом?)

sleepw добавил:
Jon зы. код меготру красиво пашет:)
сенгимего;)

sleepw добавил:
вод тока крейт юнит с фейсингом кастера не подходит,иногда бывает сбиваецо немного и прож летит боком..) придёцо юзать бж:)
Старый 12.03.2008, 06:29
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
вод тока крейт юнит с фейсингом кастера не подходит,иногда бывает сбиваецо немного и прож летит боком..) придёцо юзать бж:)
ну ты перданул то >.<
т.е. впринципе здесь виноват джон. креайтюнит + SetUnitPosition учитывают пафинг =) а кастер даёт паффинг. т.е. надо после созданиея переустановить дамми юниту позицию SetUnitX/Y
а на факте каждый раз для спелла создовать нового юнита олный бред ибо создания юнита глючней записи чтения в кеш ну так наверно почти в раз 50+ =)) (по настоящему наверно даже ~100)
так что надо делать выводы.

а вообщем этот quote жжот xD придёцо юзать бж. читаю и каждый раз смеюсь =) бж основан на коммоне...
Старый 12.03.2008, 13:34
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
ну ты перданул то >.<

^^^^



Да ладно тебе, юнит создается ведь не динамически, так что...
Цитата:
креайтюнит + SetUnitPosition учитывают пафинг =) а кастер даёт паффинг. т.е. надо после созданиея переустановить дамми юниту позицию SetUnitX/Y

на дами юните стоит москиты, летающий тип и физ азмер по нулям, нафиг ему пафинг?

Jon добавил:
Toadcop и он вообще не про пафинг, а про фейсинг (боже, что за тафтология...), просто ингда кастер кастует боком...
sleepw ну че, вместо фейсинга кастера используй англе между кастером и таргет локом^^
Старый 12.03.2008, 13:50
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Jon, он всеравно учтет это, по-моему... Помнишь, как-то мы обсуждали что с какой скоростью работает? Самый тормозной был Юнит Позишн, затем шел Позишн Лок и самый быстрый был - Юнит Х, У.
Старый 12.03.2008, 14:36
J
expert
offline
Опыт: 48,447
Активность:
FellGuard да нет, дело не скоросте а в пафинге (карте путей), в коде дами то двигетсячерез x/y, такчто проблем нет, тодкоп просто наверно имел ввиду что при создании юнита в точке кастера нужно сразу полсе переместить его в этуже точку с x/y чтобы небыло сбоя изза пафинга, но просто раз дами москиты и т.д. то это не нужно.. ну ладно вообщем...
Старый 12.03.2008, 14:41
adic3x

offline
Опыт: 108,439
Активность:
я кста хочу заметить, что афтору щас узнать как работают структуры в вЖассе, обьяснить, как реализовать общий таймер, и он станет более менее норм кодером) хотя нет ТТ
но думаю к мысли о возможности паралельного каста стоит потихоньку подходить)
Старый 12.03.2008, 15:28
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
но думаю к мысли о возможности паралельного каста стоит потихоньку подходить)

дада кстате^^ sleepw я же тебе давал сылки на статьи что нужны, ты спрашивай если че в них непонятно) начни хотябы с кеша, структуры ладно... потом...
Старый 12.03.2008, 16:04
sleepw

offline
Опыт: 8,449
Активность:
сори за оффтоп,я вот перечитывал статьи но так понятного ответа для себя ненашёл.
чем отличаюцо глобалки от тех переменных что создаюцо вручную?
почему лучше использовать кеш вместо переменных?
и если можно ссылку на почитать что такое эмм... даж нешарю шо это:))
ну к примеру
globals
native unit u
endglobals
или
library (иль шод такое)
Старый 12.03.2008, 16:28
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
начни хотябы с кеша, структуры ладно... потом...

кста читал в какой то умной книжке, что концепция ооп легче воспринимается новичками, чем теми, кто програмировал раньше в функциональных яп, поэтому это большой вопрос + кешь фтопку (по крайней мере так как он юзается в сцв) а структуры рулят
Старый 12.03.2008, 16:35
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
почему лучше использовать кеш вместо переменных?

у кеша 2 индекса, и она не целочисленые а строковые...
Если первый индекс использовать как номер таймера или триггера в который мы перебрасываем даные под вторым индексом, то в этом таймере/триггере мы сможем узнать номер егоже самого и вычитывать под этим номером переменые которые нам известны по второму индексу
*номер это типо хендл

Jon добавил:
ппц, криво сказал
Старый 12.03.2008, 16:36
Закрытая тема

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

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

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

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



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