2016-04-13 8 views
1

thisチュートリアルに従ってspritekitを取得しましたが、それぞれの有効なタイルの背後に灰色のスプライトを描くはずの 'tilelayer'に問題がありました。私は、実際には正しい習慣であるため、initWithSize()の代わりにdidMoveToView()を使用しましたが、タイルレイヤーは表示されませんでした(背景とcookielayerが表示されます)。代わりにinitWithSize()に次のコードを移動し(代わりにviewcontrollerを適切に呼び出すように変更した)、tilelayerが表示されました。チュートリアルの後にレイヤーがありません

-(void)didMoveToView:(SKView *)view { 

self.swipeFromColumn = self.swipeFromRow = NSNotFound; 

self.anchorPoint = CGPointMake(0.5, 0.5); 
SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"Background"]; 
[self addChild:background]; 


//gamelayer 
self.gameLayer = [SKNode node]; 
[self addChild:self.gameLayer]; 

CGPoint layerPosition = CGPointMake(-TileWidth*NumColumns/2, -TileHeight*NumRows/2); 


self.tilesLayer = [SKNode node]; 
self.tilesLayer.position = layerPosition; 


//add tiles layer 
[self.gameLayer addChild:self.tilesLayer]; 

self.cookiesLayer = [SKNode node]; 
self.cookiesLayer.position = layerPosition; 


//add cookies layers 
[self.gameLayer addChild:self.cookiesLayer]; 

self.swipeFromColumn = self.swipeFromRow = NSNotFound; 

self.selectionSprite = [SKSpriteNode node]; 

[self preloadResources]; 

}

答えて

2

didMoveToViewについてのドキュメントから:シーンがビューによって提示された直後に呼び出され

1)今日では、シーンがデフォルトで.sksファイルからロードされているので、initWithSize:initWithSize

didMoveToView

didMoveToViewがあるため2つの主な理由で、多くの場合、代わりのinitWithSize使用されています実際には呼び出されません。代わりにinitWithCoderが呼び出されます。

2)ビューのサイズに基づいてシーン要素を配置する場合は、その時点ではnilであるため、initWithSizeの内部では行うことはできません。だから、シーンが最初に提示されるのを待たなければなりません。その後、self.view(selfはシーン)はもうゼロではなく、didMoveToViewが呼び出されます。

  • viewDidLoad
  • は、物事はあなたのコード内でこのように行くように見えるプログラム実行の順序(私は、コードの元のバージョンについて話しています) initWithSizeを呼び出す

  • レベルが初期化されました
  • addTilesメソッドが呼び出されました// thisあなたが実際にそれを使用しないでください//
  • didMoveToView
  • が呼ばれ提示され、あなたの グレータイル
  • シーンを作成しますが、これはそれがの

原因と呼ばれた瞬間は何かということです問題

画像が表示されますか?シーン上でaddTilesメソッドを呼び出す瞬間に、didMoveToViewの中で(実行を延期した)すべてを移動したので、必要なものを初期化していません(initWithSizeのもの)。私はチュートリアルに密接に見て時間を持っていないが、その方法の中で何かが失敗し、おそらくこの:

if ([self.level tileAtColumn:column row:row] != nil) {...}

他のブロックを追加し、それが実行されているかどうか(私はそれを賭けることができます)、またはブロック内で何が使用されているかを印刷します。その部分がグレイのレイヤーを追加するコードの一部であるため、問題が見つかります。self.tilesLayer

ボトムライン、今日のプラクティスに従いたい場合は新しいチュートリアルに従います(つまり、2014年のチュートリアルです)。私は、そこにはすてきなものがたくさんありますが、インターネットで最近見たものが2年前に書かれたものに簡単に収まるとは思っていません...何が起こっているのか理解してみてくださいチュートリアルではなく、コードを貼り付けるだけです。また、私が言ったように、didMoveToViewを使用することは実践ではありません。シーンのinitの代わりにそれを使用する理由があります(上記参照)。

+1

ああ、あなたはそれを持っています。 if文はまだtrueですが、self.tilesLayerはnullなので、何も起こらないことを意味します。長い説明をありがとう。もっと最近のチュートリアルの提案があれば、ぜひ聞いてみたいですね! – Cesar

+0

@Cesarここでいくつかの素晴らしいことを見つけることができます(AppleのDemoBotsゲーム):https://developer.apple.com/library/ios/samplecode/DemoBots/Introduction/Intro.html – Whirlwind

1

あなたのタイル層は、あなたはそれがグレーになりたい場合は、あなたが背景色を追加する必要があり、一般的なSKNodeです。

チュートリアルのこの部分をしました:あなたが提供するチュートリアルでは、多分あなたはそれが間違っ

編集を読んでいる、私が見たものからグレーは使用しませんか?

だけでなく、RWTMyScene.mに次のメソッドを追加します。

- (void)addTiles { 
    for (NSInteger row = 0; row < NumRows; row++) { 
    for (NSInteger column = 0; column < NumColumns; column++) { 
     if ([self.level tileAtColumn:column row:row] != nil) { 
     SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithImageNamed:@"Tile"]; 
     tileNode.position = [self pointForColumn:column row:row]; 
     [self.tilesLayer addChild:tileNode]; 
     } 
    } 
    } 
} 

をあなたは、他のクラスからこのメソッドを呼び出すので、オープン RWTMyScene.h、そこにメソッド宣言を追加する必要があります。

- (void)addTiles; 

次に、RWTViewController.mを開きます。あなたがself.scene.levelを設定した直後のviewDidLoad、 に次の行を追加します。

[self.scene addTiles]; 
+0

私はあなたの編集に気付きませんでした。私は自分の答えを書いていました。そしてあなたと同じように、私は 'addTiles'メソッドが問題の原因であるということはとても肯定的です。それでも、私はこの問題に関するいくつかの詳細を記述しているので、私は答えを残します。 – Whirlwind

+0

私はこのチュートリアルのすべての部分を持っています。私が言ったように、タイルレイヤーはdidMoveToViewから貼り付けられたコードをinitWithSizeに移動すると正しく動作しますが、なぜか分かりません。 – Cesar

+0

@Cesar 'ViewDidLoad'で' addTiles'を呼び出していて、didMoveToViewに他のものを呼び出している場合は、タイミング問題があります。 'didMoveToView'の前に' ViewDidLoad'が発生するので、 – Knight0fDragon

関連する問題