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];
}
}
}
答案 0 :(得分:0)
关于图像质量,我建议针对不同的缩放级别使用不同的纹理。例如,将texture1用于1.0到0.8之间的比例。使用texture2为0.8到0.6。等等...
对于标签,您可以使用相同的逻辑。找出当前正在查看的点/标签,并创建符合比例因子的新标签。假设您将所有节点存储在一个数组中。