Сейчас 12:01:16 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Смещение
SmartarosДата: Четверг, 05 Сентября 2013, 09:10:41 | Сообщение # 1
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Решил снова начать ковыряться в we и наткнулся на эту проблемку, короче герой кастует спелл в точку, создается снаряд и летит в направлении угла между кастером и точкой заклинания, но как видно на скрине он летит криво, причем "кривость" различится если стрелять в разные стороны, ошибку не могу углядеть.

Ну а тут каляки:
Код
void SafeMovePolar(unit u, real dist, real angle)
     {  
         real x = GetWidgetX(u) + dist * Cos(angle * 0.017)
         real y = GetWidgetY(u) + dist * Sin(angle * 0.017)
         if x > minX && x < maxX { SetUnitX(u, x) }  
         if y > minY && y < maxY { SetUnitY(u, y) }  
     }  

     private void MoveShall()
     {
         timer t = GetExpiredTimer(); timer tim = t
         unit d = LoadUnitHandle(Hash, GetHandleId(t), 0)
         real x = GetWidgetX(d); real y = GetWidgetY(d)
         unit u = LoadUnitHandle(Hash, GetHandleId(t), 1)
         player p = GetOwningPlayer(u)
         unit c = GCESU(p, x, y, POISON_DART_AOE)
         real a = LoadReal(Hash, GetHandleId(t), 2)
         real dist = LoadReal(Hash, GetHandleId(t), 3)
         int lvl = LoadInteger(Hash, GetHandleId(t), 4)
         real step = LoadReal(Hash, GetHandleId(t), 5)
         int level = LoadInteger(Hash, GetHandleId(t), 6)
         int ch = GetRandomInt(1, 100)
         real dmg = POISON_DART_DMG1(lvl)
          
         if ch <= LETHAL_DOSE_CH { dmg = LETHAL_DOSE_DMG(POISON_DART_DMG1(lvl), level) }
          
         if c != null
         {
             KillUnit(d)
             DamageUnit(u, c, dmg, "poison", true)
             d = CreateUnit(GetOwningPlayer(u), DUMMY, x, y, 0)
             UnitAddAbility(d, POISON_DART_AB_SL)
             SetUnitAbilityLevel(d, POISON_DART_AB_SL, lvl)
             IssueTargetOrder(d, "bloodlust", c)
             UnitApplyTimedLife(d, 'BTLF', 0.5)
             PauseTimer(t); DestroyTimer(t)
             FlushChildHashtable(Hash, GetHandleId(t))
              
             tim = new timer
             SaveUnitHandle(Hash, GetHandleId(tim), 0, u)
             SaveUnitHandle(Hash, GetHandleId(tim), 1, c)
             SaveReal(Hash, GetHandleId(tim), 2, POISON_DART_DMG2(lvl))
             SaveInteger(Hash, GetHandleId(tim), 3, level)
             TimerStart(tim, POISON_DART_TIME, false, function FinishDamage)
         }
         if dist > 0.0
         {
             SafeMovePolar(d, step, a)
             SaveReal(Hash, GetHandleId(t), 3, dist - step)
         }
         else
         {
             KillUnit(d); PauseTimer(t); DestroyTimer(t)
             FlushChildHashtable(Hash, GetHandleId(t))
         }
          
         t = null; tim = null; d = null; u = null; c = null
     }

     callback onUnitSpellEffect(POISON_DART_AB)
     {
         unit u = GetTriggerUnit(); timer t = new timer
         int lvl = GetUnitAbilityLevel(u, POISON_DART_AB)
         int level = GetUnitAbilityLevel(u, LETHAL_DOSE_AB)
         real x1 = GetWidgetX(u); real y1 = GetWidgetY(u)
         real x2 = GetSpellTargetX(); real y2 = GetSpellTargetY()
         real a = 57.296 * Atan2(y2 - y1, x2 - x1)
         real x3 = x1 + Cos(a * 0.017) * POISON_DART_AOE
         real y3 = y1 + Sin(a * 0.017) * POISON_DART_AOE
         unit d = CreateUnit(GetOwningPlayer(u), POISON_DART_SH, x3, y3, a)
          
         SetUnitScale(d, 1.0, 2.5, 2.5)
         SetUnitPathing(d, false)
         SetUnitX(d, x3); SetUnitY(d, y3)
         SaveUnitHandle(Hash, GetHandleId(t), 0, d)
         SaveUnitHandle(Hash, GetHandleId(t), 1, u)
         SaveReal(Hash, GetHandleId(t), 2, a)
         SaveReal(Hash, GetHandleId(t), 3, POISON_DART_DIST - POISON_DART_AOE)
         SaveInteger(Hash, GetHandleId(t), 4, lvl)
         SaveReal(Hash, GetHandleId(t), 5, POISON_DART_STEP(lvl))
         SaveInteger(Hash, GetHandleId(t), 6, level)
         TimerStart(t, POISON_DART_PER, true, function MoveShall)
          
         u = null; t = null; d = null
     }
 

DiabfallДата: Четверг, 05 Сентября 2013, 09:36:11 | Сообщение # 2
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата (Smartaros)
Sin(a * 0.017)

раз тут так, то
local real a=0.017 * Atan2(y2 - y1, x2 - x1)
а
Sin(a * 57.296 )
Cos(a * 57.296 )

----
тупость офк написал


Сообщение отредактировал Diabfall - Четверг, 05 Сентября 2013, 10:41:39
 

SmartarosДата: Четверг, 05 Сентября 2013, 09:53:45 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Diabfall, подставил, теперь всегда летит под 0 градусов, т.е. вправо

а, ты исправил пост, ну ща переделаю

Добавлено (05 Сентября 2013, 09:51:43)
---------------------------------------------
тоже самое короче, мб это глюк? абилу эту делал на основе аналогичной, которую давно сделал, только она норм работает и прямо летит

Добавлено (05 Сентября 2013, 09:53:45)
---------------------------------------------
кривизна начинается после 180 градусов, если меньше, к примеру 179, то снаряд летит под 160 где то, если 250, то летит где то под 260, как то так

Сообщение отредактировал Smartaros - Четверг, 05 Сентября 2013, 09:44:14
 

HexingДата: Четверг, 05 Сентября 2013, 13:04:20 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
приведи в порядок код, как тут не запутаться?
Код
function GetAbilityIdPoisonDart takes nothing returns integer
     return 'ABL1'
endfunction
function GetAbilityIdLethalDose takes nothing returns integer
     return 'ABL2'
endfunction
function GetAbilityAoePoisonDart takes nothing returns real
     return 450.0
endfunction
function GetDummyIdPoisonDart takes nothing returns integer
     return 'dmmy'
endfunction
      
function CastPoisonDart takes nothing returns nothing
     local unit caster = GetTriggerUnit()
     local integer lvlSkill = GetUnitAbilityLevel(caster, GetAbilityIdPoisonDart())
     local integer lvlBuff = GetUnitAbilityLevel(caster, GetAbilityIdLethalDose())
     local real x = GetWidgetX(caster)
     local real y = GetWidgetY(caster)
     local real tx = GetSpellTargetX()
     local real ty = GetSpellTargetY()
     local real angle = Atan2(ty-y, tx-x)
     local unit dummy
     set x = x + Cos(angle) * GetAbilityAoePoisonDart()
     set y = y + Sin(angle) * GetAbilityAoePoisonDart()
     set dummy = CreateUnit(GetOwningPlayer(caster), GetDummyIdPoisonDart(), x, y, angle * 57.295779)
     call SetUnitPathing(dummy, false)
     call SetUnitScale(dummy, 1.0, 2.5, 2.5)
     call SetUnitX(dummy, x)
     call SetUnitY(dummy, y)
     /* ... */
endfunction
      
function InitPoisonDart takes nothing returns nothing
     local trigger trig = CreateTrigger()
     call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
     call TriggerAddAction(trig, function CastPoisonDart)
     set trig = null
endfunction

потом время будет допишу, щас устал


 

MelodiaДата: Четверг, 05 Сентября 2013, 19:46:45 | Сообщение # 5
Группа: Проверенные
Сообщений: 8026
Награды: 5
Репутация: 5051
Блокировки:
снаряд просто должен лететь вперёд?????
почему просто не создать его лицом >нужный угол< и не
call SetUnitX(udg_Unit[100],GetWidgetX(udg_Unit[100])+25*Cos(GetUnitFacing (udg_Unit[100]) * bj_DEGTORAD))
call SetUnitY(udg_Unit[100],GetWidgetY(udg_Unit[100])+25*Sin(GetUnitFacing (udg_Unit[100]) * bj_DEGTORAD))


CM wars 1.15
ЭПОХА АНИМИРОВАННЫХ ТРИГГИРАФ ПРЕШЛА
 

SmartarosДата: Пятница, 06 Сентября 2013, 09:08:17 | Сообщение # 6
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Цитата (Hexing)
приведи в порядок код, как тут не запутаться?

Ну мне норм, я так привык. Кстати чем отличается то?
Цитата (Melodia)
почему просто не создать его лицом >нужный угол<

Если двигать снаряд в сторону взгляда этого снаряда, то будет лететь еще кривее.

Добавлено (06 Сентября 2013, 09:08:17)
---------------------------------------------
Я вообще не понимаю короче, все другие подобные спеллы со смещением сделаны по такой же конструкции, и смещение там ровное, а здесь белиберда

 

MelodiaДата: Пятница, 06 Сентября 2013, 09:43:30 | Сообщение # 7
Группа: Проверенные
Сообщений: 8026
Награды: 5
Репутация: 5051
Блокировки:
Цитата (Smartaros)
Если двигать снаряд в сторону взгляда этого снаряда, то будет лететь еще кривее.

ты проверял?
я говорю, потому что проверял и ничего не криво


CM wars 1.15
ЭПОХА АНИМИРОВАННЫХ ТРИГГИРАФ ПРЕШЛА
 

SmartarosДата: Пятница, 06 Сентября 2013, 09:52:02 | Сообщение # 8
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Цитата (Melodia)
ты проверял?

да
Цитата (Smartaros)
все другие подобные спеллы со смещением сделаны по такой же конструкции, и смещение там ровное, а здесь белиберда

Реал только здесь такая хрень, в моих старых спеллах я и по фейсу двигал, и под углом - все ровно. Может как то в РО не так с даммиком?

Добавлено (06 Сентября 2013, 09:52:02)
---------------------------------------------
Меня так выбесила эта кривизна, что я сам попытался раскрыть функцию Atan2, пытался найти угол без тригонометрии, но все равно все упирается в обратные тригонометрические функции, а для их вычисления такой неслабенький код есть, и то он написан на том языке, который я даже близко не знаю, паскаль бы еще как то разобрал...


Сообщение отредактировал Smartaros - Пятница, 06 Сентября 2013, 09:53:02
 

MelodiaДата: Пятница, 06 Сентября 2013, 10:40:15 | Сообщение # 9
Группа: Проверенные
Сообщений: 8026
Награды: 5
Репутация: 5051
Блокировки:
Мб дамик кого то атаковать пытается и разворачивается в начале?
Или мб унего большой физ. размер и он криво создаётся?
Мб ты разворачиваешь дамик, что нельзя сделать моментально и берёшь значение угла его фейса или типа того? :D


CM wars 1.15
ЭПОХА АНИМИРОВАННЫХ ТРИГГИРАФ ПРЕШЛА
 

SmartarosДата: Пятница, 06 Сентября 2013, 13:49:33 | Сообщение # 10
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Melodia, нет, при касте скилла и я сохраняю угол между кастующим гороем и точкой заклинания, далее создаю даммика с ориентацией в этот угол, и потом как угодно двигать (либо в сторону взгляда даммика, либо напрямую по направлению этого сохраненного угла) все равно летит неровно.
Короче на скрине все видно, я запустил даммиков под углами 0,45,90,...и т.д. градусов.
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz