Движение в реальном времени показано графически. стриж
Я думал, что сначала дам вам идею, а затем задам вопрос. В противном случае, это может быть трудно понять.
Я создаю игру, в которой вы бегаете от зомби в режиме реального времени. По сути, если пользователь движется в реальности, то и он в игре. Зомби явно преследуют игрока.
Мое приложение определяет местоположение пользователя и с помощью рандомизации создает пару местоположений, которые находятся на расстоянии от 50 до 800 м от пользователя. Затем локации зомби представляются в виде точек, назовем их пользовательской радарной картой:
Тогда это все математика.
Каждую 1 секунду каждая точка "тянет" к центру, как если бы зомби преследовали игрока. Имея точки зомби и точку центра UIScreen, где отображается изображение цели (и которое представляет собой положение пользователя), я вычисляю арктангенс и использую параметрические уравнения для круга (оставайтесь со мной, это не моя проблема!) чтобы получить новые координаты для точек зомби. Делая все это, у меня есть свое представление движения. Очки идут к цели (пользователю), и это нормально. Yahoo!
Проблема появляется с движением пользователя. Используя скорость CLLocation, я проверяю, какое расстояние выполняется каждые 1 секунду (радиус), а затем, в зависимости от используемого магнитного жатки, я проверяю, под каким углом перемещается пользователь, и поэтому я снова использую параметрические уравнения для расчета смещения пользователя. Затем я применяю это смещение к точкам зомби, потому что я хочу, чтобы оно выглядело как радар. Если что-то движется или владелец радара движется, он / она должен просто видеть, что вещество движется к нему или от него. Я надеюсь, что вы получите это "отношение", которое я пытаюсь интерпретировать прямо сейчас.
Во всяком случае, я не думал об одной проблеме, и вот проблема! Если игрок держит свое устройство iOS прямо, а пользователь ходит / бежит прямо, как на картинке:
Там нет никаких проблем вообще. Но, если он хочет держать устройство, подобное этому:
Но движется / идет прямо, смещение происходит относительно направления, на которое указывает устройство, а не направления, в котором ходит пользователь.
Как мне реализовать движение пользователя? Я ищу решение, отличное от вычисления atan2 для двух пользовательских местоположений, одного ранее, а другого - позже, а затем использую его в параметрических уравнениях. Некоторые обновления гироскопа или что-то?
КОД:
func updatePositions()
{
for i in 0..<number
{
if Int(userLocation.speed) >= 0
{
/* USER MOVES */
let userSpeed = userLocation.speed * 1/5 /* s = vt */
let userMoves = CGPoint(x: CGFloat(userSpeed * cos(userTheta)), y: CGFloat(userSpeed * sin(userTheta)))
markers[i].center = CGPoint(x: markers[i].center.x - userMoves.x, y: markers[i].center.y - userMoves.y)
/* USER CHANGES DIRECTION */
/* ZOMBIE MOVES */
let zombieTheta = atan2((markers[i].center.y - aim.center.y), (markers[i].center.x - aim.center.x))
let zombieSpeed = Double(speed)/5
let zombieMoves = CGPoint(x: CGFloat(zombieSpeed) * cos(zombieTheta), y: CGFloat(zombieSpeed) * sin(zombieTheta))
markers[i].center = CGPoint(x: markers[i].center.x - zombieMoves.x, y: markers[i].center.y - zombieMoves.y)
}
}
}