Cocos2D:更新视网膜的位置

时间:2014-02-06 17:02:26

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

我一直在使用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中查看了一些方法后,我真的不知道在哪里使用它。那么我需要做什么准确的更新以及我需要在哪里进行更新?

1 个答案:

答案 0 :(得分: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,将其转换为点。

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