我正在尝试在Cocos2d中实现我自己的视差滚动,因为内置的视差功能并不是我正在寻找的(它会缩放图层,这不是我想要的)
所以,我自己的Parallax 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)
并从那里动画到位置。
我无法弄清楚层数位置被设置为0,0,我不明白为什么只有当pRatio高于1时才这样做。
我怀疑这将是一件非常简单的事情,但我认为我的大脑是油炸的。任何帮助,非常感谢。
答案 0 :(得分:0)
更新:我是一个doofus。发生的事情很明显。动画首先将图层位置设置为当前位置。但是我告诉图层用pRatio划分任何setPosition坐标。所以它不是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;
}
哪个不优雅,但它有效。我正在结束这个问题。