2014-07-23 28 views
2

我有一些构成我游戏背景的单个节点(图块)。它们每个都是32x32p,并且彼此相邻以形成地板/屋顶/障碍物。我从JSON文件加载映射,并在场景初始化时根据JSON文件的内容将节点放置在背景层/节点上。SpriteKit - 节点调整位置一点点

这工作正常,但是,当移动背景层/物理引擎正在做它的事情时,我遇到了一些错误。一些节点相互移动1点/像素,从而在它们之间产生间隙。由于背景颜色不同,这看起来非常糟糕。

这个问题大多发生在地图上(不是马上),与此同时,我向玩家施加冲动或物理引擎弹跳玩家(或类似物)。

下面是说明我的问题一个画面:

Illustrative image. Click to open in new tab (Click to open in separate tab)

正如你所看到的,Ød节点之间的权利,还有一定的差距(更容易在链接中的全尺寸图像中可见)。玩这款游戏的时候会出现很多类似的空白,而且只会出现一两秒钟。有时他们停下来,当玩家停止移动。

我通过增加/减少x-value来移动播放器didSimulatePhysics。然后最后在didSimulatePhysics我调用这个方法来对玩家居中worldNode

- (void)centerViewOn:(CGPoint)centerOn { 
    CGFloat x = Clamp(centerOn.x, self.size.width/2, _bgLayer.layerSize.width - self.size.width/2); 

    _worldNode.position = CGPointMake(-x, _worldNode.position.y); 
} 

worldNode同时包含其中包含了所有的个人背景节点,播放器本身的bgLayer

解决此问题的最佳方法是什么?一个合理的解决方案可能是制作每个瓦片33x32p,因此它们重叠。在那种情况下,你不会看到现在和未来的差距。但我认为最好“杀死”问题而不是隐藏问题。 任何人都有经验来布置他们的地图吗?或者有没有人遇到同样的问题?如果是这样,你是如何解决它的?

在此先感谢!

+4

最好的方法是确保位置是在像素边界,即铸造姿势为int – LearnCocos2D

+0

@ LearnCocos2D我会怎么做呢? – Aleksander

+0

哈哈,我现在明白了。非常感谢!这一直在扰乱我的方式来! – Aleksander

回答

1

这是基于@ LearnCocos2D铸造为int的解决方案评论:

- (void)centerViewOn:(CGPoint)centerOn { 
    CGFloat x = Clamp(centerOn.x, self.size.width/2, _bgLayer.layerSize.width - self.size.width/2); 

    _worldNode.position = CGPointMake(Int(-x), Int(_worldNode.position.y)); 
} 
+0

想了很久以前,但这确实解决了问题:) – Aleksander

+0

我知道,这是为了失落的灵魂在那里(: – oronbz