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 以外のモーション効果を追加できないということです。「center」や「frame」などの特定のプロパティ以外の任意のプロパティを使用することもできません。

于 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

これで、 が であるUIInterpolatingMotionEffectを作成できます。シーン内のスプライトを自動的に移動する必要があります*。keyPathcloudX

(*完全にテストされていないコード)

于 2014-02-04T19:33:00.530 に答える