Позиция SKSpriteNode меняется после размещения

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

Вот код для моей плитки, которая размещена:

import Foundation
import SpriteKit

class Tile : SKNode {

    var sprite = SKSpriteNode(imageNamed: "grassMid")

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented");
    }


    override init() {
        super.init();
        self.sprite.physicsBody = SKPhysicsBody(texture: self.sprite.texture!, size: CGSize(width: 32.0, height: 32.0))
        self.sprite.physicsBody?.dynamic = false
        self.sprite.physicsBody?.collisionBitMask = 0x0
        self.addChild(sprite)
    }
}

Вот код, который размещает объект:

func addNewTile(position: CGPoint) {
        let t = Tile()
        t.sprite.position = getClosestPointInGrid(position)
        t.sprite.size = CGSize(width: 32.0, height: 32.0)
        if(!doesPositionContainTile(t.sprite.position)) {
             self.addChild(t)
        }
        print(t.sprite.position)
}

Например: я помещаю плитку в позицию (256, 32), и вскоре позиция изменилась на (255,990264892578, 31,9987831115723), и она продолжает медленно меняться? Я этого не понимаю. Почему такое поведение происходит?


person Samuli Lehtonen    schedule 07.07.2016    source источник


Ответы (2)


Такое поведение произошло из-за того, что вы добавили физическое окружение в свой спрайт, так что это связано с соблюдением всех параметров, установленных вашими physicsWorld и physicsBody (гравитация, восстановление, линейное демпфирование, трение...).

На самом деле неправильно использовать SKActions, потому что у вас могут быть странные значения, как у вас. Лучше использовать addImpulse или velocity для вашего спрайта.

Надеюсь, это поможет вам понять, что произошло в вашем проекте.

person Alessandro Ornano    schedule 08.07.2016
comment
Есть ли способ полностью остановить движение, но сохранить столкновение? Как будто я не хочу двигаться с позиции. - person Samuli Lehtonen; 09.07.2016
comment
После коллизии вы можете установить скорость на 0, physicBody.speed - person Alessandro Ornano; 09.07.2016
comment
Проблема в том, что хотя я установил для self.sprite.physicsbody.dynamic значение false, объект все равно немного смещается вниз, когда я его размещаю. На него даже не должна влиять гравитация, когда динамическое значение ложно. - person Samuli Lehtonen; 09.07.2016

Хорошо.

Я провел некоторое исследование по этой проблеме и пришел к выводу, что если SKSpriteNode является родителем SKNode, и вы устанавливаете для динамического свойства SKPhysicsObject SKSpriteNode значение false, объект все равно будет медленно дрейфовать вниз. Он вообще не должен двигаться, если для динамического свойства установлено значение false. Эта ошибка не возникает, если родительским элементом SKSpriteNode является SKScene.

Об этой ошибке сообщалось на форумах разработчиков Apple thread 27 ноября 2015 года. быть все еще существующим на 20 декабря. Теперь я могу сказать, что он все еще существует 10 июля 2016 года. У меня есть Xcode 7.0 и OS X 10.11.5, и я знаком только с версией spritekit для OS X, я не знаю, есть ли ошибка и на iOS. .

Изначально моя система карт была разработана таким образом, что карта — это SKNode, а тайлы — это SKSpriteNodes. В результате этой ошибки я изменил его так, чтобы SKSpriteNodes (тайлы) добавлялись непосредственно в SKScene. Теперь баг не возникает.

person Samuli Lehtonen    schedule 10.07.2016