Коллизии между игрой возражают и пол относительно силы тяжести?

URL(fileURLWithPath вместе с absoluteString неправильно.

Вы должны написать (обратите внимание на другой инициализатор URL):

let imgPath = URL(string: documentDirectoryPath.appendingPathComponent("studioframe\(savedImageCount).jpg").absoluteString)

, но это (URLStringURL) очень громоздко, там это гораздо более простое решение, пожалуйста, обратите внимание на разницу между (строковым) путем и URL

let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! // the Documents directory is guaranteed to exist.
let imgURL = documentDirectoryURL.appendingPathComponent("studioframe\(savedImageCount).jpg")
...
   try data.write(to: imgURL, options: .atomic)
13
задан mmcdole 13 January 2009 в 05:01
поделиться

5 ответов

Вы могли бы хотеть проверить часто задаваемые вопросы Силы тяжести GameDev.net для некоторой основной информации.

Так как Вы делаете игру и не очень точного разработчика моделей физики, чем нам может сойти с рук выполнение Euler интеграции. Если Ваша потребность в точности увеличивает самый популярный метод интеграции, который я вижу используемый, интеграция (RK4) Рунге-Кутта. Вам, скорее всего, не будут нужны они для простой игры, но они определенно используются на более усовершенствованном моделировании физики и 3-х играх. Недостаток с использованием RK4 является немного увеличенной сложностью и немного медленнее. Это очень точно, хотя, но на данный момент, позволяет палке с хорошим ole Euler.

Я задал подобный вопрос, "Как я применяю силу тяжести к своей игре прыгающего мяча" и получил несколько хороших ответов. Первая вещь, которую Вы сделаете, выбирают произвольную гравитационную постоянную для Вашей игры. В моем приложении прыгающего мяча я использую гравитационную постоянную по умолчанию 2000px/s. Вы захотите играть с этой гравитационной постоянной для получения желаемого эффекта для конкретной игры.

Затем, Вы хотите удостовериться, что Вы представляете свою игру и обновляете Ваши игровые объекты независимо. Это должно препятствовать Вашим объектам в игре переместиться действительно быстро в быстрые компьютеры и медленный на медленных компьютерах. Вы хотите физику и скорость, с которой Ваши объекты перемещаются для независимого политика от компьютерной скорости. Хорошая статья об этом является Игровой Физикой: Зафиксируйте свой такт!.

Таким образом, как мы делаем это? Вы отслеживаете то, сколько время передало начиная с последней возможности Вашему методу Обновления. Я создал 2 потока, хотя это не непосредственно необходимо. У меня есть игровой поток обновления и поток рендеринга. Средства управления потоком обновления, обновляющие в игре, возражают положениям. Поток обновления знает, когда это было предыдущее названный, текущее время и от этого вычисляет прошедшее время, так как метод обновления назвали.

Для применения силы тяжести, мы просто добавим к скорости Y нашего объекта нашей гравитационной постоянной, умноженной на прошедшее время.

private long previousTime = System.currentTimeMillis();
private long currentTime = previousTime;

public void updateGame()
{
    currentTime = System.currentTimeMillis();
    float elapsedSeconds = (currentTime - previousTime) / 1000f; 

    foreach(GameObject gameObject in gameObjects)
    {
        // Apply gravity to velocity vector
        gameObject.velocity.y += (gravityConstant * elapsedSeconds); 

        // Move objects x/y position based off it's velocity vector
        gameObject.position.x += (gameObject.velocity.x * elapsedSeconds); 
        gameObject.position.y += (gameObject.velocity.y * elapsedSeconds);

    }

    checkCollisions();

    previousTime = currentTime;
}

Это переместит все Ваши объекты на основе их вектора скорости и применит силу тяжести к ним на основе Вашей гравитационной постоянной. Лучший из всего это делает это независимо от компьютерной скорости!

Для ответа на другой вопрос да, объекты будут постоянно иметь "силу" силы тяжести на их y векторе. Таким образом, это будет постоянно сталкиваться с полом. Однако одна вещь, которую Вы хотите сделать, использовать значение Эпсилона для возможного обеспечения скорости gameObject для обнуления. Затем во время обнаружения коллизий как часть Вашего процесса сокращения можно обычно пропускать проверку, если недвижущийся объект сталкивается с чем-нибудь (не наоборот, хотя!).

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

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

Если бы Вы нуждаетесь в помощи на ответе коллизии, я предложил бы смотреть на:

17
ответ дан 1 December 2019 в 22:24
поделиться

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

Что касается физики, я становлюсь поклонником verlet интеграции, как описано в Gamasutra: Усовершенствованная Символьная Физика. Это упрощает уравнения обновления физики (не должны отслеживать скорость!) и это упрощает коллизии (не должны корректировать скорость!). Тем не менее это действительно имеет несколько нюансов при необходимости в точности.

2
ответ дан 1 December 2019 в 22:24
поделиться

Один из большинства полных учебников по этому предмету является Обнаружением коллизий В реальном времени Christer Ericson. Он сделал, чтобы компаньон вел блог также. Математика Eric Lengyel для 3D Игрового Программирования и Компьютерной графики полезна также.

1
ответ дан 1 December 2019 в 22:24
поделиться

Я не конкретно игровой программист, но это - мое понимание:

  • в идеальном мире с "бесконечной частотой кадров", Вы обнаружили бы коллизию в точно момент, она произошла, и используйте немного стандартной физики для моделирования новых скоростей и ускорений тел после коллизии (см. стандартный учебник по механике средней школы, или различные книги дали право вещам как "Физика для Игровых Программистов"),
  • в действительности, потому что у Вас есть фиксированная частота кадров, и следовательно тела только перемещаются с определенной гранулярностью, обычно необходимо добавлять дополнительный прием, такой как вычисление заранее относительного пути, что тела переместятся на следующем кадре и видящий, пересекается ли какой-либо из путей
  • если они действительно пересекутся, то точка пересечения на самом деле будет оценкой, но немного неточный, точки, в которой действительно столкнулись бы тела; у Вас затем есть выбор не заботы и взятия той оценки как точка пересечения и линейно интерполяция для получения скоростей при коллизии или выполнения более точного вычисления теперь, Вы узнали, что они пересекутся, для получения реальной мысли/time/velocities коллизии
1
ответ дан 1 December 2019 в 22:24
поделиться

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

1
ответ дан 1 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: