2016-07-07 4 views
1

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

Вот код для моего плитки, которая помещается:

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), и оно продолжает медленно меняться? Я этого не понимаю. Почему такое поведение происходит?

ответ

0

Хорошо.

Я провел некоторое исследование по этой проблеме и пришел к выводу, что если 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. Теперь ошибка не возникает.

0

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

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

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

+0

Есть ли способ полностью остановить движение, но сохранить столкновение? Как будто я не хочу двигаться с позиции. –

+0

После collosion вы можете установить скорость до 0, physicBody.speed –

+0

Проблема в том, что, хотя я установил false для объекта self.sprite.physicsbody.dynamic, объект все еще немного опускается, когда я его помещаю. Он не должен даже влиять на гравитацию, когда динамика ложна. –

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