0

我得到 int 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 类似的东西。所以我的问题是有可能吗?如果没有,那么我该如何实现它。

4

2 回答 2

1

UIInterpolatingMotionEffect 在深层工作,您不能使用像“cloudX”这样的任意 keyPath。即使添加了motionEffects,center属性的实际值也不会改变。所以答案是,不能添加UIView以外的运动效果。也不可能使用除特定属性之外的任意属性,例如“中心”或“框架”。

于 2016-03-19T05:00:51.553 回答
0

UIInterpolatingMotionEffect只需将设备倾斜映射到它所应用的视图的属性——这keyPath完全取决于您设置它的内容,以及这些关键路径的设置器的作用。

您发布的示例将水平倾斜映射到视图属性的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

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

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

于 2014-02-04T19:33:00.530 回答