Перейти к содержанию

Antonshka

Пользователи+
  • Постов

    410
  • Зарегистрирован

  • Посещение

  • Победитель дней

    16

Сообщения, опубликованные Antonshka

  1. Перемещение объекта из точки А в точку Б, с постоянной скоростью, с плавным ускорением в начале и с плавным замедлением в конце, нашло себе успешное применение в эффекте приближения, при стрельбе из лука.

    Спойлер

     

     

    • Плюс 1
  2. На самом деле мне кажется тема достаточно интересная, - плавное прямолинейное перемещение объекта из одной точки в другую в 3D пространстве с постоянной скоростью, не зависящей от расстояния (+ по желанию плавное ускорение в начале и плавное замедление в конце).

     

    22 часа назад, inaginary сказал:

    не проще ли вместо того что бы изгаляться сделать это же но с ускорением, при этом с постоянной скоростью движения

    Ускорение, оно же Velocity, не что иное как обычный множитель для координат, что с ним, что без него, - особой разницы нет. В обоих случаях эти 3 множителя (искусственно созданные или имеющиеся уже в игре) необходимо будет видоизменять и подстраивать под поставленную задачу.

     

    Как у тебя обстоят дела, есть ли какие-либо продвижения?

    Я закончил писать скрипт, проверил, работает.

  3. 10 часов назад, inaginary сказал:

    не проще ли вместо того что бы изгаляться сделать это же но с ускорением, при этом с постоянной скоростью движения

    Конечно так проще, но в том то и есть весь спортивный интерес, чтобы попытаться сделать примерно тоже, но без использования Velocity

     

    9 часов назад, inaginary сказал:

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

    Если будет желание, то напиши полностью рабочий скрипт + видео к нему. Свой скрипт я уже почти дописал, и также в случае  работоспособности, я выложу его здесь.

  4. При способе, который ты используешь, не будет ли движение не прямолинейное?

     

    Спойлер

    123jpg_3338126_29430011.jpg

     

    Здесь на рисунке, координаты игрока X = 0, Z = 0, координаты точки назначения X = 10, Z = 2. Если начать одновременно прибавлять 1 к Z координате, и 1 к X координате, то после того как значение Z уже станет равным 2, прибавление к X координате всё ещё будет продолжаться, и как следствие получится не прямолинейное движение.

  5. Понял твою идею, у меня немного другая.

    Если доделаешь до конца и запишешь видео с результатом, по желанию конечно, - то будет очень даже неплохо.

    Я также, в случае успеха, постараюсь записать видео и выложить скрипт.

     

  6. 1 час назад, inaginary сказал:

    И как по твоей схеме должны обрабатываться расстояния меньше чем 60 метров?

    Верно подмечено

     

    Но, пусть будет так:

    Если расстояние будет (к примеру) всего 20 метров, то игрок, не закончив плавное ускорение, остановиться.

    Если расстояние будет (к примеру) всего 40 метров, то игрок, не закончив плавное замедление, остановиться.

     

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

     

    До момента написания предыдущего сообщения я не знал как осуществить эту идею. Спросил у тебя ради спортивного интереса, наверно. Сейчас уже имею примерное представление необходимой работы, но пока что это всего лишь примерное представление.

  7. 1 час назад, inaginary сказал:

    То что ты предлагаешь - полет с постоянной скоростью, реализовывается просто с прибавлением фиксированных значений к координатам

    Если есть желание, то сделай наглядный пример написанного

     

    Условия вот такие:

    1 - Использовать можно только координаты X,Y,Z игрока и X,Y,Z точки назначения

    2 - Скорость полёта должна быть одна и та же, для разных дистанций

    3 - По возможности, сделать плавное увеличение скорости в начале, и плавное уменьшение скорости в конце

     

    Плавное увеличение скорости должно происходить на протяжении первых (к примеру) 30 метрах пути, а плавное уменьшение скорости должно происходить на протяжении последних (к примеру) 30 метрах пути.

    30 метров пути в начале и в конце - расстояние статичное, для любых дистанций.

  8. 1 час назад, ReWanet сказал:

    Зачем добавлять в панель еще одну панель когда можно у первой панели сменить цвет?

    Такова особенность CE, при работе с TabSheet.

  9. Можно на TabSheet1 положить CEPanel1, растянув её по всей площади TabSheet1, а на CEPanel1 положить CEPanel2, растянув её по всей площади CEPanel1, затем изменить цвет CEPanel2.

  10. Нормализовать угол поворота камеры можно также и следующим образом

    Спойлер
    
    fld dword ptr [Value_360]
    fld dword ptr [Original_Game_Angle]
    fabs
    fprem
    fstp st(1)
    fstp dword ptr [Normalized_Angle]

     

     

    fcos и fsin работают с радианами, поэтому для корректного их использования, необходимо конвертировать значение угла из градусов в радианы

    Спойлер
    
    fld dword ptr [Value_360]
    fld dword ptr [Original_Game_Angle]
    fabs
    fprem
    fstp st(1)
    fdiv dword ptr [Degress_Converting_Value]
    fstp dword ptr [Normalized_Angle_Radians]
    
    
    Value_360:
    dd (float)360
    Degress_Converting_Value:
    dd (float)57.29577951308232

     

     

    Интересно было посмотреть на реализацию этого и предыдущего замыслов. Наверно это оттого что я и сам некогда недавно занимался этими же вопросами.

     

    *Что если необходимо сделать плавное перемещение (полёт) игрока до некоторой точки в пространстве, используя при этом лишь только 3 координаты положения игрока и 3 координаты положения точки, при условии что скорость перемещения должны быть всегда одной и той же, как для малых дистанция, так и для больших.  Так же по возможности необходимо сделать плавное увеличение и плавное уменьшение скорости полёта, например от 0 до 10 % пути, сделать плавное увеличение скорости, а от 90-100% пути сделать плавное уменьшение скорости, до 0.

    Осилил бы такую задачу?

    • Спасибо 1
    • Плюс 1
  11. Вот такой ещё вариант:

    Скрытый текст
    
    "RomeTW-BI.exe"+1817CB: 8B 45 8C              -  mov eax,[ebp-74]
    "RomeTW-BI.exe"+1817CE: D9 80 C4 00 00 00     -  fld dword ptr [eax+000000C4]
    "RomeTW-BI.exe"+1817D4: D9 5D EC              -  fstp dword ptr [ebp-14]
    "RomeTW-BI.exe"+1817D7: 8B 45 F0              -  mov eax,[ebp-10]
    // ---------- INJECTING HERE ----------       -  jmp newmem
    newmem:
    mov [eax+0000027C],(loat)80
    jmp returnhere
    // ---------- DONE INJECTING  ----------
    "RomeTW-BI.exe"+1817E3: 0F B6 45 0C           -  movzx eax,byte ptr [ebp+0C] //returnhere
    "RomeTW-BI.exe"+1817E7: 85 C0                 -  test eax,eax
    "RomeTW-BI.exe"+1817E9: 0F 84 DC 01 00 00     -  je RomeTW-BI.exe+1819CB

     

     

  12. Расчёт дистанции

    Скрытый текст
    
    fld dword ptr [Map_Coord_X] //Map_Coord_X
    fsub dword ptr [rsi] //Player_Coord_X
    fmul st(0) 
    fld dword ptr [Map_Coord_Y] //Map_Coord_Y
    fsub dword ptr [rsi+8] //Player_Coord_Y
    fmul st(0) 
    faddp st(1),st(0)
    fsqrt
    fstp dword [AutoWalk_Distance]

     

    Расчёт угла Player/Map

    Скрытый текст
    
    fld dword ptr [Map_Coord_X]//Map_Coord_X
    fsub dword [rsi]//Player_Coord_X
    fstp dword [AutoWalk_BA_X_Diff]
    fld dword ptr [Map_Coord_Y]//Map_Coord_Y
    fsub dword [rsi+8]//Player_Coord_Y
    fstp dword [AutoWalk_BA_Y_Diff]
    fld dword ptr [AutoWalk_BA_Y_Diff]
    fld dword ptr [AutoWalk_BA_X_Diff]
    fpatan
    fstp dword ptr [AutoWalk_BA_Yaw]

     

    Расчёт Player_Velocity X,Y

    Скрытый текст
    
    cmp [Auto_Walk_Checker],#0 //Проверка активности опции
    je AutoWalk_not_Act
    cmp [AutoWalk_Distance],(float)2 //Проверка минимальной дистанции
    jle AutoWalk_not_Act
    
    
    cmp [Detect_Objects_Checker],#1 // Сигнализатор прикасания к объектам (1 - прикасание имеется, 0 - нет)
    jne @f
    fld dword ptr [AutoWalk_Yaw_Compensator] // Множитель для угла Yaw
    fadd dword ptr [AutoWalk_Yaw_Compensator_Multiply_1] // Множитель_1 множителя для угла Yaw
    fstp dword ptr [AutoWalk_Yaw_Compensator]
    @@:
    
    cmp [Detect_Objects_Checker],#1
    je AutoWalk_Step_1
    cmp [AutoWalk_Yaw_Compensator],(float)0
    je AutoWalk_Step_1
    jle AutoWalk_Step_1_Set_Zero
    fld dword ptr [AutoWalk_Yaw_Compensator]
    fsub dword ptr [AutoWalk_Yaw_Compensator_Multiply_2] // Множитель_2 множителя для угла Yaw
    fstp dword ptr [AutoWalk_Yaw_Compensator]
    jmp AutoWalk_Step_1
    AutoWalk_Step_1_Set_Zero://AutoWalk_Step_1_Set_Zero
    mov [AutoWalk_Yaw_Compensator],(float)0
    
    
    AutoWalk_Step_1://AutoWalk_Step_1
    fld dword ptr [AutoWalk_BA_Yaw] // Угол Yaw между точкой назначения и точкой отправления
    fadd dword ptr [AutoWalk_Yaw_Compensator]
    fcos
    fstp dword ptr [AutoWalk_Yaw_Cos] //Косигус угла Yaw
    fld dword ptr [AutoWalk_BA_Yaw]
    fadd dword ptr [AutoWalk_Yaw_Compensator]
    fsin
    fstp dword ptr [AutoWalk_Yaw_Sin] //Синус угла Yaw
    
    
    fld dword ptr [AutoWalk_Speed] // Скорость ходьбы
    fmul dword ptr [AutoWalk_Yaw_Cos]
    fstp dword ptr [r9+rcx+40]//Plyer Velocity X
    fld dword ptr [AutoWalk_Speed]
    fmul dword ptr [AutoWalk_Yaw_Sin]
    fstp dword ptr [r9+rcx+48]//Plyer Velocity Y
    
    
    AutoWalk_not_Act://AutoWalk_not_Act

     

     

    • Понравилось 3
    • Плюс 3
  13. Можно сделать таким алгоритмом:

     

    Необходимые данные:

    - Координаты X,Y точки назначения (метка на карте, к примеру)

    - Координаты X,Y точки отправления (игрок)

    - Velocity X,Y точки отправления (игрок)

    - Матрица вращения точки отправления (игрок), или же что лучше - готовый адрес параметра Yaw точки отправления (игрок)

    - Матрица вращения камеры, или же что лучше - готовый адрес параметра Yaw камеры

    - Адрес параметра, сигнализирующего о прикасании/столкновении точки отправления (игрок) к какому-либо объекту

     

    Основной процесс расчёта:

    1 - Расчет дистанции до точки назначения (метка на карте, к примеру). Значение дистанции необходима лишь для своевременного автоматического отключения/прерывания опции

    2 - Расчет угла между точкой отправления (игрок) и точкой назначения (метка на карте, к примеру)

    3 - Изменение Velocity X,Y точки отправления (игрок) по средствам Cos,Sin угла между точкой отправления (игрок) и точкой назначения (метка на карте, к примеру)

    4 - Изменение Yaw точки отправления (игрок) по средствам угла между точкой отправления (игрок) и точкой назначения (метка на карте, к примеру)

    5 - Изменение Yaw камеры по средствам угла между точкой отправления (игрок) и точкой назначения (метка на карте, к примеру)

     

    * если в игре отсутствует готовый параметр Yaw точки отправления (игрок) или камеры, то необходимо будет делать извлечение параметра Yaw из матрицы, затем изменение извлеченного параметра Yaw, затем обратная конвертация параметра Yaw в матрицу

     

    Обход препятствий:

    При касании и только на протяжении касания точки отправления (игрок) к какому-либо объекту, во избежание застревания точки отправления (игрок), сразу же после касания, начинается принудительное увеличение угла между точкой отправления (игрок) и точкой назначения (метка на карте, к примеру), при этом движение точки отправления (игрок) не прекращается. После того как касание прекратилось начинается принудительное уменьшение угла между точкой отправления (игрок) и точкой назначения (метка на карте, к примеру) до того момента пока множитель изменения угла не будет равен нулю.

     

    Протестировал эту схему вчера в игре "theHunter: Call of the Wild", работает на 4 из 5. Пробовал устраивать игроку разные препятствия в виде камней, домов и прочего, - со всеми игрок справился успешно.

     

     

     

    • Понравилось 2
    • Плюс 1
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.