|
|
|
|
[Вопрос] Смещение
|
|
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))
|
|
|
|
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) Если двигать снаряд в сторону взгляда этого снаряда, то будет лететь еще кривее. ты проверял? я говорю, потому что проверял и ничего не криво
|
|
|
|
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
Блокировки:
| Мб дамик кого то атаковать пытается и разворачивается в начале? Или мб унего большой физ. размер и он криво создаётся? Мб ты разворачиваешь дамик, что нельзя сделать моментально и берёшь значение угла его фейса или типа того?
|
|
|
|
Smartaros | Дата: Пятница, 06 Сентября 2013, 13:49:33 | Сообщение # 10 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| Melodia, нет, при касте скилла и я сохраняю угол между кастующим гороем и точкой заклинания, далее создаю даммика с ориентацией в этот угол, и потом как угодно двигать (либо в сторону взгляда даммика, либо напрямую по направлению этого сохраненного угла) все равно летит неровно. Короче на скрине все видно, я запустил даммиков под углами 0,45,90,...и т.д. градусов.
|
|
|
|
|
|
|
|
|
|
|