按照教程时缺少图层

时间:2016-04-13 17:09:56

标签: objective-c sprite-kit

我已经按照this教程获取了spritekit的内容,但是遇到了一个问题,并且使用了#tile;'应该在每个有效的瓷砖后面绘制灰色精灵。我使用了didMoveToView()而不是initWithSize(),因为它现在被认为是正确的练习,但是tilelayer没有显示(背景和cookielayer DO显示)。当我将以下代码移动到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 个答案:

答案 0 :(得分:2)

来自didMoveToView的文档:

  

在视图显示场景后立即调用。

didMoveToView vs initWithSize

由于两个主要原因,

didMoveToView经常被用来代替initWithSize

1)现在,默认情况下会从.sks文件加载场景,因此initWithSize实际上并未调用。而是调用initWithCoder

2)如果您根据视图大小定位场景元素,则无法在initWithSize内执行此操作,因为此时视图为nil。所以你必须等待首先出现的场景。之后,self.view(其中self是一个场景)不再是nil,并且didMoveToView被调用。

程序执行顺序

现在,代码中的内容似乎是这样的(我说的是代码的原始版本):

  • viewDidLoad
  • initWithSize被称为
  • 级别已初始化
  • 调用addTiles方法//这是创建灰色平铺
  • 的方法
  • 场景呈现
  • didMoveToView被称为//你实际上没有使用它,但这是它被称为的时刻

问题的原因

所以你得到一张照片?在场景上调用addTiles方法时,您不需要初始化所需的内容(来自initWithSize的内容),因为您将所有内容(推迟执行)移到了{ {1}}。我没有时间仔细研究教程,但该方法中的某些内容失败了,可能就是这样:

didMoveToView

添加一个else块并查看它是否已执行(我可以打赌它会),或者打印该块内部正在使用的内容,你会发现问题,因为这是代码中添加灰色的部分图层为if ([self.level tileAtColumn:column row:row] != nil) {...}

最重要的是,如果你想遵循今天的做法,那么请遵循新的教程(即2014年的教程)。我的意思是,那里有很多不错的东西,但你不能指望你现在在互联网上看到的东西很容易融入两年前写的东西......试着去理解发生了什么在教程中而不是仅仅复制粘贴代码。另外,正如我所说,使用self.tilesLayer不是一种做法。有一个原因(见上文)为什么你可能想要使用它而不是场景的初始化。

答案 1 :(得分: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。将以下行添加到viewDidLoad,   设置self.scene.level之后立即:

[self.scene addTiles];