SKNode的运动效果

时间:2014-02-04 12:43:23

标签: ios sprite-kit motion-detection sknode

我正在使用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。所以我的问题是它可能吗?如果没有,那么我该如何实现呢。

2 个答案:

答案 0 :(得分:1)

UIInterpolatingMotionEffect只是将设备倾斜映射到它应用的视图的属性 - 它是关于你设置的keyPath的所有内容,以及这些关键路径的设置者所做的事情。 / p>

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

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

例如......假设您在场景中有一个云精灵,当用户倾斜设备时您想要移动它。将其命名为SKScene子类中的属性:

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

SKView子类中添加移动它的属性和访问器:

@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

现在,您可以创建UIInterpolatingMotionEffectkeyPath的{​​{1}},它应该*自动移动场景中的精灵。

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

答案 1 :(得分:0)

UIInterpolatingMotionEffect在深层次中工作,您无法使用像#X; cloudX"这样的任意keyPath。即使添加了motionEffects,中心属性的实际值也不会发生变化。 所以答案是,你不能添加除UIView之外的动作效果。使用除特定属性之外的任意属性,例如' center'或者'框架'也是不可能的。