2015-05-21 2 views
2

Я создаю платформу платформы tilemap в SpriteKit. Я назначил траектории столкновения с физическим телом всех наземных плиток и сделал их нединамичными. Для игрока я назначил два полигона столкновений: круг внизу и прямоугольник сверху.Физика SpriteKit: Как сделать игровой спрайт, следуя (наклонной) земле

Спрайт игрока имеет фиксированное положение на экране, а уровень прокручивается справа налево. Теперь, пока игрок спрайта находится на ровной поверхности, столкновения работают отлично, и игрок идет по земле. Тем не менее, у меня также есть некоторые наклонные плитки ландшафта, которые я хочу, чтобы игрок следил (например, пешком в гору). Но когда игрок достигает наклонной плитки, он просто отскакивает от нее, не имея возможности «подняться» на нее.

screenshot

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

я как реституция и трение устанавливаются в 0.

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

Я попытался использовать SKConstraints с позициейX, установленным в постоянное значение. Сначала это работало, но затем игрок застрял посреди наклонной плитки и в конце концов провалился сквозь нее.

Я также пробовал различные формы столкновений многоугольников на плеере (например, прямоугольник вместо круга внизу), но это ничего не меняло.

Любая помощь приветствуется!

ответ

1

Это больше связано с вашей логикой игры, а не с вашими свойствами карты. Вам нужно иметь несколько «состояний» для вашего плеера. Например, если ваш плеер находится в режиме ожидания, вы можете установить CGVector на 0,0. Это остановит движение игрока в любом направлении.

Чтобы привести несколько примеров движения. Допустим, вы хотите, чтобы ваш объект двигаться вправо:

// move node's physics body to the right while leaving vertical movement as is 
// 160 is just an example 
myNode.physicsBody.velocity = CGVectorMake(160, self.physicsBody.velocity.dy); 

// do not allow right movement to exceed 160 
if(myNode.physicsBody.velocity.dx > 160) 
    myNode.physicsBody.velocity = CGVectorMake(160, self.physicsBody.velocity.dy); 

Для перемещения влево вы инвертировать значение ого:

myNode.physicsBody.velocity = CGVectorMake(-160, self.physicsBody.velocity.dy); 

if(myNode.physicsBody.velocity.dx < -160) 
    myNode.physicsBody.velocity = CGVectorMake(-160, self.physicsBody.velocity.dy); 

Allow MyNode быть затронут под действием силы тяжести, и она должна оставаться в контакте с землей поскольку он движется вниз по склону.

+0

Какой CGVector вы имеете в виду? Вектор скорости тела физики? Я смог заставить игрока следовать по склонам, включив/отключив его свойство affectedByGravity, когда он находится на склоне/вверх по склону. Тем не менее, горизонтальное движение является нечетным, поскольку оно замедляется, когда он путешествует в гору и ускоряется, когда он путешествует вниз, вместо того, чтобы поддерживать постоянную скорость. – snorge

+0

Выключает, что включение/выключение при включении не работает так хорошо. Я начинаю очень отчаянно. Невозможно ли вам показать некоторые фрагменты кода, которые помогут мне понять, как обращаться с движением игрока на склонах? Здесь очень много факторов (например, гравитация, трение, столкновения, скорость и т. Д.), Что у меня такое чувство, что я делаю что-то принципиально неправильное. – snorge

+0

@snorge - добавлены примеры движения. – sangony

0

Это платформа игра tilemap ...

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

ИЛИ

Возможно, если игра не генерируется случайным образом вы можете настроить uibezierpath и повернуть путь, если бы он перестает двигаться вверх по склону.

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

И увеличивая трение (не устанавливая его в 0), может помочь. Попробуйте трение в 1?

Смежные вопросы