CCSprite与跨越屏幕边界的操作(复制精灵问题)

时间:2010-06-09 11:19:34

标签: cocos2d-iphone

假设我们有一个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];

这样我就可以添加完全副本以在正确的一面显示它(并在转换结束后将其终止)。 它应该是应用了所有转换的位图......是否可能?

有什么想法吗?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

我刚刚解决了这个问题 - 只是注意到这个问题仍然没有答案:

我们需要一个makeDoubler函数,它将一个精灵中显示的当前帧复制到另一个精灵中。我已经将它实现为继承自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-ing,但您可以轻松扩展makeDoubler函数。