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

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

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

offline
Опыт: 49,964
Активность:
У меня молния движется криво
У меня возникают трудности с координатами молнии. Там вот есть координаты двух точек (начала и конца). Вот точка начала молнии движется нормально (по указанным координатам), то вот конец молнии все портит, двигается как вдумается
.
//создаю молнию
Код:
set lg = AddLightning("HWSB", true, x, y, x, y)


Все движения молнии связаны с невидимым даймиком. Я по его координатам двигаю молнию, вернее начало молнии.
Вот координаты. Движется даймик к цели. Короче Длина молнии должна быть 200 единиц. Поэтому я вычел (я думал косинусы и синусы исправят). В принципе я не знаю по какой формуле вычислять координаты конца, если известно расстояние и положение даймика

Код:
set x = GetUnitX(s) //координаты даймика
set y = GetUnitY(s)
set x2 = GetUnitX(u) //координаты цели
set y2 = GetUnitY(u)
set a = Atan2(y2 - y, x2 - x)
set x3 = x + MSDPS() / 33. * Cos(a) //координаты для даймика
set y3 = y + MSDPS() / 33. * Sin(a)
call SetUnitFacing(s, (bj_RADTODEG * a))
call SetUnitX(s, x3)
call SetUnitY(s, y3)   
set xx = x + MSDPS()-200 / 33. * Cos(a) //координаты для молнии
set yy = y + MSDPS()-200 / 33. * Sin(a)
set X=xx
set Y=yy
call MoveLightningEx(LoadLightningHandle(udg_hash, id, 6),true, X, Y, 1, GetUnitX(s),  GetUnitY(s), 1)


а потом двигаю даймика к кастеру.

Код:
set x3 = GetUnitX(u2) //координаты кастера
set y3 = GetUnitY(u2)
set x2 = GetUnitX(s) //координаты даймика
set y2 = GetUnitY(s)
set a = Atan2(y3 - y2, x3 - x2)
set x = x2 + MSDPS() / 33. * Cos(a)
set y = y2 + MSDPS() / 33. * Sin(a)
call SetUnitFacing(s, (bj_RADTODEG * a))
call SetUnitX(s, x)
call SetUnitY(s, y)
set a = Atan2(y3-Y, x3-X)
set xx = x2 + MSDPS()-200 / 33. * Cos(a)
set yy = y2 + MSDPS()-200 / 33. * Sin(a)
set X=xx
set Y=yy
call MoveLightningEx(LoadLightningHandle(udg_hash, id, 6),true, GetUnitX(s), GetUnitY(s), 1, X, Y, 1)


слишком много переменных так получалось с эксперементами. Ну ладно, пока надо что-то делать. Вот по картинке (см. скрин) там молния движется вообще не так. Зеленая точка - кастер, черная линия - молния, а красным шрифтом показано как движется

Steal nerves добавил:
я вот вспомнил. знаю что эта формула поможет только вот как (мне надо молнию длиною 200)
Код:
set dx = x3 - x2
set dy = y3 - y2
set d = SquareRoot(dx * dx + dy * dy)

вот есть d=200, y2,x2. Найти надо x3,y3.
Миниатюры
Кликните на картинку для увеличения
Название:  DDD.gif
Просмотров: 25
Размер:  7.1 Кбайт  
Прикрепленные файлы
Тип файла: w3x ZZ.w3x (47.4 Кбайт, 5 просмотров )

Отредактировано Steal nerves, 06.08.2013 в 12:35.
Старый 06.08.2013, 11:39
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
короче буду за компом скачаю карту, если ты не можешь обьяснить что скилл делает
Старый 06.08.2013, 12:18
MpW

offline
Опыт: 49,964
Активность:
Sargaraser, это аура паладина. Короче для начала я хочу сделать движение молнии. Короче каждую секунду выбираю юнита, есл это дружественный юнит и он ранен, пускаем молнию и лечим юнита, если же нежить то наносим урон. Целительная волна исходит от кастера и движется до цели, и потом возвращается обратно.

Steal nerves добавил:
ты меня спрашиваешь зачем уравнение? так это оттуда я мог составить формулу нахождения неизвестной координаты (а у меня две неизвестные x,y). И тут облом (два неизвестных числа в уравнении не найдешь то что нужно). короче в интернете посмотрю. Я где-то в школе проходил расстояние между точками. Надо вспомнить. Может есть
Старый 06.08.2013, 12:26
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
тебе не нужно никаких левых уравнений -_- бершь угол от кастера до нужных координат и молния будет двигатся туда\обратно\как угодно просто нужно задавать угол в полярках и все
Старый 06.08.2013, 12:35
MpW

offline
Опыт: 49,964
Активность:
Sargaraser, я не очень понимаю что ты хочешь от меня.
Старый 06.08.2013, 12:39
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
та же ситуация
Sargaraser добавил:
тебе надо пикать юнитов в радиусе от кастера и потом запускать к ним молнии? туда обратно
Старый 06.08.2013, 12:42
LOR_D
    
offline
Опыт: 8,450
Активность:
Steal_nerves, у меня создалось ощущение, что эти строки левые:
set xx = x2 + MSDPS()-200 / 33. * Cos(a)
set yy = y2 + MSDPS()-200 / 33. * Sin(a)
По-моему надо:
set xx = x2 + (MSDPS() / 33.-200) * Cos(a)
set yy = y2 + (MSDPS() / 33.-200) * Sin(a)
Старый 06.08.2013, 12:44
MpW

offline
Опыт: 49,964
Активность:
Sargaraser, слушай я это знаю. Я хорошо разбираюсь в этом =)) Но мне нужна формула, а не это.

http://oldskola1.narod.ru/trigF28.htm

Steal nerves добавил:
да нет блин

Код:
native MoveLightningEx takes lightning whichBolt, boolean checkVisibility, real x1, real y1, real z1, real x2, real y2, real z2 returns boolean


вот есть две точки A и B.
A(x1,y1) B(x2,y2) - координаты, которые надо поставить в нативку MoveLightningEx

A и B - расстояние между точками (длина молнии).

точка A - положение даймика
а точка B - это как раз неизвестное иследовательно неизвестные x2, y2
(наверное надо как то по-другому алгоритм строить, но не знаю как)

Steal nerves добавил:
LOR_D, ты конечно прав (правила математики). Но я пробовал уже =(( также

Отредактировано Steal nerves, 06.08.2013 в 13:12.
Старый 06.08.2013, 12:57
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
опиши действие спелы пошагово,я нихрена не понял
Старый 06.08.2013, 13:24
MpW

offline
Опыт: 49,964
Активность:
Nerevar, у меня спел незаконченный.

Код:
globals
integer TT=0
boolexpr f 
endglobals

constant function MSDID takes nothing returns integer
    return 'h000' // The dummy's ID (ctrl + d in object editor)
endfunction

function MSAMB takes nothing returns real
    return 30.00 // The mana burn increment per level (e.g. if this is set to 30.00 and MSIMB is set to 70.00, level 1 will burn upto 100 base mana, level 2 upto 130 mana etc)
endfunction

function MSPDI takes nothing returns real
    return 120.00 // This is the percentage of mana burn increase (if set to 120.00 = 20% increase per bounce)
endfunction

function MSEOM takes nothing returns string
    return "Abilities\\Spells\\Other\\GeneralAuraTarget\\GeneralAuraTarget.mdl" // The effect path if the snake returns to the caster
endfunction

function MSEOT takes nothing returns string
    return "Abilities\\Spells\\Other\\GeneralAuraTarget\\GeneralAuraTarget.mdl"// The effect path if the snake hits an enemy
endfunction

function MSEAM takes nothing returns string
    return "origin" // The attachment point for the effect if the snake returns to the caster
endfunction

function MSEAT takes nothing returns string
    return "origin" // The attachment point for the effect if the snake hits an enemy
endfunction

function MSDPS takes nothing returns real
    return 300.00 // This is the distance the snake will travel per second
endfunction

function MSRAOE takes nothing returns real
    return 100.00 // This is the max distance the snake must be to return to the caster to restore mana
endfunction

function MSAAOE takes nothing returns real
    return 50.00 // This is the max distance the snake must be to attack a unit and steal mana
endfunction

function MSSR takes nothing returns real
    return 400.00 // This is the search radius the snake will check units in after it has mana burned a different unit
endfunction

function Trigs takes nothing returns boolean
    return( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(gg_unit_N000_0010)))and( not IsUnitDeadBJ(GetFilterUnit()))
endfunction

function Loop takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local integer bn
    local unit s = LoadUnitHandle(udg_hash, id, 1)
    local unit u
    local unit u2
    local unit u3
    local unit u4 = LoadUnitHandle(udg_hash, id, 2)
    local real x
    local real x2
    local real x3
    local real y
    local real y2
    local real y3
    local real a
    local real d
    local real m
    local real m2
    local real dx
    local real dy
    local real dmg
    local real h =LoadReal(udg_hash, id, 7)
    local real X
    local real Y
    local real xx
    local real yy
    set u2 = LoadUnitHandle(udg_hash, id, 0) //u2 - кастер
    if u4 == null then
    if IsUnitType(u2, UNIT_TYPE_DEAD) then  //если кастер мертв, то удаляем молнию и даммика и таймер и стираем из хэша
        set g = LoadGroupHandle(udg_hash, id, 4)
        call DestroyGroup(g)
        set g = null
        call FlushChildHashtable(udg_hash, GetHandleId(LoadUnitHandle(udg_hash, id, 2)))
        call ReleaseTimer(t)
        call KillUnit(s)
        set TT=TT-1
        call DestroyLightning(LoadLightningHandle(udg_hash, id, 6))
        call FlushChildHashtable(udg_hash, GetHandleId(LoadUnitHandle(udg_hash, id, 2))) //стираем из памяти цели единичку
        call FlushChildHashtable(udg_hash, id)
      else //иначе двигаем дамми юнит к кастеру
        set x3 = GetUnitX(u2) //координаты кастера
        set y3 = GetUnitY(u2)
        set x2 = GetUnitX(s) //координаты даймика
        set y2 = GetUnitY(s)
        //вычисляем расстояние d
        set dx = x3 - x2
        set dy = y3 - y2
        set d = SquareRoot(dx * dx + dy * dy)
        if d <= MSRAOE() then //если расстояние пройденное даймиком к кастеру меньше допустимого то удаляем молнию 
          call FlushChildHashtable(udg_hash, GetHandleId(LoadUnitHandle(udg_hash, id, 2)))
          call DestroyTimer(t)
          call KillUnit(s)
          set TT=TT-1
          call DestroyLightning(LoadLightningHandle(udg_hash, id, 6))
          call FlushChildHashtable(udg_hash, id)
        else //иначе двигаем даймика к кастеру
          set a = Atan2(y3 - y2, x3 - x2)
          set x = x2 + MSDPS() / 33. * Cos(a)
          set y = y2 + MSDPS() / 33. * Sin(a)
          call SetUnitFacing(s, (bj_RADTODEG * a))
          call SetUnitX(s, x)
          call SetUnitY(s, y)
          set a = Atan2(y3-Y, x3-X)
          set xx = x2 + MSDPS()-200 / 33. * Cos(a)
          set yy = y2 + MSDPS()-200 / 33. * Sin(a)
          set X = x2 + ((MSDPS() / 33.)-200)
          set Y = y2 + ((MSDPS() / 33.)-200)
          set X=xx
          set Y=yy
          //call SaveReal(udg_hash, id, 7, mn)
          
          call MoveLightningEx(LoadLightningHandle(udg_hash, id, 6),true, GetUnitX(s), GetUnitY(s), h, X, Y, h)
        endif
      endif
      set u2 = null
    else //иначе если есть цель
      set x = GetUnitX(s) //координаты даймика
      set y = GetUnitY(s)
      set u = LoadUnitHandle(udg_hash, id, 2)
      set x2 = GetUnitX(u) //координаты цели
      set y2 = GetUnitY(u)
      //проверяем расстояние
      set dx = x2 - x
      set dy = y2 - y
      set d = SquareRoot(dx * dx + dy * dy)
      if d <= MSAAOE() then //если расстояние между кастером и цели меньше или равно допустимой то дамажим или лечм
        if not IsUnitType(u, UNIT_TYPE_DEAD) then //если цель не мертва то наносим урон и высасываем ману
          //дамажим или лечим (пока я потом напишу)
        endif
        call FlushChildHashtable(udg_hash, GetHandleId(LoadUnitHandle(udg_hash, id, 2))) //очищаем единицу
        call RemoveSavedHandle(udg_hash, id, 2) //очищаем цель
        set u2 = null
      else //если расстояние между целью и даймиком больше то двигаем дамми к кастеру
        set a = Atan2(y2 - y, x2 - x)
        set x3 = x + MSDPS() / 33. * Cos(a) //координаты чтобы двигать даймика s (а еще это начальные координаты GetUnitX(s), GetUnitY(s))
        set y3 = y + MSDPS() / 33. * Sin(a)
        call SetUnitFacing(s, (bj_RADTODEG * a))
        call SetUnitX(s, x3)
        call SetUnitY(s, y3)

        set X = x + ((MSDPS() -200)/ 33.) //координаты для второй точки
        set Y = y + ((MSDPS() -200)/ 33.)
        set a = Atan2(y2 - Y, x2 - X)
        set X=xx*. * Cos(a) //умножаем на угол
        set Y=yy*. * Sin(a)
        call MoveLightningEx(LoadLightningHandle(udg_hash, id, 6),true, X, Y, 1, GetUnitX(s),  GetUnitY(s), 1)
      endif
      set u = null
    endif
    set t = null
    set s = null
    set u4 = null
endfunction

function Start takes nothing returns boolean
    local timer t
    local unit u2
    local real x
    local real y
    local integer id
    local integer it
    local lightning a
    local group g = CreateGroup()
    local real tm
    set x = GetUnitX(gg_unit_N000_0010) //координаты королевы змеи, короче кастера
    set y = GetUnitY(gg_unit_N000_0010)
    call GroupEnumUnitsInRange(g, x, y, 900, f) //пикаем всех враждебных в радиусе
    loop
        set u2=FirstOfGroup(g) //выбираем первого попавшего в группе
        exitwhen u2 == null
        //Проверяем запущено ли в него молния LoadInteger(udg_hash, it, 0) !=1
        //переменная TT - кол-во молнии, их должно быть не больше 4
        if LoadInteger(udg_hash, it, 0) !=1 and u2!=null and (not IsUnitType(u2, UNIT_TYPE_DEAD)) and TT<=4 then 
         set t = CreateTimer() //создать таймер
        set id = GetHandleId(t)
        set it = GetHandleId(u2) 
        //создаем дайми
        set bj_lastCreatedUnit = CreateUnit(Player(0), MSDID(), x, y, bj_RADTODEG * Atan2(GetUnitY(u2) - y, GetUnitX(u2) - x))
        //создаем молнию тут я не знаю какие вторые координаты (вот собственно и вопрос по теме)
        set a = AddLightning("HWSB", true, x, y, x, y)
        //запускаем таймер
        call TimerStart(t, 0.02125, true, function Loop)
        //сохраняем кастера
        call SaveUnitHandle(udg_hash, id, 0, gg_unit_N000_0010)
        //сохраняем даймика
        call SaveUnitHandle(udg_hash, id, 1, bj_lastCreatedUnit)
        //сохраняем цель
        call SaveUnitHandle(udg_hash, id, 2, u2)
        //сохраняем молнию
        call SaveLightningHandle(udg_hash, id, 6, a)
        //кол-во запусков прибавляем на 1 единицу
        set TT=TT+1
        //сохраняем единицу по хендлу цели, чтобы потом проверять есть ли у него молния, а то лишние насоздает 
        call SaveInteger(udg_hash, it, 0, 1)  
        endif
        
        call GroupRemoveUnit(g,u2)
        set u2 = null
    endloop
    call DestroyGroup(g)
    set u2 = null
    set t = null
    set g = null
    set a = null
    return false
endfunction

function InitTrig_Mystic_Snake takes nothing returns nothing
    local trigger t = CreateTrigger()
    set f = Condition(function Trigs)
    call TriggerRegisterTimerEvent( t, 1.00, true )
    call TriggerAddCondition( t, Condition( function Start ) )
    set udg_hash = InitHashtable()
    set t = null
endfunction

Отредактировано Steal nerves, 06.08.2013 в 14:36.
Старый 06.08.2013, 14:13
LOR_D
    
offline
Опыт: 8,450
Активность:
Steal_nerves, молния так должна двигаться?
Прикрепленные файлы
Тип файла: w3x ZZ.w3x (43.4 Кбайт, 13 просмотров )
Старый 06.08.2013, 15:10
MpW

offline
Опыт: 49,964
Активность:
LOR_D, да, еще она обратно должна идти =) ну так. Спасибо)
Старый 06.08.2013, 15:22
LOR_D
    
offline
Опыт: 8,450
Активность:
Steal_nerves, не благодари, я ведь всего-то скобочки правильно поставил
Старый 06.08.2013, 15:23
MpW

offline
Опыт: 49,964
Активность:
LOR_D, Спасибо)) Я доделал =). Можно закрывать
Старый 06.08.2013, 15:55
Закрытая тема

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

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

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

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



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