2010-06-09 76 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