【问题标题】:Dealing with different screens处理不同的屏幕
【发布时间】:2011-05-12 01:31:24
【问题描述】:

作为为 Android 编写实时游戏的一个自然部分,我需要能够支持各种屏幕分辨率、密度等。

从 Android SDK 文档中的primary article,我知道我应该为游戏中的每个位图创建单独的资源,以适应不同的屏幕密度;但我不太明白如何处理位置、速度等。

文档说我应该在我的代码中使用与密度无关的单位,只要我使用显式值。但这是否意味着我需要将绝对像素转换为与密度无关的单位每次我使用显式值?

例如,我正在使用高密度 800x480 显示器开发游戏(横向)。现在,我很乐意以每帧 1 个像素的速度移动精灵( 增量时间之后,等等)。所以看起来像:

sprite.setVelocityX(1);

如果我要使用与密度无关的单位,就像文档所建议的那样,我是否必须在 everywhere 使用明确的数字来执行类似的操作?

sprite.setVelocityX(convert(1));

public float convert(float value)
{
    return value * getResources().getDisplayMetrics().density;
}

感觉好像我没有正确理解这个......

【问题讨论】:

  • 不知道这是否有帮助,但 iOS 用点的概念本机处理这个问题。您以点为单位定义屏幕元素。然后 iOS 将它们转换为像素。标准屏幕上的 1pt = 1px。视网膜显示屏上的 1pt = 4px。希望 android 提供这种类型的内置转换(否则听起来确实像一个 PITA 来处理)

标签: android android-layout android-2.2-froyo


【解决方案1】:

我没有动画方面的经验,但我想到的第一个想法就是将一个单元定义为一个

static int UNIT = getResources().getDisplayMetrics().density;

然后将其用作

sprite.setVelocityX(3*UNIT); // replaces sprite.setVelocityX(3);

这样您就可以创建一个 int 并避免每次都查询 DisplayMetrics

也就是说,可能有 OpenGL 或 AndEngine 机制可以直接获取与密度无关的值。

【讨论】:

  • 呃,我想这真的是唯一的方法!
  • @Jesse 称它为static int pt 然后你就知道 DA 对 IOS 的评论了;)
猜你喜欢
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多