2014-01-24 53 views
1
SKSpriteNode *_node; 

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    _node.alpha = 0.5; //this works 
    _node.zRotation = 0.5; // this doesn't work 
} 

任何想法爲什麼zRotation不起作用?我試着做NSLog,它給出了正確的zRotation但屏幕沒有顯示。Sprite套件:更改DidBeginContact中的zRotation

+0

重建物理身體你是什麼意思「屏幕沒有顯示」?你期望得到什麼? –

+0

我期望看到_node做一個旋轉,但它不旋轉。 –

+0

可能'zRotation'已經設置爲'0.5'? –

回答

1

看看SpriteKit的runloop的樣子。在物理模擬之後纔會繪製任何東西。因此,即使您手動設置zRotation,它可能會被physicsBody覆蓋並設置爲它自己的值。嘗試將NSLog放入-didSimulatePhysics方法中以在渲染之前獲取zRotation。我會嘗試將你的zRotation setter移動到-didSimulatePhysics。

操作的順序是

-update: 
action evaluation 
-didEvaluateActions 
run physics 
-didSimulatePhysics 
render the scene 

參考:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Actions/Actions.html

+0

我正在嘗試使一個方向杆只轉向一個方向。所以如果槓桿在另一個方向被擊中,它不應該移動。我嘗試過didEvaluateActions和didSimulatePhysics,但它不起作用。槓桿仍然會移動然後停止。 –

0

另一個想法可能工作:建立槓桿作爲接觸對象,因此當杆被擊中,你會得到一個回調。獲取物體與槓桿碰撞的位置。如果物體在錯誤的側面/方向上碰撞,則嘗試設置level.physicsBody.allowsRotation = NO;,否則將其設置爲yes。如果這不起作用,您也可以嘗試在這裏強制使用zRotation。

+0

我做到了,它會先移動一下。我是否正確地說,如果我將它作爲聯繫對象,我必須將委託設置爲此對象,並且我只能有一個這樣的對象檢測觸摸?另一件事是在DidBeginContact強制zRotation不起作用。我只是想知道爲什麼即使強制阿爾法作品也是如此。 –

+0

到目前爲止,我能夠達到的最好效果是在非旋轉方向上會出現跳動。我將當前的zRotation設置爲DidBeginContact並在DiDEvaluateActions處傳遞參數。 –

0

我有一個類似的問題,當設置zRotation和SKSpriteNode與physicsBody的位置沒有任何效果,而physicsBody設置爲零時一切正常。 由於joshd假設physicsBody的模擬以某種方式在手動設置後覆蓋了這些值。所以對我來說一個解決方法是清除體內暫時,那麼東方和精靈的位置,然後從頭開始或從存儲的屬性

storedPhysicsBody = physicsBody 
physicsBody = nil 
position = newPosition 
zRotation = newZRotation 
physicsBody = storedPhysicsBody