Sprite Kit разной плотности для разных секций

Я создаю игру Flappy Bird, где половина уровня находится над водой, а другая половина — под водой.

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

Если ваша птица находится в воде, гравитация должна быть в отрицательном направлении (подниматься вверх) и быть меньше. Когда вы нажимаете, подается импульс, идущий прямо вниз.

Могу ли я установить гравитацию сцены в разных местах?

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

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


person Kjell    schedule 18.03.2014    source источник


Ответы (2)


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

Однако только потому, что SpriteKit не предлагает абстракцию более высокого уровня для чего-либо, не означает, что это сложно сделать самостоятельно. Постоянная гравитация SpriteKit делает с телом то же самое, как если бы вы прикладывали к нему силу с одинаковой величиной и направлением каждый раз, когда запускается метод update: вашей сцены.

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

  1. Проверьте координату y вашей птицы.
  2. Если оно ниже любого порога, отделяющего воду от воздуха, используйте applyForce:, чтобы применить направленную вверх силу. Если он над водой, примените направленную вниз силу.
  3. Поскольку это происходит в каждом кадре, птица будет ускоряться вниз, когда над водой, и вверх, когда под водой, и вы должны увидеть хороший эффект потери импульса сразу после перехода.

Вам нужно будет настроить величину ваших сил, пока она не будет вести себя как раз для игрового процесса, который вы хотите. Когда вы это сделаете, имейте в виду, что единицы для applyForce: в 150 раз превышают гравитацию SKPhysicsWorld (из-за того, что, вероятно, является ошибкой Apple) и зависят от массы вашего физического тела (из-за второго закона Ньютона).

person rickster    schedule 19.03.2014
comment
Кроме того, есть ли в Stack Overflow тег для моего первого проекта SpriteKit — это клон Flappy Bird? В последнее время таких вопросов много. :D - person rickster; 19.03.2014
comment
Есть сейчас. ;) [flappy-bird-clone] Не думал об этом раньше, но это на самом деле полусерьезно, учитывая, что создатели клонов Flappy Bird могут захотеть узнать о проблемах своих сверстников. - person LearnCocos2D; 19.03.2014
comment
PS: это 58 вопросов на момент написания. Я уверен, что будет еще много. ;) - person LearnCocos2D; 19.03.2014

У меня есть идея, как вы можете это сделать:

  1. сделайте два прямоугольника для верхней и нижней половины (один для воды, один для воздуха)
  2. создайте физическое тело на каждом прямоугольнике, которое имитирует желаемую гравитацию
  3. установите эти прямоугольники в качестве контактного делегата
  4. добавьте другие объекты в прямоугольный мир, в котором они должны быть
  5. Чтобы обработать основную птицу: - Когда точка привязки (вероятно, установленная посередине) коснется одного из прямоугольников, измените делегата контакта основного игрока с первого тела на второе тело в событии контакта.

Это означает, что у вас есть два мира с разной гравитацией с главным героем, гравитация которого переключается при контакте с новым миром (проходящим через середину).

Удачи

person meisenman    schedule 19.03.2014
comment
Гравитация есть атрибут мира, а не отдельных тел. Нет одного мира на сцену и одной сцены на вид. Возможно, вы сможете изменить эту идею, чтобы использовать два совершенно отдельных представления, но вам придется иметь дело с некоторыми неприятными (буквальными) пограничными случаями. - person rickster; 19.03.2014
comment
Вы правы, извините. Тогда мой единственный совет — применить гравитацию только к игроку и переключать гравитацию в зависимости от его y-местоположения. Для фона используйте такие действия, как moveTo. Они не будут работать в гравитационном мире, но вы сможете достаточно хорошо воспроизвести их движения и по-прежнему обнаруживать их столкновения и контакты. - person meisenman; 19.03.2014