CCSprite с действиями, пересекающими границы экрана (проблема копирования спрайтов) - PullRequest
1 голос
/ 09 июня 2010

Допустим, у нас есть объект 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 ]

2 голосов
/ 31 июля 2010

Да, вам нужно два спрайта.Но вы не хотите копировать и автоматически выпускать его.Вместо этого держите второй спрайт в памяти все время.Поскольку они используют одну и ту же текстуру, накладные расходы в памяти минимальны.И другой спрайт должен отображаться только тогда, когда он находится на краю экрана.

Инициализировать два спрайта с одинаковой текстурой:

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 голос
/ 07 сентября 2011

Я решил проблему некоторое время назад - только что заметил, что вопрос все еще остается без ответа:

Нам нужна функция 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];
...

Я не использую смешивание и альфа-в этом случае, но вы можете легко расширить функцию makeDoubler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...