2016-12-07 2 views
1

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

Когда кнопка запуска нажимается, персонаж движется вперед со следующей функцией

func move(dt: CGFloat) { 
    position.x += moveRate * dt 
} 

И при нажатии на кнопку прыжка, персонаж прыгает со следующей функцией

func jump() { 
    physicsBody?.applyImpulse(CGVector(dx: 0, dy: jumpRate)) 
    run(jumpAnimation!) 
} 

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

Теперь я также играл с перемещением персонажа с physicsBody?.applyForce(CGVector(dx: 1000, dy: 0)), который дал бы такой эффект, но он, кажется, только получает все большую скорость, и вы не получаете постоянную скорость или «максимальную скорость», так сказать.

Может ли кто-нибудь поделиться с вами некоторым пониманием? Мне бы хотелось узнать все, что я могу о spritekit и разработке игр в целом. Благодаря!

+2

Из того, что я видел, меняя положение вручную в то же время, используя силы, никогда не работал хорошо. Попытайтесь использовать либо силы, либо положение узла изменения, воздействуя на его свойство position. Кроме того, применять силу следует вызывать в рамках обновления: метод, каждый кадр (в отличие от метода applyImpulse). – Whirlwind

+1

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

+0

играл с физикойBody намного больше на всех объектах. Кажется, это очень сложно, но я добился лучшего результата с помощью 'applyForce' и' applyImpluse'. Что вы подразумеваете под «прямым изменением вектора скорости» ??? –

ответ

3

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

func move(dt: CGFloat) { 
    if Math.abs(moveRate) > 0.1 { // If player initiates movement. You can increase the value 0.1 if you want to filter move values 
     velocity = CGVector(dx: moveRate, dy: veloxity.dy) 
    } 
} 

Она ваш персонаж перемещается на неопределенный срок, как в пространстве, linearDamping будет полезно. он используется для имитации трения в воздухе, поэтому значения, близкие к 1, означают большее трение, а значения ближе к 0 означает меньшее трение.

linearDamping = 0.85 

Кроме того, таким образом, moveRate не dt зависит, но она должна быть снижена.


Попробуйте, я не проверял еще, но это в основном, как я бы это сделать.

2

Есть две школы мысли о платформерной игре «физика».

  1. Не используйте физику, делайте все с позиционным приращением.
  2. Делайте все с физикой, так как позиционные изменения запутались физики

Поскольку вы используете физику для прыжков, и физик прыжки весело:

Есть три способа создания движение в физической системе:

  1. Установите скорость по мере необходимости.Это то, что Crazyrems предлагает,
  2. Нанести импульсы по мере необходимости для увеличения и уменьшения скорости движения
  3. Применение силы с течением времени, что увеличение или уменьшение скорости движения

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

Что вы пытаетесь с вашей physicsBody?.applyForce(CGVector(dx: 1000, dy: 0)) является применение силы с течением времени. Номер 3 в списке выше. Чем дольше вы продолжаете применять эту силу, тем быстрее перемещается персонаж.

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

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

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

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

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