我正在获取SpriteKit。并想知道如何在SKNode对象上创建运动效果。

对于UIView,我使用以下方法:

+(void)registerEffectForView:(UIView *)aView
                   depth:(CGFloat)depth
{
UIInterpolatingMotionEffect *effectX;
UIInterpolatingMotionEffect *effectY;
effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
                                                          type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y"
                                                          type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];


effectX.maximumRelativeValue = @(depth);
effectX.minimumRelativeValue = @(-depth);
effectY.maximumRelativeValue = @(depth);
effectY.minimumRelativeValue = @(-depth);

[aView addMotionEffect:effectX];
[aView addMotionEffect:effectY];
}


我还没有找到与SKNode类似的东西。所以我的问题是可能吗?如果没有,那我该怎么实现呢。

最佳答案

UIInterpolatingMotionEffect只是将设备的倾斜度映射到它所应用的视图的属性-一切都与设置keyPath的内容以及这些关键路径的设置方法有关。

您发布的示例将水平倾斜映射到视图的x属性的center坐标。当设备水平倾斜时,UIKit会自动在视图上调用setCenter:(或设置view.center =(如果您更喜欢这种语法,则设置UIView)),并传递一个X坐标与水平倾斜量成比例偏移的点。

您也可以在自定义SKView子类上定义自定义属性。由于您正在使用Sprite Kit,因此可以将SKScene子类化以添加属性。

例如,...说您的场景中有一个想要随用户倾斜设备而移动的云精灵。将其命名为SKView子类中的属性:

@interface MyScene : SKScene
@property SKSpriteNode *cloud;
@end


并在您的UIInterpolatingMotionEffect子类中添加用于移动它的属性和访问器:

@implementation MyView // (excerpt)

- (CGFloat)cloudX {
    return ((MyScene *)self.scene).cloud.position.x;
}
- (void)setCloudX:(CGFloat)x {
    SKSpriteNode *cloud = ((MyScene *)self.scene).cloud;
    cloud.position = CGPointMake(x, cloud.position.y);
}

@end


现在,您可以创建keyPathcloudX的,它应该*自动在场景中移动精灵。

(*完全未经测试的代码)

关于ios - SKNode的运动效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21552911/

10-09 13:08