10

次のような SKScene サブクラスを提示する SKView を作成しました。

SKView *skv = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:skv];

self.skScene = [[TestScene alloc] initWithSize:v.bounds.size];
[skv presentScene:_skScene];

次に、座標系の原点を確認するために、小さな 10x10 色の正方形をシーンに追加します。

SKSpriteNode *ori = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(10,10)];
[self addChild:ori];

左下隅に緑色の四角が表示されます。

左下隅の緑色の点

やはりSpriteKitの座標系は、原点が常に中心になるようになっています。しかし、シーンでは、原点は左下隅にあります。子ノードを {0,0} に追加すると、左下隅にも表示されます。

SKSpriteNode を追加してシーンに {0,0} 配置すると、左下隅に表示されます。ただし、左下隅のシーンの原点を中心にしています (左半分と下半分が切り取られています)。

しかし、今ではもっと混乱しています。SKSpriteNode を別の SKSpriteNode に追加すると、サブスプライトが親の中央に配置されます。

では、シーンの座標系はスプライトの座標系とは異なる働きをするということですか?

要約:

  • スプライトをシーンの {0,0} に配置すると、左下に表示され、50% 切り取られます (原点を中心に)。
  • {0,0} のスプライトにスプライトを配置すると、スプライトの中央に表示されます。

シーンの構成が間違っていますか、それともこのように動作しますか?

4

3 に答える 3

17

これが仕組みです。すべての OpenGL ビュー (少なくとも 2D ビュー) の原点は左下隅にあります。

スプライトの位置も正しいです。どちらもデフォルトで 0,0 にあります。スプライトのテクスチャは、anchorPoint 係数に基づいてノード位置を基準にして描画されます。デフォルト値は 0.5 で、0.5 はテクスチャをノードの位置の中央に配置します。

シーンの anchorPoint を 0.5,0.5 に変更すると、スプライトがシーンの中心に移動します。スプライトの anchorPoint を変更することもできますが、回転、スケール、衝突検出、子ノードの位置などに影響するため、お勧めできません。

于 2013-12-31T14:15:50.940 に答える
3

このコードを GameViewController.swift に追加できます:

override func viewDidLoad() {
        super.viewDidLoad()

        // Detect the screensize
        var sizeRect = UIScreen.mainScreen().applicationFrame
        var width = sizeRect.size.width * UIScreen.mainScreen().scale
        var height = sizeRect.size.height * UIScreen.mainScreen().scale

        // Scene should be shown in fullscreen mode
        let scene = GameScene(size: CGSizeMake(width, height))


        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)
    }
于 2015-06-13T11:12:11.017 に答える