2010-06-09 37 views
1

比方說,我們有一個具有行動把它捆起來一個CCSprite對象:CCSprite用行動跨越屏幕邊界(副本精靈問題)

-(void) moveJack 
{ 
    CCSpriteSheet *sheet = (CCSpriteSheet*)[self getChildByTag:kSheet]; 
    CCSprite *jack = (CCSprite*)[sheet getChildByTag:kJack]; 
... 

    CCSequence *seq = [CCSequence actions: jump1, [jump1 reverse], jump2, nil]; 
    [jack runAction:seq]; 
} 

如果精靈越過屏幕邊界,我想顯示在對面。 因此,原始精靈一半顯示在右側(例如),另一半顯示在左側,因爲它尚未完全交叉。 顯然(或者是),我需要2個精靈來實現這一點。 一個在右側(原件),另一個在左側(副本)。 問題是 - 我不知道如何創建原始精靈的精確副本,因爲綁定的動作具有縮放和混合轉換(由於轉換,精靈有點失真)。

我想有這樣的:

CCSprite *copy = [[jack copy] autorelease]; 

,這樣我可以添加一個精確副本,以顯示它放在正確的一邊(把它殺了後過渡結束)。 它應該是一個應用了所有轉換的位圖...是否有可能?

任何想法?

回答

1

I」我剛剛解決了這個問題 - 只是注意到這個問題仍然沒有答案:

我們需要一個makeDoubler函數,將複製當前f rame在一個精靈中顯示給另一個精靈。我已經實現它作爲從CCSprite繼承的類的成員函數,它看起來有點像以下內容。

在頭

@interface MySprite : CCSprite 
{ 
//... 
} 

// makes sprite's image the same 
-(void) makeDoublerTo:(CCSprite *)sprite; 

@end 

實施

@implementation MySprite 

-(void) makeDoublerTo:(CCSprite *) sprite 
{ 
    [sprite setDisplayFrame:[self displayedFrame]]; 
    [sprite setScaleX:[self scaleX]]; 
    [sprite setScaleY:[self scaleY]]; 
    [sprite setRotation:[self rotation]]; 
    [sprite setFlipX:[self flipX]]; 
    [sprite setFlipY:[self flipY]]; 
    [sprite setAnchorPoint:ccp(self.anchorPoint.x,self.anchorPoint.y)]; 
    sprite.position = ccp(self.position.x, self.position.y); 
} 

@end 

你可以用它喜歡:

MySprite *sprite = [CCSprite spriteWithFile:@"Icon.png"]; 
CCSprite *sdoubler = [[CCSprite alloc] init]; 

,並在遊戲循環(也調整知名度和座標):

[sprite makeDoublerTo:sdoubler]; 
[sdoubler setVisible:YES]; 
... 

在這種情況下,我不使用混合和alpha處理,但可以輕鬆擴展makeDoubler函數。

2

是的,你需要兩個精靈。但是你不想複製和自動釋放它。而是始終將第二個精靈保存在內存中。由於它們使用相同的紋理,因此內存開銷很小。當你在屏幕邊緣時,你應該只顯示另一個精靈。

初始化2個精靈具有相同質地:

sprite = [CCSprite spriteWithFile:@"Icon.png"]; 
sprite.position = CGPointMake(sprite.position.x, [sprite contentSize].height/2); 
[self addChild:sprite]; 

spriteDouble = [CCSprite spriteWithTexture:[sprite texture]]; 
spriteDouble.position = sprite.position; 
spriteDouble.visible = NO; 
[self addChild:spriteDouble]; 

doubleAppearsDistance = [sprite contentSize].width/2; 

然後,在對屏幕的邊界交叉點的更新循環檢查,啓用/禁用其他子畫面,並將其正確位置:

if (position_.x > screenSize.width) 
{ 
    position_.x -= screenSize.width; 
} 
else if (position_.x < 0) 
{ 
    position_.x += screenSize.width; 
} 

spriteDouble.visible = NO; 
if (position_.x >= (screenSize.width - doubleAppearsDistance)) 
{ 
    spriteDouble.visible = YES; 
    spriteDouble.position = CGPointMake(sprite.position.x - screenSize.width, sprite.position.y); 
} 
else if (position_.x <= doubleAppearsDistance) 
{ 
    spriteDouble.visible = YES; 
    spriteDouble.position = CGPointMake(sprite.position.x + screenSize.width, sprite.position.y); 
} 
+0

這不是我所要求的 - 謝謝。 問題是原始精靈有很多附加的轉換,所以我不能簡單地將原始圖像複製到另一個位置 - 它被扭曲了許多轉換。複製應該有確切的轉換應用。 – iostriz 2010-07-31 11:34:14

+0

祝賀kobold2d。工作很好。 – iostriz 2011-09-07 15:17:14

+0

謝謝! (對於不知道Kobold2D是什麼的人:http://www.kobold2d.com) – LearnCocos2D 2011-09-14 22:40:16