假设我们有一个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];
这样我就可以添加完全副本以在正确的一面显示它(并在转换结束后将其终止)。 它应该是应用了所有转换的位图......是否可能?
有什么想法吗?
答案 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
函数。