cocos2d中的anchorPoint


將該圖片放置到屏幕左下方

CCSprite sprite = CCSprite.sprite("Default.png");  
addChild(sprite);

生成的精靈放置在( 0,0 ),也就是屏幕左下角。但是精靈的貼圖的中心點和精靈的左下角位置一致 ,導致貼圖只能顯示一部分(貼圖的右邊上半部分)。

可以這樣想,一個精靈有兩部分,一部分是節點背景對象 ,另一部分是貼圖對象 (自己理解定義的名稱,非官方)

 

怎么可以讓貼圖完全顯示出來呢?使用定位點

 

每個節點都有一個定位點,但是只有當節點擁有貼圖時,這個定位點才有用。默認情況下, anchorPoint 屬性設置為(0.5,0.5 )

 

定位點和節點的位置沒有關系。當改變 anchorPoint 屬性的時候,我們能看到精靈在屏幕上的位置發生了變化,但是其實節點沒有改變;改變的是精靈里貼圖的位置

CCSprite sprite = CCSprite.sprite("Default.png");  
sprite.setScale(0.6f);
sprite.setPosition(CGPoint.make(500, 300));
addChild(sprite);

ccMacros.CCLOGERROR("test", "Position:"+sprite.getPosition().x +"--"+sprite.getPosition().y);
ccMacros.CCLOGERROR("test", "AnchorPoint:"+sprite.getAnchorPoint().x +"--"+sprite.getAnchorPoint().y);
ccMacros.CCLOGERROR("test", "AnchorPointInPixels:"+sprite.getAnchorPointInPixels().x+"--"+sprite.getAnchorPointInPixels().y);

修改定位點為0

CCSprite sprite = CCSprite.sprite("Default.png");  
sprite.setScale(0.6f);
sprite.setPosition(CGPoint.make(500, 300));
sprite.setAnchorPoint(CGPoint.make(0, 0));
addChild(sprite);

從上面可以看出來精靈的位置沒有發生變化,發生變化的只是貼圖對象 相對於節點背景對象 的偏移 。

默認情況下 anchorPoint 為( 0.5,0.5 ),即貼圖對象 的中心位置對應着節點背景對象 的左下角;而當 anchorPoint 為(0,0 ),即貼圖對象 的左下角對應着節點背景對象 的左下角

 

所以按照下面的代碼,圖片就可以正好顯示在左下角了

CCSprite sprite = CCSprite.sprite("Default.png");  
sprite.setAnchorPoint(CGPoint.make(0, 0));
addChild(sprite);

 

附:AnchorPoint問題:

設置AnchorPoint,到底有什么作用,當初我的理解是這個AnchorPoint是相對本身位置參考點。 
比如:我定義個Sprite,設置一個anchorPoint為居中置頂的位置 。
           sprite.anchorPoint = ccp( intW / 2, intH );
           sprite.rotation  = 90;
但實際翻轉時還是以左下角為參考點翻轉。更改的參考點並不起作用,或者我理解錯誤。
問題:

1:想實現我這個更改翻轉的參考點,如何實現?;
2:AnchorPoint到底做什么用?



答:這個屬性表示你這個圖片setPosition時的點在圖片上所處的位置.
取值范圍0-1
0,0表示左下角,
1,1表示右上角
0.5,0.5表示圖片的中心點.

所有的圖片都是以矩形來界定的.



問:這樣設置翻轉時還是以左下角為參考點


答:在設置 anchorPoint 的時候,   
imageVIew = [[UIImageView alloc] init];
imageView.anchorPoint = ccp(0.5, 1);
imageView.frame = CGRectMake(.......);

好像是先設置 anchorPoint, 再設置 frame.  試試.



答:問題算是解決了。說說基本思路。 
我之前定義一個Sprite,初始化時用一個ColorLayer 填充精靈 代碼如下: 
+ (id) BulletWithinLayer:(CCLayer *) layer 

    BQBullet *bullet = [BQBullet node]; 
     
    //bullet.anchorPoint = ccp(0.5,1);///注釋A 
    [bullet SetLayer:layer]; 
     
    return bullet; 


-(id)init 


    if((self == [super init])) 
    { 
        CCColorLayer *tmp = [CCColorLayer layerWithColor:ccc4(255, 255, 0, 255)]; 
        //tmp.anchorPoint = ccp(0.5,1);  ///注釋B 
        [self addChild:tmp z:0 tag:1]; 
    } 
    return self; 


//生成一個bullet精靈 
BQBullet *bullet = [BulletWithinLayer:layer]; 
bullet.anchorPoint= ccp(0.5,1); 
bullet.rotation= 45; 
[layer addChild: bullet z:1]; 

這時看到的翻轉還是已左下角,關閉注釋A,B都是無效。 

后面我用一個圖片代替ColorLayer生成精靈,就有效果了。 

為什么會有這種區別呢?更填充的層有關系嗎?真是沒搞懂啊?雖然說最后游戲不是這種寫法,但對程序員來說,在沒有圖的情況下應該也能完成一個游戲,就是用單純的色塊來替換,這樣就不用等美術圖出來了,也能更早的出模型,至少以前在J2ME上都是可以這樣做的,現在在iphone上,畫個色塊就TMD的這么麻煩,真是很不爽! 



針對:色塊無法翻轉的問題找到了,因為色塊是ColorLayer,CCLayer默認的isRelativeAnchorPoint = NO;重新打開就行了isRelativeAnchorPoint = YES;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM