Проблема анимации слоя параллакса в Cocos2d-iPhone - PullRequest
0 голосов
/ 11 января 2010

Я пытаюсь реализовать собственную прокрутку параллакса в Cocos2d, поскольку встроенная функция параллакса не совсем то, что я ищу (она масштабирует слои, а это не то, что мне нужно)

Итак, мои собственные слои параллакса перезаписывают метод Layers setPosition следующим образом

- (void) setPosition:(CGPoint)point
{
    [super setPosition:CGPointMake(point.x / pRatio, point.y / pRatio)];
}

pRatio - это int, который уменьшает величину перемещения слоя, создавая эффект параллакса, который я ищу. И это прекрасно работает, как это.

Однако иногда мне нужно анимировать слой в определенную позицию с помощью MoveTo, поэтому я создал этот метод, который отвечает на NSNotiification

- (void) gotoStartPosition:(NSNotification *)notification
{
    CGPoint startPos = CGPointFromString([notification object]);
    id moveToStart = [MoveTo actionWithDuration:1 position:startPos];
    [self runAction:moveToStart];

}

Это работает до тех пор, пока я не установлю pRatio на значение выше 1. Если pRatio выше 1, то gotoStartPosition заставляет слой перейти на CGPoint(0,0) и анимируется в положение оттуда.

Я не могу понять, в какой момент положение Layers устанавливается на 0,0, и я не понимаю, почему он делает это только тогда, когда pRatio выше 1.

Я подозреваю, что это будет что-то мучительно простое, но я думаю, что мой мозг жарен. Любая помощь, с благодарностью.

1 Ответ

0 голосов
/ 13 января 2011

ОБНОВЛЕНИЕ: я тупица. То, что происходит, очевидно. Анимация сначала устанавливает положение слоев в его текущее положение. Но я сказал слою разделить любые координаты setPosition на pRatio. Так что это не CGPoint (0,0), а что-то вроде CGPoint (0,032, 0). Я исправил это так:

- (void) setPosition:(CGPoint)point
{
    if(!animating){
        [super setPosition:CGPointMake(round(point.x / pRatio), round(point.y / pRatio))];
    }else{
        [super setPosition:point];
    }

}


- (void) gotoStartPosition:(NSNotification *)notification
{
    animating = YES;
    CGPoint startPos = CGPointFromString([notification object]);
    CGPoint pStart = CGPointMake(startPos.x / pRatio, startPos.y / pRatio);
    id moveToStart = [MoveTo actionWithDuration:1 position:pStart];
    id endAnim = [CallFunc actionWithTarget:self selector:@selector(endAnimation)];
    [self runAction:[Sequence actions: moveToStart, endAnim, nil]];
}

- (void) endAnimation
{
    animating = NO;
}

Что не элегантно, но работает. Я закрываю этот вопрос.

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