#swift #skspritenode
Вопрос:
***Обновленная информация ниже
Ниже приведен мой код и изображение, чтобы помочь понять, что я делаю.
Я создаю серую полосу под нижней частью экрана. Затем я перемещаю серую полосу выше границы. Когда это движение будет сделано, я изменю маску столкновения так, чтобы граница удерживала серую полосу, когда гравитация опустит ее.
Все работает так, как должно. За исключением случаев, когда я увеличил продолжительность действия с 1.0 до 10.0, когда ход сделан, серая полоса исчезает с экрана. Он не попадает в пограничную полосу, а затем не отскакивает. Где бы он ни находился, когда выполняется действие перемещения, он просто «подпрыгивает». Почти как если бы он был на резиновой ленте. Он взлетает с экрана и в конце концов возвращается обратно.
Чего я не понимаю, так это «почему это происходит?»
Это действительно мой единственный код для перемещения серой полосы. И при меньшей продолжительности экстремального действия прыжка вверх не происходит.
Кто — нибудь знает, почему происходит это «прыгающее» действие?
greyBar.physicsBody = SKPhysicsBody(rectangleOf: size, center: CGPoint(x: size.width/2, y: size.height/2))
greyBar.physicsBody!.isDynamic = true
greyBar.physicsBody!.affectedByGravity = true
greyBar.physicsBody!.restitution = 0.3
let xConstraint = SKConstraint.positionX(SKRange(constantValue: (safeSceneRect.width/2) - (greyBar.size.width/2)))
greyBar.constraints = [xConstraint]
let moveAction = SKAction.move(to: CGPoint(x: (safeSceneRect.width/2) - (greyBar.size.width/2), y: (myBase.size.height)! (myBorder.size.height)! 5), duration: 1.0)
greyBar.run(moveAction, completion:
{ greyBar .physicsBody?.collisionBitMask =
bodyMasks.borderMask.rawValue|bodyMasks. greyBarMask.rawValue})
***дополнительная информация
Итак, я нашел причину и способ обойти ее, но не то, что я считаю окончательным ответом.
На границе с самого начала была установлена отметка бита столкновения в серую полосу. Это почти так же, как если бы при пересечении границы грейБар накопил кучу кинетической энергии. Чем медленнее он проходил, тем больше накапливалось энергии у Серого Барса.
Моя нынешняя работа заключается в следующем :
* All collision bit masks set to blank
* set greyBar to not be affected by gravity
* when done moving
greyBar collision bit masks set to border mask
border collision bit masks set to greyBar
* set greyBar to be affected by gravity
Это кажется странным. Разве нет какой-нибудь команды для высвобождения накопленной энергии объекта?
Комментарии:
1. Если вы удалите
xConstraint
, проблема все еще будет возникать?2. @JohnL Да, это так. Похоже, чем дольше длится перемещение, тем выше оно исчезает с экрана. Там какая-то странная обстановка?
3. @JohnL Пожалуйста, смотрите OP для получения обновленной информации
4. Мне кажется, я понимаю. При использовании физического мира вы обычно используете applyForce, applyImpulse, заданную скорость и т. Д. Для перемещения физических тел. Поскольку вы используете SKActions, в физическом мире может возникнуть неожиданное поведение Коллисона. Ваш грейБар никогда бы не пересек границу, если бы вы использовали физические движения, но это произошло из-за того, что его перезаписали скакуны. Если вам нужно, чтобы граница была физическим телом, а серая полоса-физическим телом, вам придется изменить битовые маски столкновений, чтобы одно могло проходить через другое. Ваша сложная работа вокруг может быть приемлемым решением.