將該圖片放置到屏幕左下方
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;