Tilemap floor不显示在背景图片之前

时间:2014-05-19 14:15:16

标签: ios sprite-kit tmx

我在做一些应该非常简单的事情时遇到了一些麻烦。 我无法将瓷砖的地板显示在背景图片上方。但是我可以将我所有的其他游戏对象从我的控制板,我的HUD显示到甚至在同一个瓷砖地图中设置的硬币和怪物。基本上所有东西都出现在背景前面,就像我期待我的瓷砖地图一样,所以它看起来像是在空中行走。我尝试了很多东西,比如改变我添加背景图片或瓷砖地图的图层,或者甚至尝试设置它的方式与我设置我的角色相同但结果相同。 Tilemap地板总是在后面。 添加我的设置代码,希望它也有助于解决问题。

我创建了这个BG精灵,因为我想让我的tilemap垂直滚动或者horzi。自动。因此,我发现这样做的最简单方法是使tilemap成为“bg”的子项并滚动“bg”,从而滚动tile图。但是,我已经尝试将背景设置为bg的子项并为它们设置Z但这似乎没有帮助。 提前感谢您解决此问题的任何帮助

@implementation GameLevelScene
{
   SKNode *_worldNode;
  SKSpriteNode *bg;
    SKSpriteNode *bkg;
}

初始化

    -(id)initWithSize:(CGSize)size level:(int)level {
      if (self = [super initWithSize:size]) {

     //   [self showBackground];


        NSDictionary *levelData = config[@"levels"][level];


//[show background];
        if (levelData[@"tmxFile"]) {
         [self showBackground];
          _tileMap = [ JSTileMap mapNamed:levelData[@"tmxFile"]];
        }

     //self.backgroundColor = [SKColor colorWithRed:.4 green:.4 blue:.95 alpha:1.0];
//  UIImage *bkgb  =[UIImage imageNamed:@"land.jpg"];
  //  self.position=CGPointZero;
 //   self.anchorPoint=CGPointZero;
 //     self.backgroundColor=[UIColor colorWithPatternImage:bkgb];
        //Above code shows no picture but it changes the color
        [self setUpWorld];
        [self createChar];
        [self controlPadNode];  


   //[show background];
             }
          return self;
        }

setUpWorld

 - (void)setUpWorld

{
          bg =   [SKSpriteNode spriteNodeWithImageNamed:@"bg3"];
 bg.userInteractionEnabled=NO;
  bg.anchorPoint = CGPointZero;
  bg.zPosition=0;
  bg.position = CGPointZero;

  bg.name = @"bg";

   [self addChild:bg];


  _worldNode = [SKNode node];
  if (_tileMap) {
       [bg addChild:_tileMap];
      }
   [bg addChild:_worldNode];  

  self.physicsWorld.contactDelegate = self;

}

创建字符

- (void)createChar
 {
   _Layer = [[TmxTileMapLayer alloc]
                initWithTmxObjectGroup:[_tileMap
                                        groupNamed:@"LevelOneObjects"]
                tileSize:_tileMap.tileSize
                gridSize:_bgLayer.gridSize];
   [self addChild:_Layer];



}

创建控件

- (SKSpriteNode *)controlPadNode
//-(void)controlPad
{  
  SKSpriteNode *controlPadNode = [SKSpriteNode spriteNodeWithImageNamed:@"controller.png"];
  controlPadNode.position = CGPointMake(100,50);
  controlPadNode.name = @"controlPadNode";
  controlPadNode.zPosition = 1.0;
  [self addChild:controlPadNode];
}

背景

-(void)showBackground
{

    bkg =   [SKSpriteNode spriteNodeWithImageNamed:@"desert_land.jpg"];
    bkg.userInteractionEnabled=NO;
   bkg.anchorPoint = CGPointZero;
    bkg.position = CGPointZero;
 bkg.zPosition=-1;
    bkg.name = @"bkg";
//   [self addChild:bkg];
  //[_tileMap addChild:bkg];
  // [_worldNode addChild:bkg];
   [bg addChild:bkg];
}

2 个答案:

答案 0 :(得分:1)

将bkg.zposition设置为1并将bg.zPosition设置为2。

此外,制作瓷砖地图的重点不是使用巨大的背景图片,而是使用瓷砖。

**更新**

我刚刚测试了你的代码并自己运行了一个示例项目。我假设你正在使用Tiled应用为你的瓷砖。我在父母(self,worldNode等等)和zPositions上运行变体。底线是你不能这样做。 Tiled的背景颜色选项没有alpha通道。因此,要么背景图像被平铺贴图覆盖,要么背景图像覆盖平铺贴图。

您可能的解决方案是不使用Tiled并手动放置瓷砖或寻找具有Alpha通道的其他瓷砖应用。

答案 1 :(得分:0)

我注意到,如果你说

,你可以在哪里定义瓷砖的墙面属性
 SKSpriteNode* wall =
    [SKSpriteNode spriteNodeWithColor:[SKColor greenColor]
                                 size:CGSizeMake(w, h)];

绿色将是背景的顶部。有点肮脏的解决方案而不是答案