3

问题是,Cocos 似乎认为 Retina 设备的分辨率与标准设备相同。如果你在 ipad 上的 768,1024 处绘制一个精灵,它会放在右上角。如果您在 Retina ipad 上的 768,1024 处绘制一个精灵,内容缩放会使其也位于右上角。然而,如果你在 640,1136 的视网膜 iphone 5 上绘制一个精灵,它不在右上角,它在屏幕之外的距离是 2 倍。为了把它放在角落里,由于内容缩放,你必须在 320,568 处绘制它。

我确实有一个 Default-568h@2x.png 图像,并且我使用的是 2.1 版。

我的问题是:有没有办法让 Cocos2d 做到这一点,以便在 iPhone5 上绘制 640,1136 的精灵会导致精灵在右上角?

是否可以设置 cocos2d 自定义 GL 投影并将 winSizeInPoints 设置为等于 winSizeInPixels 和内容比例 1.0,以便您可以使用 iPhone 4/5 的完整原始分辨率而不是使用旧 iPhone 的半尺寸坐标。

4

3 回答 3

1

是的,您可以分享,简单的方法是将所有常见的精灵放在精灵表中,并在运行时检查 iPad,如果是,则加载 iPhone HD 表。我们在许多项目中都这样做并工作过。

if(IS_IPAD)
{
   [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"GameSpriteSheet-hd.plist"];
}
else 
{
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"GameSpriteSheet.plist"];

}

对于背景图像,最好有单独的 iPad 图像,如果缩放看起来不错,那么您可以在运行时缩放图像。

于 2013-09-30T05:18:42.180 回答
1

您可以通过 CCFileUtils将 iPad 后缀更改为使用“-hd”来轻松做到这一点。这样,iPad 设备将为 Retina iPhone 加载常规的 -​​hd 资产。

关于评论的更新:

设备上的位置以点为单位,而不是像素。因此,非视网膜 iPad 和视网膜 iPad 的点分辨率均为 1024x768。这很好,因为它使适应具有不同像素密度的屏幕变得轻而易举。这也适用于 iPhone 设备。

我的怀疑是您还没有将 Default-568h@2x.png 启动图像添加到您的项目中,这可能会导致宽屏设备的处理方式不同。

特别是在 iPhone 5 之前的旧 cocos2d 版本中,存在一个错误,它将 iPhone 5 视为非 Retina 设备,无论是否正确的默认图像。

于 2013-09-27T08:01:44.033 回答
1

据我所知,您正在尝试执行以下操作:

  1. [director enableRetinaDisplay:NO]设置时调用CCDirector

  2. 修改或覆盖 's 中的以下方法,CCDirector以便将 winSizeInPixels 定义为全屏分辨率:

    一个。setContentScaleFactor:;

    湾。reshapeProjection:;

    C。setView:;

第 1 步将确保在渲染精灵或进行计算时不应用缩放因子;第 2 步将确保在需要时使用全屏分辨率(例如,在定义投影时,但也可能在其他地方)。

关于第 2 步,您会注意到所有列出的方法都显示如下语句:

winSizeInPixels_ = CGSizeMake( winSizeInPoints_.width * __ccContentScaleFactor, winSizeInPoints_.height * __ccContentScaleFactor );

__ccContentScaleFactor等于1第1步,你应该这样离开它;例如,您可以根据您的目标自定义 winSizeInPixels 计算,如下所示:

if (<IPHONE_4INCHES>)
    winSizeInPixels_ = CGSizeMake( winSizeInPoints_.width * 2, winSizeInPoints_.height * 2 );
else 
    winSizeInPixels_ = CGSizeMake( winSizeInPoints_.width * __ccContentScaleFactor, winSizeInPoints_.height * __ccContentScaleFactor );

不幸的是,定义自定义投影不起作用,因为 winSizeInPixels 总是基于__ccContentScaleFactor; 但是,__ccContentScaleFactor在 Cocos2D 中也到处使用来定位/调整 sprite 等。

关于实现的最后一点,您可以将这些更改破解到现有CCDirectorIOS类中,或者您可以从它自己的类中派生MYCCDirectorIOS并覆盖那里的方法。

希望能帮助到你。

于 2013-10-04T16:16:46.480 回答