通过缩放场景重绘儿童精灵?

时间:2014-04-17 19:16:17

标签: parent-child sprite-kit scaling children

Spritekit

我有世界地图作为关卡背景。我将ShapeNodes(点)和LabelNodes作为子项放置在世界精灵中,以标记世界各地的主要城市。一切看起来都不错。

当我将世界精灵缩放到特定国家时,点和标签会按照您的预期进行缩放并保持其在世界范围内的位置。点和标签变得像素化并且看起来不太好。处理这个问题的最佳方法是什么?我需要孩子们一直保持自己的位置,但是"重绘"无论世界规模如何,都要保持相同的规模。

不确定如何处理此问题。提前致谢。

编辑:显示缩放方法

static const int MAX_ZOOM_AMOUNT = 6;
static const CGFloat SCALE_AMOUNT = 1.5;
static const CGFloat ANIMATION_DURATION = .15;
- (void)zoomWorld:(BOOL)zoomIn fromLocation:(CGPoint)touchLocation {

    CGPoint anchorPoint = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    CGPoint mySkNodeShift = CGPointSubtract(anchorPoint, CGPointMultiplyScalar(anchorPoint, SCALE_AMOUNT));
    SKAction *scaleUp = [SKAction group:@[
                                        [SKAction scaleBy:SCALE_AMOUNT duration:ANIMATION_DURATION],
                                        [SKAction moveBy:CGVectorMake(mySkNodeShift.x, mySkNodeShift.y) duration:ANIMATION_DURATION]
                                        ]];
    SKAction *scaleDown = [scaleUp reversedAction];

    if (zoomIn) {
        if (self.zoomLevel < MAX_ZOOM_AMOUNT) {
            [self.world runAction:scaleUp];
            self.zoomLevel++;
        }
    } else if (!zoomIn) {
        if (self.zoomLevel > 0) {
            [self.world runAction:scaleDown];
            self.zoomLevel--;
        }
    }
    self.world.position = [self boundLayerPos:self.world.position];

    //Reset UI after the zoom
    if (self.zoomLevel > 2) [self toggleCityLabels:YES];
    else if (self.zoomLevel < 3) [self toggleCityLabels:NO];

    if (self.zoomLevel < 0) self.zoomLevel = 0;
    else if (self.zoomLevel > MAX_ZOOM_AMOUNT) self.zoomLevel = MAX_ZOOM_AMOUNT;
}


-(void)toggleCityLabels:(BOOL)on {
    if (on) {
        for (AMCity *city in self.arrayOfCities) {
            [self.world addChild:city.citySprite];
        }
    }
    else {
        for (AMCity *city in self.arrayOfCities) {
            [city.citySprite removeFromParent];
        }
    }
}

1 个答案:

答案 0 :(得分:0)

关于图像质量,我建议针对不同的缩放级别使用不同的纹理。例如,将texture1用于1.0到0.8之间的比例。使用texture2为0.8到0.6。等等...

对于标签,您可以使用相同的逻辑。找出当前正在查看的点/标签,并创建符合比例因子的新标签。假设您将所有节点存储在一个数组中。