4

我有一个SKShapeNodeshapeNodeWithRect: cornerRadius:. 这个圆角矩形是 SKEffectNode 的子对象,因此我可以设置shouldRasterize = YES.

我想根据用户的触摸来改变这个节点的宽度。即当他们将手指水平向右移动时,矩形会变大(当他们向左移动时会变小)。

  1. 我可以通过用SKShapeNode新尺寸替换原件来做到这一点(但这很糟糕)。
  2. 我尝试在SKEffectNodeand上运行调整大小操作SKShapeNode(但这不起作用,因为调整大小仅适用于SKSpriteNotes[SKAction Apple Docs -- Resize]):

[self runAction:[SKAction resizeToWidth:newSize.width height:newSize.height duration:0]]; [self.shapeNode runAction:[SKAction resizeToWidth:newSize.width height:newSize.height duration:0]];

  1. 我可以像在这个答案中那样更改 xScale:Change height of an SKShapeNode。但如果我这样做,SKShapeNode就会被像素化。

我该怎么做?

在 UIKit 中非常简单(只需设置 UIView 的框架)......

4

1 回答 1

2

创建SKShapeNode大尺寸的对象,然后立即按比例缩小它们。如果你这样做,你不应该遇到模糊或像素化的节点。

在 Swift 4.0 中:

class GameScene: SKScene {
    var roundedRect: SKShapeNode!
    didMove(to view: SKView) {
         roundedRect = SKShapeNode(rect: Constants.RoundedRect.largeInitialRect, cornerRadius: Constants.Rect.largeInitialCornerRadius)
         // configure roundedRect
         addChild(roundedRect)
         scaleRoundedRect
    }

    func scaleRoundedRect(to size: CGSize) {
        roundedRect.xScale = roundedRect.xScale / frame.width * size.width
        roundedRect.yScale = roundedRect.yScale / frame.height * size.height
    }
}

在 Objective-C 中:

@implementation GameScene

    - (void) didMoveToView:(SKView *)view {
        CGRect largeRect = CGRectMake(0, 0, 0, 0); // replace with your own values
        CGFloat largeCornerRadius = (CGFloat) 0; // replace with your value
        _roundedRect = [SKShapeNode shapeNodeWithRect:largeRect cornerRadius:largeCornerRadius];
        CGSize initialSize = CGSizeMake(0, 0); // replace with your value
        [self scaleRoundedRectToSize:initialSize];
    }

    - (void) scaleRoundedRectToSize:(CGSize)size {
        _roundedRect.xScale = _roundedRect.xScale / _roundedRect.frame.size.width * size.width;
        _roundedRect.yScale = _roundedRect.yScale / _roundedRect.frame.size.height * size.height;
    }


@end
于 2017-12-10T00:30:49.380 回答