2

我正在 IOS 中开发一个涉及滚动瓷砖地图的小游戏。我已经让我的背景图片像这样滚动

- (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 并将其命名为“滚动”,如下所示

- (TileMapLayer *)createLandScape
{

  _tileMap = [JSTileMap mapNamed:@"level1.tmx"];
  _tileMap.name=@"scroll";
  return [[TmxTileMapLayer alloc]
          initWithTmxLayer:[_tileMap layerNamed:@"Background"]];
}

我相信瓷砖地图滚动与背景图像滚动不同。我想如果有人可以帮助我或为我指出正确的方向来完成这件事。

谢谢!

4

2 回答 2

2

添加了 SKNode 的背景并将 tilemap 添加为子项。现在,当调用滚动背景代码时,它会滚动 tilemmap 以及 is

  SKSpriteNode * bg =
  [SKSpriteNode spriteNodeWithImageNamed:@"bg"];
  bg.anchorPoint = CGPointZero;
  bg.position = CGPointZero;
  bg.name = @"bg";
  [self addChild:bg];
    [bg addChild:_tileMap];
于 2014-04-19T20:39:24.807 回答
1

由于 JSTileMap 从 SKNode 扩展而来,因此您应该能够像应用任何其他节点一样应用操作。

无论如何,您正在将您的 tilemap 转换为 SKSpriteNode。不仅如此,您还将您的 tilemap 包装到 TmxTileMapLayer 类中。不知道你为什么要这样做,但问题是你的 JSTileMap 一旦你投射它就超出了范围。

你可能想试试这个:

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

您也可以通过强制转换来移动整个包装类(如果 TmxTileMapLayer 从 SKNode 扩展)

TmxTileMapLayer * bg = (TmxTileMapLayer *) node;

滚动瓷砖地图的另一种方式很简单:

_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):

_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];
于 2014-08-02T16:39:27.967 回答