【问题标题】:Why does gaps between tiles in an orthogonal tilemap cocos2d game appear when running on iPhone?为什么在 iPhone 上运行正交 tilemap cocos2d 游戏中的瓷砖之间会出现间隙?
【发布时间】:2025-11-29 14:10:01
【问题描述】:

我正在尝试使用 cocos2d 2.1 和 Tiled 0.9.1 制作基于 tilemap 的游戏。游戏在模拟器上运行完美,但在设备上运行时,我的图块之间存在间隙(伪影线)。

请看截图。

差异是原始图块(直接取自图块集的 png)与 cocos2d 渲染的图块之间的差异(在 Photoshop 中制作)。如您所见,在模拟器中它们是 100% 相同的。然而,在设备上,cocos2d 似乎将瓷砖纹理垂直缩小了一点点。 1像素的条纹其实就是tileset中麻烦的tile上面的纹理。

知道是什么原因造成的以及如何解决它吗?

【问题讨论】:

  • 你在使用着色器吗?我的意思显然是您的应用程序在某个地方,但我不熟悉您的特定库。如果您编写了自己的 GLSL 着色器,首先想到的是纹理坐标的精度。接下来是纹理环绕模式,但我认为模拟器和实际硬件在这方面会非常一致 - 精度是它们最大的差异。
  • @AndonM.Coleman 不,我没有使用任何自定义着色器,所以我认为所有着色器都来自 cocos2d。
  • @AndonM.Coleman 顺便说一句,模拟器和设备确实存在一些精度差异。例如,一个特定的计时器是 64 位浮点数,而另一个是 32 位浮点数,并且假设它始终是 32 位,从而导致我的代码出现问题。但是如果这个问题确实有精度问题,我真的不知道在哪里。

标签: ios iphone opengl-es cocos2d-iphone


【解决方案1】:

虽然使用 this answer 在我的情况下启用 CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 是不够的。

我还将以下代码添加到 AppDelegate::applicationDidFinishLaunching() 函数并将传递给 setPosition(x, y) 函数的值舍入到最接近的 int。

Director::getInstance()->setProjection(Director::Projection::_2D);

我用cocos2d-x 3.4.

【讨论】:

    【解决方案2】:

    不确定为什么这种情况只发生在设备上,但您应该阅读 ccConfig.h 中的参数 CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL。这本身就是一个糟糕的组合,但它会给你一个关于在哪里看的提示。

    基本上,您应该确保您的所有位置都在精确的像素边界上,即在非视网膜设备上将它们转换为 int,在视网膜设备上四舍五入到最接近的 0.5 的精确倍数。确保这一点的最佳方法是将所有纹理制作成偶数……对于任何不会移动的东西,艺术家都有责任。如果您移动了东西,并且计算了最终位置(例如在 ccTouches move,end 中),请确保您在此处进行此舍入。注意批处理节点:节点本身及其所有子节点都应该在像素边界上。

    【讨论】:

    • 好的,我接受这个作为答案,因为它解决了间隙问题,即使它似乎将纹理拉伸得比应有的更大。谢谢
    最近更新 更多