32

使用方法を学ぶために、新しいスプライト キット プロジェクトを開始しました。多くのチュートリアルを見て読みましたが、質問/問題に対する答えが記載されたチュートリアルはありません。

iPhone 5S 専用のアプリケーションを作成したい。したがって、画面サイズは 1136x640 です。アプリケーション用に 1136x640 の背景画像を作成しました。しかし、自分のアプリに画像を追加すると、その画像は非常に大きくなります! iOS シミュレーターは、画像の中央のみを表示します。

誰かが私が使用しなければならない画面サイズとその理由を教えてもらえますか?

どうもありがとう!

これは、チュートリアルからコピーしたコードです。コードは、initWithSize メソッドの myScene.m ファイルにあります。

        SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
    background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));

    [self addChild:background];

編集

私はグーグルで検索し、これを見つけました:

viewDidLoad メソッドは、「viewWillLayoutSubviews」で変更する必要があります。

この方法は次のとおりです。

    - (void)viewWillLayoutSubviews
    {
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    // Create and configure the scene.
    SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.bounds.size.width*2,skView.bounds.size.height*2)];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];
}

最初のシーン = MySceneWithSize 行は次のとおりです。

SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];

しかし、それは iPhone 5 の画面サイズ (568x320) のちょうど半分でした。だから私はサイズを2倍にしなければなりませんでした。誰かが理由を知っていますか?

4

9 に答える 9

29

当面の問題に対する短い答え:

background.size = self.frame.size;

長い答え、および他の方法についての議論...

シーンは、物理ピクセルではなく、論理ユニットで機能します (他の投稿で述べたように)。

1 論理ユニットは通常、古いキットでは 1 ピクセル、新しいキット/iPad では 2 ピクセルです。これはおそらく 5 年で 4 ピクセルです。

論理ユニットで作業すると、将来のサイズ変更から保護され、プログラマーを支援することになっていますが、これは初心者を混乱させることがよくあります.

現在のシーンを満たす画像を取得する最も簡単な方法は、元のサイズに関係なく、そのサイズを「論理単位」で設定することです。

これは SKActions を使用するよりも優れています (ユーザーがそれらを見ることになる可能性があり、ノードのディメンションに基づく計算はアクションが完了するまで信頼できないため)。元の画像の寸法。

サイズ プロパティを介して、または本当にアニメーションを作成したい場合はアクションを介してこれを行うことができます。

シーンでは単純に....

-(void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];

    SKSpriteNode* background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
    background.size = self.frame.size;
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:background];
} 

別の方法として、画像が高解像度でも問題なく動作する場合は、画像の名前を myBackground@2x.png に変更し、それをプロジェクトに追加します。おそらくサイズを変更する必要はまったくありませんが、低解像度のデバイス用に 50% 縮小し、myBackground.png として保存します。

私は常に、正気を保つために、インポートした画像のサイズを必要な論理単位 (または画面サイズのパーセンテージ) に正確に設定します。

于 2014-10-05T09:35:35.727 に答える
9

イメージが、作成しようとしているノードと同じサイズでない場合、サイズ変更が少しおかしくなることがわかりました (たとえば、非 Retina デバイスで Retina イメージを使用したり、イメージの名前が正しくないなど)。画像からテクスチャを作成し、次のようなものを使用してテクスチャとノード サイズを設定すると、画像を拡大縮小して塗りつぶすことができます。

SKTexture *backgroundTexture = [SKTexture textureWithImageNamed:@"MyImage.png"];
SKSpriteNode *background = [SKSpriteNode spriteNodeWithTexture:backgroundTexture size:self.view.frame.size];
background.position = (CGPoint) {CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame)};
[scene addChild:background];

これで問題が解決するかどうかは 100% わかりませんが、試してみる価値はあります。

于 2013-11-30T21:19:07.707 に答える
8

この行は、ピクセルではなくポイント単位でサイズを返します。これは、デバイスによって解像度が異なりますが、ポイント単位で同じサイズになるためです。非 Retina デバイスでは 1 ポイントは 1 ピクセルであり、Retina デバイスでは 1 ポイントは 2 ピクセルです。それが、このサイズを取得する理由です

SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];

シーンのサイズを 2 倍にしたくないのは、それが画面の境界であり、見えないためです。

于 2013-11-02T19:38:46.950 に答える
3

基本的には上記の回答と同じですが、幅と高さを直接設定して、正しく設定されているかどうかを心配する必要がないようにします。もちろん、iPhone4を使用しているかどうかも確認する必要があります完全な解決のために。

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        CGSize tmpSize;
        tmpSize.width = 640;
        tmpSize.height = 1136;
        // Create and configure the scene
        SKScene * scene = [CreationScene sceneWithSize:tmpSize];

        scene.scaleMode = SKSceneScaleModeAspectFill;

        // Present the scene.
        [skView presentScene:scene];
    }
}
于 2014-03-24T00:42:18.747 に答える
2

解決:

スプライトをロードする UIViewController の viewDidLoad の代わりに、このコードを viewWillLayoutSubviews に入れます。

  - (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {
      skView.showsFPS = YES;
      skView.showsNodeCount = YES;

      // Create and configure the scene.
      SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
      scene.scaleMode = SKSceneScaleModeAspectFill;

      // Present the scene.
      [skView presentScene:scene];
    }
}

説明 : これにより、ビューの境界としてサイズを持つシーンが作成されます。ただし、viewDidLoad が呼び出されると、これはビューがビュー階層に追加される前であるため、レイアウトの変更にはまだ応答していません。そのため、ビューの境界はまだ正しくない可能性があり、シーンを開始するのに最適な時期ではない可能性があります。

この回答は以下からコピーされます: http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners クレジットは Ray に送られます :)。

私はあなたと同じように SKScene で同じコードを使用しましたが、シーンを表示する UIViewController で Ray が提供するこのソリューションがなければ、機能しません。

于 2014-03-14T13:30:58.493 に答える
2

背景にスプライトを使用しました。

    double escalax =        self.size.width/ sprite.size.width  ;
    double escalay =        self.size.height/ sprite.size.height  ;


    SKAction *mostrar = [SKAction scaleXTo:escalax y:escalay duration:0];

それが役に立てば幸い!

于 2014-05-05T17:48:44.807 に答える
2

これは私にとってはうまくいきました。これは大丈夫ですか?

//Set background image.
    SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground.png"];
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    background.xScale = 0.5;
    background.yScale = 0.5;

    [self addChild:background];
于 2014-01-14T16:40:12.203 に答える