Почему я получаю странную реакцию «резиновой ленты» на SKSpriteNode с физикой?

#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, в физическом мире может возникнуть неожиданное поведение Коллисона. Ваш грейБар никогда бы не пересек границу, если бы вы использовали физические движения, но это произошло из-за того, что его перезаписали скакуны. Если вам нужно, чтобы граница была физическим телом, а серая полоса-физическим телом, вам придется изменить битовые маски столкновений, чтобы одно могло проходить через другое. Ваша сложная работа вокруг может быть приемлемым решением.