2011-06-07 85 views
10

我的問題是,當我改變錨點精靈自動旋轉相對於當前的錨點。我不希望這種情況發生。Cocos2D旋轉和錨點

我隨後

  1. 創建錨點精靈的步驟(0.5,0.5)
  2. 改變了錨定點(0,1)
  3. 旋轉的精靈90度。 (使用CCRotateBy.Sprite正確旋轉)
  4. 將錨點更改爲(0.5,0.5)(每件事情都很好,直到現在,這是我需要保留的位置)。現在sprite.rotation是90
  5. 我改變了錨點(1,0)(雪碧自動旋轉到90度相對於給定的固定點 - 我必須停止這種行爲)

是有任何方法可以將精靈的旋轉重置爲0,而不實際旋轉紋理(即,將紋理保持爲其當前形式 - 實際紋理旋轉至90度),並隨步驟4一起更改錨點或位置,以便我可以從第5點開始繼續。

+0

你可以張貼一些代碼... – Anish 2011-06-08 08:15:31

回答

9

正如Lukman所說,錨點始終會影響旋轉,因爲您的目標是能夠使用旋轉中的不同錨點指定精靈位置,所以我建議將空CCNode作爲精靈的父級。

通過這種方式,您可以將sprite上的位置設置爲相對於此父節點,以補償您的錨點更改,然後在sprite上保留用於旋轉的錨點,但使用父節點作爲位置。

5

anchorPoint同時影響到positionrotation。你無法阻止它影響其中一個。

但是從閱讀您的問題,因爲要防止anchorPoint從影響的旋轉,我假設在這裏,你改變的原因anchorPoint是位置,例如您將其設定爲ccp(1, 0)因爲你想到精靈的右下角,而不是精靈中心,是你設置位置的地方。

我的建議是:根本不要更改anchorPoint,而是改變設置精靈位置的方式。您可以使用此功能,小調整的位置:

CGPoint adjustedPosition(const CGPoint position, const CGPoint anchor, const CGSize size) { 
    return CGPointMake(position.x - (anchor.x - 0.5) * size.width, position.y - (anchor.y - 0.5) * size.height); 
} 

現在,假設你想使用的anchorPoint(1,0)在做定位的時候,而不是sprite.position = ccp(200, 300),你只需要做:

sprite.position = adjustedPosition(ccp(200, 300), ccp(1.0, 0.0), sprite.contentSize); 

如果你願意,我會在稍後發表數學邏輯。否則,我希望這會有所幫助。

1

也許它會幫助你在正確的座標中安裝精靈的錨點。

 
void SetAnchorPosition(CCSprite * sprite, const CCPoint & point) 
{ 
    static CCSize winSize = CCDirector::sharedDirector()->getWinSize(); 

    double x = ((double)1/(double)winSize.width)*(double)point.x; 
    double y = ((double)1/(double)winSize.height)*(double)point.y; 

    sprite->setAnchorPoint(ccp(x,y)); 
    sprite->setPosition(point); 
} 
0

您可以在touchEnded方法中添加一條線作爲一個強有力的替代方案:

-(void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event{ 

    _yourSprite.rotation = 90; 

}