Tilemap not Scrolling in spritekit
我正在 IOS 中开发一个涉及滚动瓷砖地图的小游戏。
我已经让我的背景图片像这样滚动
1 2 3 4 5 6 7 8 9 10 | - (void)moveBg { [self enumerateChildNodesWithName:@"scroll" usingBlock: ^(SKNode *node, BOOL *stop) { SKSpriteNode * bg = (SKSpriteNode *) node; CGPoint bgVelocity = CGPointMake(-BG_POINTS_PER_SEC, 0.0); CGPoint amtToMove = CGPointMultiplyScalar(bgVelocity, _dt); bg.position = CGPointAdd(bg.position, amtToMove); }]; } |
但是,如果我加载我的 tilemap 并将其命名为 "scroll",如下所示
1 2 3 4 5 6 7 8 | - (TileMapLayer *)createLandScape { _tileMap = [JSTileMap mapNamed:@"level1.tmx"]; _tileMap.name=@"scroll"; return [[TmxTileMapLayer alloc] initWithTmxLayer:[_tileMap layerNamed:@"Background"]]; } |
我相信瓷砖地图滚动与背景图像滚动不同。我想如果有人可以帮助我或为我指出正确的方向来完成这件事。
谢谢!
添加了SKNode的背景并添加了tilemap作为子项。现在,当调用滚动背景代码时,它会与 is
一起滚动 tilemmap
1 2 3 4 5 6 7 | SKSpriteNode * bg = [SKSpriteNode spriteNodeWithImageNamed:@"bg"]; bg.anchorPoint = CGPointZero; bg.position = CGPointZero; bg.name = @"bg"; [self addChild:bg]; [bg addChild:_tileMap]; |
由于 JSTileMap 从 SKNode 扩展而来,您应该能够像应用任何其他节点一样应用操作。
无论如何,您正在将您的 tilemap 投射到一个 SKSpriteNode 中。不仅如此,您还将您的 tilemap package到 TmxTileMapLayer 类中。不知道你为什么要这样做,但问题是你的 JSTileMap 一旦你投射它就超出了范围。
你可能想试试这个:
1 2 3 4 5 6 7 8 9 10 | - (void)moveBg { [self enumerateChildNodesWithName:@"scroll" usingBlock: ^(SKNode *node, BOOL *stop) { JSTileMap * bg = (JSTileMap *) node; CGPoint bgVelocity = CGPointMake(-BG_POINTS_PER_SEC, 0.0); CGPoint amtToMove = CGPointMultiplyScalar(bgVelocity, _dt); bg.position = CGPointAdd(bg.position, amtToMove); }]; } |
您也可以通过强制转换来移动整个package类(如果 TmxTileMapLayer 从 SKNode 扩展)
1 | TmxTileMapLayer * bg = (TmxTileMapLayer *) node; |
另一种滚动瓷砖地图的方法很简单:
1 2 3 4 5 6 7 8 | _tiledMap = [JSTileMap mapNamed:@"level1.tmx"]; if (_tiledMap) { [self addChild:_tiledMap]; } _tiledMap.position = CGPointMake(ORIGINPOINT); SKAction *scroll = [SKAction moveTo:CGPointMake(MOVETOPOINT) duration:SPEED]; [_tiledMap scroll]; |
还有更好的方法(移动一个地图层而不是整个 tileMap):
1 2 3 4 5 6 7 8 9 10 | _tiledMap = [JSTileMap mapNamed:@"level1.tmx"]; if (_tiledMap) { [self addChild:_tiledMap]; } _tiledMap.position = CGPointMake(ORIGINPOINT); TMXLayer *someLayer = [_tiledMap layerNamed:@"someLayer"]; SKAction *scroll = [SKAction moveTo:CGPointMake(MOVETOPOINT) duration:SPEED]; [someLayer scroll]; |