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

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

Ответ
 
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Увеличение скорости юнита без изменения пройденной дистанции
Задача-увеличивать скорость юнита с периодом q, чтоб общее расстояние, пройденное за секунду, увеличивалось на z едениц.
Всё не могу понять что ж за прогрессия такая :3
Старый 25.07.2012, 19:33
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Арифметическая
Глобальная переменная которую увеличиваешь на Х число каждый раз и когда надо обнуляешь

И каждую сек делаешь, скорость юнита равной Х
Старый 25.07.2012, 19:35
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Так казус именно в периоде, он не равен 1 секунде. 0.1, например.
Старый 25.07.2012, 19:37
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Старый 25.07.2012, 19:50
ScorpioT1000
Работаем
offline
Опыт: отключен
Diaboliko, чтобы сделать период, создай глобалку "LOOP_PERIOD = 0.04" потом допустим у тебя speed = 5 м/с
в коллбеке делаем (положение типа в метрах например) set x = x + (speed * LOOP_PERIOD) * ну тут косинусы всякие и другие вектора
пускаем таймер с периодом LOOP_PERIOD
ScorpioT1000 добавил:
constant real TPC_Moving_Period = 0.04
// === MAIN LOOP ===
void MoveUnit_Move(real f, real b, boolean turn) {
    set Step = GetJackSpeed()*TPC_Moving_Period
//...
    TriggerRegisterTimerEvent( gg_trg_PeriodicMovingScr, TPC_Moving_Period, true )
    TriggerAddCondition( gg_trg_PeriodicMovingScr, Condition( function Trig_PeriodicMoving_Conditions ) )
    TriggerAddAction( gg_trg_PeriodicMovingScr, function Game_MoveUnit_GetAngle )
// ну тут цепочка функций и в итоге пускается верхняя
ScorpioT1000 добавил:
вот пример из jc
ScorpioT1000 добавил:
вот акселерация еще тебе, тут много всего, но суть ясна - помимо координат храним динамический множитель от 1 (норм состояние) до MAX
    //rotation (degree*TPC_PM per TPC_Moving_Period)
    #define TPC_ROTATION_ACCELERATION = 2.2
    // [points of normal rotation] per second^2
    #define TPC_ROTATION_ACC_MAX = 2.4
    real TPC_STATIC_ROTATION = 3.08
    real TPC_DYNAMIC_ROTATION = 2.15
    real TPC_DYNAMIC_ROTATION_BACK = 3.85
private void ModifyRotationAccelerator(bool rightSide) {
    if(rightSide != RotationAccelerationSide) {
        ResetRotationAccelerator()
    }
    if(RotationAcceleration > TPC_ROTATION_ACC_MAX) {
        RotationAcceleration = TPC_ROTATION_ACC_MAX
    } elseif(RotationAcceleration < TPC_ROTATION_ACC_MAX-0.01) {
        RotationAcceleration = RotationAcceleration + (TPC_ROTATION_ACCELERATION*TPC_Moving_Period)
    }
    RotationAccelerationSide = rightSide
}
void Game_MoveUnit_GetAngle() {
    real f = GetUnitFacing(udg_Jack1)
    real ACAngle

    if(udg_R_Up==udg_R_Down) { // ==> Только Вращение вправо
        if(udg_R_Right && (! udg_R_Left)) {
            ModifyRotationAccelerator(true)
            ACAngle = -TPC_STATIC_ROTATION * TPC_PM * RotationAcceleration
            RotateUnit_Move(ACAngle,f,0.0,true)
        } elseif(udg_R_Left && (! udg_R_Right)) { // <== Только Вращение влево
            ModifyRotationAccelerator(false)
            ACAngle = TPC_STATIC_ROTATION * TPC_PM * RotationAcceleration
            RotateUnit_Move(ACAngle,f,0.0,true)
        } else {  // Не нажата ни одна кнопка
            ResetRotationAccelerator()
            MoveUnit_Move(0.0,0.0,false)
        }
// ...

Отредактировано ScorpioT1000, 25.07.2012 в 20:11.
Старый 25.07.2012, 20:02
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Скорп, период изменения скорости и движения различны.
Наглядно: юнит должен проходить 300+60/сек расстояния. Движение происходит каждые 0.02 сек, скорость меняется каждые 0.1 сек.
Старый 25.07.2012, 20:03
ScorpioT1000
Работаем
offline
Опыт: отключен
ну так у меня за это функция отвечает
set Step = GetJackSpeed()*TPC_Moving_Period
GetJackSpeed() возвращает скорость Джека, а я ему могу в любом триггере менять как хочу и всё будет ок
ScorpioT1000 добавил:
Step это по сути и есть скорость тока не точек в секунду, а точек в такт функции
ScorpioT1000 добавил:
сделай 2 триггера - главный работает с математикой, берет все значения из функций, другие уже оперируют данными - скорость итп
Старый 25.07.2012, 20:08
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Я так и не понял как меняя скорость раз в X секунд, при том двигая юнита раз в Y секунд, пройти Z точек. Как Я понял, то, что было скинуто про джека, вообще не расчитано на изменение скорости, а асселерейшн с поворотом-без фул кода понять сложно.
Старый 25.07.2012, 20:21
ScorpioT1000
Работаем
offline
Опыт: отключен
ну так у меня за это функция отвечает
set Step = GetJackSpeed()*TPC_Moving_Period
GetJackSpeed() возвращает скорость Джека, а я ему могу в любом триггере менять как хочу и всё будет ок
что именно здесь неясно?
Старый 25.07.2012, 20:41
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Что есть GetJackSpeed(), кодом? Как Я понимаю, мы двигаем, допустим, с целью получить 60 точек, юнита каждые 0.02 сек на 1.2 точки в твоем случае.
Старый 25.07.2012, 20:53
ScorpioT1000
Работаем
offline
Опыт: отключен
есть 2 независимые вещи:
  • мы двигаем юнита, берем GetJackSpeed каждые 0.04 сек, двигаем куда и как хотим
  • мы задаем каждые 0.1 сек JackSpeed = x
в чем беда? 1 всеравно чаще 2, все нормально
Старый 25.07.2012, 21:13
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
-_- Как планируется подгонять эту фигню под конкретные значения?
В моем случае юнит двигается на скорости 60(+30 за лвл способности)+20(+5 за лвл способности)/сек. То есть на 8 уровне скила, он же последний, юнит должен пройти 360 за 1ю секунду, еще 420, всего 780 за вторую секунду.
Старый 25.07.2012, 21:19
ScorpioT1000
Работаем
offline
Опыт: отключен
А это функцией спелла задается? я думал у тебя просто произвольное движение игроком и скорость меняем. тогда да, тут пофиг, все делается в 1 - задаем акселератор на нужные значения и дальше как хочешь
Старый 25.07.2012, 21:22
Ответ

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

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

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

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



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