2017-01-02 110 views
6

我真的需要知道如何鎖定SKSpriteNode及其物理體的x軸。我需要保持SKSpriteNode dynamicaffectedByGravity。節點在斜坡上,所以這就是爲什麼它的x軸因重力而移動。但是,我不希望這個SKSpriteNode的x軸因重力而移動。有沒有辦法鎖定X軸來實現這一目標? 感謝您的幫助:DSwift 3(SpriteKit):鎖定SKSpriteNode及其物理體的x軸

編輯:我試圖約束適用於這樣的x值:

let xConstraint = SKConstraint.positionX(SKRange(constantValue: 195)) 
node.constraints?.append(xConstraint) 

然而,這並不工作,我不知道爲什麼和如何要解決這個問題。任何人都知道解決方案?

編輯2:SKPhysicsJointPin實際上看起來更有希望。在對這個問題的第一個回答/回答的評論中,我一直試圖想象如何在我的情況下正確使用它。

的我的代碼的一個例子:

let node = SKSpriteNode(imageNamed: "node") 

enum collisionType: UInt32 { 
    case node = 1 
    case ground = 2 
    case other = 4 //the other node is unrelated to the ground and node 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

override func didMove(to view: SKView) { 
    //Setup node physicsBody 
    node.physicsBody = SKPhysicsBody(rectangleOf: node.size) 
    node.physicsBody?.categoryBitMask = collisionType.node.rawValue 
    node.physicsBody?.collisionBitMask = //[other node that isn't the ground or the node] 
    node.physicsBody?.contactTestBitMask = //[other node that isn't the ground or the node] 
    node.physicsBody?.isDynamic = true 
    node.physicsBody?.affectedByGravity = true 
    addChild(node) 

    //Physics Setup 
    physicsWorld.contactDelegate = self 
} 

的節點是在地面上的頂部,和接地由具有一個volumeBased physicsBody各種SKSpriteNode線。地面不斷在前面添加新線條,並移除後面的線條,並將每條線條的x值更改爲負值(因此地面似乎正在移動 - 此過程在SKAction中執行)。這些線(地面的部分)處於一個角度,這就是節點x軸移動的原因。我希望節點始終位於地面的前端(例如,始終位於新創建的線的頂部)。目前,設置這樣的節點的位置鎖(解決我的問題)x軸:

override func didSimulatePhysics() { 
    //Manage node position 
    node.position.x = 195 
    node.position.y = CGFloat([yPosition of the first line of the ground - the yPosition keeps changing]) 
} 

注: ^這^功能GameScene類裏面居然

x軸停留在像這樣。 但是,問題是現在節點的物理體比節點的中心低(之前沒有發生過)。

+0

你說約束不起作用。這是不是一點都不起作用,完全沒有效果? – Confused

+0

你是什麼意思你不想讓X軸因重力而移動?重力不會影響x軸上的精靈,也許你需要更好地解釋問題 – Knight0fDragon

+0

@Confused是的,這就是我的意思,但didSimulatePhysics()基金工作得更好,但現在有一個新問題 - 閱讀我的編輯。 –

回答

3

我想你可以在linearDamping屬性設置爲0.0

linearDamping是減少體內的線速度的屬性。

此屬性用於模擬 機身上的流體或空氣摩擦力。該屬性必須是介於0.0和1.0之間的值。默認 值是0.1。如果值爲0.0,則不會對 對象應用線性阻尼。

您還應該注意適用於您的SKSpriteNode的其他力量。物理世界所應用的重力,例如dx值,如你所請求的,應該設置爲0。0:

CGVector(dx:0.0, dy:-4.9) 

也請記住,當你申請其他力量的載體像velocity如果你想阻止x軸,你應該保持DX屬性0.0恆定。

你可以找到更多的細節,官方docs

更新(您的詳細信息下面的意見後):

你也掛靠你的精靈在地上的SKPhysicsJoint(我不知道你的項目,所以這只是舉例):

var myJoint = SKPhysicsJointPin.joint(withBodyA: yourSprite.physicsBody!, bodyB: yourGround.physicsBody!, anchor: CGPoint(x: yourSprite.frame.minX, y: yourGround.frame.minY)) 

self.physicsWorld.add(myJoint) 

您可以用錨固性工作,如你所願或添加更多的關節創造了良好的合作。

+0

謝謝你。將'linearDamping'改爲1.0會使重力變慢,但它仍未鎖定x軸。沒有重力施加到節點。但是,它的x軸正在移動的原因是因爲它位於斜坡上(對角線SKSpriteNode)。這就是爲什麼它會繼續下坡。 –

+0

'physicsBody?.allowsRotation'怎麼樣?你有嘗試將它設置爲false嗎? –

+0

我其實剛剛嘗試過,它幾乎解決了問題,但是當它位於斜坡的邊緣時,它會脫落。 –

4

默認情況下,節點的constraints屬性爲nil。您需要創建一個或多個約束的數組並將其分配給屬性。例如

let xConstraint = SKConstraint.positionX(SKRange(constantValue: 195)) 
node.constraints = [xConstraint] 

更新

您可能需要使用一個攝像頭,而不是節點在場景中移動的地面。使用相機節點,您可以移動主角和相機,而不是地面。

enter image description here

+0

由於某種原因,這無濟於事,不過謝謝。 –

+0

這應該與添加到「didSimulatePhysics」的代碼非常相似。將此添加到「didMove」方法時會發生什麼? – 0x141E

+0

x位置仍然移動並且不受約束。 –

相關問題