【问题标题】:Cocos2D: Updating positions for retinaCocos2D:更新视网膜的位置
【发布时间】:2014-03-03 18:39:30
【问题描述】:

我一直在使用 Cocos2D 0.99.5 的修改版本。就位置而言,这个修改后的版本没有任何变化,但是当我启用视网膜时,tmx 地图显示正常,但检测到的瓷砖,很可能使用 tileGIDAt 和带有 ccp 的位置,以及定位精灵都离得很远。这是我已经进行了一些研究的已知情况,但不知道克服它的最简单方法。我希望在 Cocos2D 中只编辑一些东西(使用视网膜时使用点而不是像素)来解决这个问题,但我还没有在网上看到任何提到这一点的东西。

我看到一些代码将对象的位置除以 CC_CONTENT_SCALE_FACTOR

CGPoint objectPosition = [tmxLayer positionAt:objectTile];
if (CC_CONTENT_SCALE_FACTOR() == 2){
  objectPosition.x /= CC_CONTENT_SCALE_FACTOR();
  objectPosition.y /= CC_CONTENT_SCALE_FACTOR();
}

在查看了 Cocos2D 中的一些方法后,我真的不知道在哪里使用它。那么我需要做哪些确切的更新以及我需要将它们放在哪里?

【问题讨论】:

  • 您正在使用超过 3 年的 cocos2d 版本.. 为什么? FWIW,如果不是 2.x,您可能最好尝试一下,至少升级到 v1.1。
  • 这能解决这个问题吗?我尝试升级到 2.x,但由于我有数百个代码文件,所以有太多不兼容的东西。
  • 不知道,但 1.1 和 2.x 肯定有更多的修复/更好的 Retina 支持。你的版本绝对不支持 iPad Retina 和宽屏手机。至于更改,其中大部分将被重命名为类/方法,功能基本保持不变。您总是可以先尝试更新到 1.0.1 或 1.1,然后再从那里升级到 2.x。
  • 谢谢。我可以在不切换到 ARC 的情况下进行这些升级吗?

标签: objective-c cocos2d-iphone position retina-display


【解决方案1】:

我遇到了同样的问题,这是我发现的。

问题与点与像素以及 Cocos2d 如何处理它们有关,您在问题中提到了这一点。如您所知,非视网膜显示器上的点与视网膜显示器相同。非视网膜的 iPhone 3GS 的分辨率为 320 x 480,该屏幕的中心点为 160 x 240。视网膜的 iPhone 4 的分辨率为 640 x 960,但中心“该屏幕的点”仍然是 160 x 240。

让我们假设您的 tmx 地图由 32 x 32 像素的图块组成。让我们进一步假设您想要检查您的“英雄”精灵当前所在的图块。最后,让我们假设您的英雄精灵的位置是 192 x 288。要获得图块坐标,您可以从逻辑上获取精灵的位置并将 x 和 y 位置除以 32 的图块大小(我省略了 Y坐标翻转的东西)。与其硬编码 32 的值,我假设您通过使用类似于以下代码的代码来获取此值,其中 tileMap 是您已经加载的地图:

tileMap.tileSize.width

因此,根据 192 x 288 的位置,您的英雄位于地图中 6 x 9 的图块上。问题是在视网膜显示器上 192 x 288 的位置是基于点的,但你的 32 x 32 瓷砖是基于像素的。在视网膜显示器上,32 x 32 像素实际上是 16 x 16 点。所以实际上,你的英雄精灵不是在 6 x 9 块,而是在 12 x 18 块。

因此,解决此问题的一种简单方法是检查视网膜显示器,如果存在,则在尝试确定特定图块坐标时,应将图块的宽度和高度除以 2 以将其转换为点.

这对我很有用,我希望它也能帮助你。

【讨论】:

  • 仍然有很多问题,但我认为这是改进!现在我遇到了对象放置的问题,但我想我最终会解决的。谢谢
  • 没问题。乐意效劳。这对我来说也很痛苦,但大多数问题都与我上面描述的有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多