web-dev-qa-db-ja.com

背景画像サイズスプライトキットゲーム

使用方法を学ぶために、新しいSprite Kitプロジェクトを開始しました。私は多くのチュートリアルを見たり読んだりしましたが、質問/問題に対する答えのあるチュートリアルはありません。

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];

[〜#〜] edit [〜#〜]

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

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倍にしなければならなかった。誰かが理由を知っていますか?

30
Mike_NotGuilty

あなたの差し迫った問題に対する短い答え:

background.size = self.frame.size;

長い答え、および他の方法に関する議論...

シーンは、物理ピクセルではなく論理ユニットで機能します(他の投稿で説明されています)。

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

Logical Unitsで作業することで、将来的にサイズが変化するのを防ぎ、プログラマを支援することになっていますが、これは初心者を混乱させることがよくあります。

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

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

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

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

-(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];
} 

または、画像がそのままで、高解像度でうまく機能する場合は、画像の名前を[email protected]に変更し、プロジェクトに追加すると、おそらくサイズを変更する必要はありませんが、低解像度のデバイスでは50%縮小し、myBackground.pngとして保存します。

インポートされた画像のサイズは、必要な論理単位(または画面の大きさの割合)に合わせて常に設定し、健全性を維持します。

29
GilesDMiddleton

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

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%わかりませんが、一見の価値はあります。

9
James Jones

この行は、ピクセルではなくポイント単位でサイズを返します。これは、デバイスごとに解像度が異なりますが、ポイント単位で同じサイズになるためです。網膜以外のデバイスでは1ポイントは1ピクセルであり、網膜デバイスでは1ポイントは2ピクセルです。だからあなたはこのサイズを

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

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

8
Dvole

画像の名前の最後に「@ 2x」を追加しようとしましたか?

7
user2763173

基本的には上記の答えとして行いますが、幅と高さを直接設定して、正しく設定されているかどうかを心配する必要はありません、もちろん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];
    }
}
3
Glen Zenfar

背景にはSpriteを使用しました。

    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];

それが役に立てば幸い!

解決:

このコードを、Spriteをロードする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で提供し、シーンを表示しますが、動作しません。

2
MB_iOSDeveloper

これは私のために働いた。これは大丈夫ですか?

//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];
2
Jason

私も同じ問題を抱えています。数日間グーグルで試した後、ついにこの問題の鍵を手に入れました。満足のいくサイズになるまで、scene.scaleModeを数回変更することができます。昨夜見つけたばかりなので、もっと知りたい方はリンクをご覧ください

https://developer.Apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/Reference/Reference.html#//Apple_ref/doc/uid/TP40013024-CH1-DontLinkElementID_

1
Alfred