Сделай так, чтобы вещи быстро выглядели медленно (Box2D)

9

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

Это как игра под названием «Средневековая осада». Когда карабин поворачивает руку, игрок должен использовать наилучший момент, чтобы нажать кнопку и отпустить мяч. Тогда мяч полетит под углом касания. введите описание изображения здесь Моя проблема сейчас заключается в том, что рука требучета качается слишком быстро, чтобы игрок мог воспользоваться нужным моментом. Между тем он должен быть таким быстрым, иначе он не может бросить достаточно далеко. И есть крошечная нить, соединяющая шар и рукоятку требушета: если рука качается слишком медленно, шар просто висит на струне, когда рука движется.

Я решаю проблему, переключая размер шага, и, когда рука поворачивается, я меняю размер шага с 1/60 до 1/200. И как только игрок отпускает мяч, он возвращается к 1/60.

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

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

Пожалуйста, пролите немного света на это, спасибо!


РЕДАКТИРОВАТЬ

Спасибо всем за участие, я решаю проблему, делая медленный поворот руки, а когда игрок отпускает мяч, беру скорость мяча и раз два. Это выглядит точно так же, как изменение размера шага. Есть только одна дополнительная вещь, которую мне нужно сделать. Поскольку рука качается очень медленно, мяч просто висит на конце руки, а не качается. Я решил это, применяя силу, равную гравитационной силе на шар во время и только во время периода качания. Тогда он больше не висит там, а раскачивается вместе с рукой.

Ответ @MrCranky подробный и выглядит выполнимым, поэтому я бы его принял. :)

Arch1tect
источник
Может быть, вы могли бы двигать требушет медленно, но умножать силы, действующие на мяч? Я не работал с Box2D раньше, поэтому извините, если это глупая идея. Кроме этого, мое единственное предположение - возиться с массой мяча, чтобы увидеть, могут ли более тяжелые или легкие дать вам приемлемые результаты на более медленных скоростях. Кроме того, возможно, стоит изучить физику реальных вещей. Они выглядят несколько медленными, поэтому, возможно, данные о них (размер, боеприпасы, силы и т. Д.) Могут дать вам некоторые идеи для вашего смоделированного.
Кристиан,
2
Заставить компьютерную физику вести себя как "настоящая вещь" действительно сложно. Почти все физические движки имитируют твердые тела, а это означает, что такие эффекты, как изгиб плеча Требушета, не учитываются, ни физика веревки, ни поведение материала никоим образом не точны, поэтому точное моделирование без «обмана» практически невозможно. Процесс сближения с чем-то, что выглядит реальным, выглядит примерно так: настройка, настройка, настройка, чит, настройка, настройка, обман, чит, настройка, настройка, начало, настройка, настройка, настройка, чит , обмануть, настроить.
LearnCocos2D
4
Котик пушка использует наиболее реалистичный подход к этому вопросу: Люди на самом деле являются , что плохи в манипулировании физической реальности и помощи потребности машины, если вы хотели бы дать «чувство» из требюша , что двигается достаточно медленно для человека , чтобы управлять вручную , но запуски быстрее, чем физически возможно, вы можете захотеть создать чисто художественную анимацию «стрельбы», а затем порождать мяч в зависимости от того, где пользователь прерывает анимацию.
MickLH

Ответы:

3

Инстинктивно я бы сказал, что мы упускаем существенную часть контекста, необходимого для ответа, а именно: «Почему многопользовательский аспект мешает вам изменить временной шаг?»

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

Самый простой и надежный ответ на ваш вопрос - использовать переменный временной шаг. Когда вы приближаетесь к моменту принятия решения, вместо обновления вашего физического моделирования на одну секунду за каждую проходящую секунду реального мира обновите его на полсекунды или другое подходящее число. Поскольку это интеграционный эффект, вам, вероятно, удастся просто обойти частоту обновления до более низкой частоты во время принятия решения, но вы также можете быстро выполнить интерполяцию вниз до более низкой частоты. В любом случае, вы по сути воспроизводите симуляцию физики в замедленном режиме. Он должен вести себя совершенно точно, достаточно медленно, чтобы игрок мог принять решение. Я бы не подумал о каких-либо других способах обмануть физику, чтобы она заработала, скорее всего, все получится ужасно и не будут чувствовать себя «правильно».

Итак, мы возвращаемся к реализации сети. Без дополнительной информации, я думаю, у вас есть два варианта. Во-первых, если вы работаете в паре с другой сетевой стороной. Поэтому, когда один игрок должен замедлиться, чтобы принять решение, замедлите обоих игроков одинаково. Это может показаться раздражающим и странным для игрока, который не стреляет, потому что это спутает их время реакции.

Во-вторых, представьте, как два требушета стреляют друг в друга. Требушету нужно 10 секунд, чтобы бросить, и окно стрельбы начинается с Т + 5с. P1 начинает цикл стрельбы в момент времени T + 0, а в момент времени T + 5s замедляет их локальное физическое моделирование на 50%. Им понадобится 15 секунд, чтобы пройти весь цикл. Таким образом, в T + 5s P1 говорит P2 начать воспроизведение цикла запуска 10s на полной скорости . Таким образом, P1 видит, что цикл Trebuchet занимает 15 секунд, P2 видит, что он занимает 10 секунд, но оба игрока видят завершение цикла в T + 15 секунд. Когда P1 фактически выпускает, они сообщают P2, когда в условном цикле они выпустили. Так что, если P1 выпускается в T + 10 с, это на самом деле на 7,5 с через цикл запуска 10 с. P2 может затем показать выпуск в Т + 12,5 с (7,5 с в его локальном воспроизведении цикла), и симуляции обоих игроков должны были запустить снаряд в одной и той же физической точке цикла.

Таким образом, в этом втором подходе вы больше не симулируете на шаге. Вы запускаете две независимые симуляции, но вместо этого отслеживаете входные данные игроков. Если обоим говорят, что игрок выпустил 7,5 с в цикле запуска, они оба должны договориться о том, где приземлится снаряд. Однако на практике это может очень быстро расходиться, и вам нужно как-то синхронизировать состояния симуляции.

MrCranky
источник
0

Почему бы просто не скопировать / адаптировать то, что уже существует и работает в подобных случаях?

введите описание изображения здесь

Korchkidu
источник
0

Если ваш требушет движется слишком быстро, очевидным решением будет масштабирование времени, чтобы сделать его медленнее. То есть, на каждую секунду реального времени, сделайте только, например, 0,1 секунды в вашей физической симуляции. Теперь, с точки зрения игрока, мяч будет двигаться в 10 раз медленнее.

На самом деле, есть еще один способ добиться того же эффекта: вместо масштабирования времени просто масштабируйте все физические константы в единицах, включая время. Например, гравитационное ускорение имеет единицы измерения скорости / времени = расстояния / времени², поэтому, если гравитация является единственной постоянной величиной в вашей игре, ее уменьшение в 100 = 10² приводит к тому же эффекту, что и время замедления в 10 раз. ,

Конечно, если ваша физическая модель включает в себя другие константы с единицами времени (или скорость = расстояние / время, или ускорение = расстояние / время² и т. Д.), Вам придется также масштабировать их, если вы хотите сохранить траектории одинаковыми. ,

Обратите внимание, что есть предел того, насколько далеко вы можете продвинуться с этим: если вы замедляете время, скажем, в 100 раз, ваш trebuchet будет действительно легко контролировать, но вашим игрокам также, вероятно, будет скучно ждать шарики медленно опускаются после выстрела. Если это проблема, вам, возможно, придется прибегнуть к более продвинутым трюкам, подобным тем, которые предлагались в других ответах, например, использовать действительно медленное масштабирование времени во время срабатывания требушета, но переключаться на более быстрый масштаб времени после запуска мяча.

Илмари Каронен
источник
спасибо, но вы, вероятно, не видели мою правку. Да, я решил с помощью последнего метода в вашем ответе
Arch1tect