我在解决这个看似微不足道的功能时遇到了一些问题。在我的游戏中,在关卡的某个时刻,我停止了主游戏循环并想要缩放到玩家精灵。播放器精灵被添加到包含此循环的图层并运行代码以缩放到此播放器。
它看起来像这样:
-(void) stopGameAndZoomToPlayer {
[gamePlayLoop_ invalidate];
zoomToPlayerLoop_ = [NSTimer scheduledTimerWithTimeInterval:1.0f/60.0f target:self selector:@selector(tickZoomToPlayerLoop:) userInfo:nil repeats:YES];
}
tick 方法现在是这样实现的:
-(void) tickZoomToPlayerLoop:(NSTimer*)timer {
if (self.scale > 4) {
[zoomToPlayerLoop_ invalidate];
}
[self setScale:self.scale+0.001];
CGSize winSize = [[CCDirector sharedDirector]winSize];
CGPoint targetPosition = playerSprite_.position;
float wantedX = ((winSize.width/2-targetPosition.x)/self.scale);
float wantedY = ((winSize.height/2-targetPosition.y)/self.scale);
CGPoint maximumCenter = ccp(wantedX,wantedY);
[self setPosition:maximumCenter];
}
看起来微不足道吧?然而,我必须缺少一些东西,因为缩放虽然很慢,但相对于玩家精灵是偏移的。播放器精灵,在 tickZoomToPlayerLoop 计时器结束时,出现在屏幕的右上角;它不在中心(但甚至不在视口右上角的中心)。
在我看来,这段代码将主层的中心放在玩家精灵的位置。然后它缩放。实际上这个位置不应该在缩放循环中,但我把它放在这里是因为我需要处理关卡层的边界,因为现在用户可以看到关卡之外的不可播放区域的黑色空白。然而,即使循环开始时主层的中心似乎是玩家精灵,但在缩放时,我们可以看到它不是。
比例尺是否针对 CCNode 的中心?它是否以任何方式抵消?锚点是否在缩放完成方式中起作用?
更多信息:
- 主层的锚点是 (0.5,0.5) - 默认一个
- 主层的位置,首先在计时器之前,(0,0) - 在创建场景时添加