2

我正在尝试创建的应用程序是棋盘游戏。它将有一个位图作为棋盘,棋子将移动到棋盘上的不同位置。板子的一般设计是方形的,有一定的列数和行数,并有一个外观的边框。想想棋盘或拼字板。

在使用位图之前,我首先通过手动绘制来创建板和边框 - drawLine & drawRect。我根据“onSizeChanged”中传入的屏幕宽度和高度来决定边框宽度的像素数。剩下的屏幕除以我需要的列数或行数。

例如,假设屏幕尺寸为 102 x 102。

我可能选择将边框设置为 1,并将行数和列数设置为 10。这将留下 100 x 100(减少 2 以说明顶部和底部边框以及左/右边框)。然后将列和行设置为 10,这将留下 10 个像素的高度和宽度。

无论传入什么屏幕尺寸,我都会准确存储边框宽度的像素数以及板上每个正方形的高度和宽度。根据一个简单的公式,我确切地知道将碎片移动到屏幕上的哪个位置,并且我确切地知道用户触摸了哪个单元格以进行移动。

现在如何处理位图?意思是,如果我为每个密度创建 3 个不同的背景位图,它们是否仍会调整大小以适应每个设备的屏幕分辨率,因为从我读到的不仅仅是 3 个屏幕分辨率,而是 5 个,现在使用平板电脑 - 甚至更多的。如果我或 Android 将位图向上或向下缩放以适应当前设备的屏幕尺寸,我将如何知道边框缩放到多宽以及每个正方形的尺寸,以便确定将棋子移动到哪里或计算玩家的位置感动。到目前为止,我看过的示例只是展示了如何缩放整个位图并获得整体位图的宽度和高度。但是,我不知道如何判断板的每个部分在缩放后会有多少像素宽或高。

如果有人有任何示例代码或 URL 指向我可以使用位图阅读此内容,我将不胜感激。

顺便说一句,这里有一些示例代码(非常简化),关于我如何知道我的游戏板(边框和正方形)的尺寸,无论屏幕尺寸如何。现在我只需要知道如何将电路板作为可缩放到任何屏幕尺寸的位图来执行此操作。


 @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
      intScreenWidth = w;
      intScreenHeight = h;

      // Set Border width - my real code changes this value based on the dimensions of w
      // and h that are passed in. In other words bigger screens get a slightly larger
      // border.
      intOuterBorder = 1;

      /** Reserve part of the board for the boardgame and part for player controls & score
          My real code forces this to be square, but this is good enough to get the point
          across.
      **/
      floatBoardHeight = intScreenHeight / 4 * 3;

      // My real code actually causes floatCellWidth and floatCellHeight to
      // be equal (Square).
      floatCellWidth = (intScreenWidth - intOuterBorder * 2 ) / intNumColumns;
      floatCellHeight = (floatBoardHeight - intOuterBorder * 2) / intNumRows;

      super.onSizeChanged(w, h, oldw, oldh);
   }


我想我找到了答案。我可能无法在单个缩放位图中找到每个可播放方块的确切宽度/高度和位置,但是通过查看 SDK 中的 Snake 示例,我发现它不会为整个板创建 1 个位图并缩放它基于屏幕尺寸 - 相反,它为每个图块创建一个位图,然后根据屏幕分辨率和屏幕上所需的图块数量缩放图块 - 就像我手动绘制板时所做的那样。使用这种方法,我应该能够找到板上所有可玩方块的确切像素边界。我只需要将板分成每个正方形的多个位图。我可能必须对边界采取类似的方法,这样我也可以在缩放后检测它们的宽度/高度。

现在我将对其进行测试以验证,但我希望它能够根据我在 Snake SDK 示例中看到的内容工作。

- 麦克风


我测试了一种方法来做我所要求的,它似乎有效。这是我所做的:

我为一块板创建了一个 320 x 320 的位图。它由边框和正方形组成(如棋盘)。边框在电路板上一直宽度为 10 像素。正方形为 20 x 20 像素。

我通过onSizeChanged检测到屏幕的宽高。在 480 x 800 显示器上,我将板的新宽度设置为 480 x 480,并使用以下代码来缩放整个东西:


protected void onSizeChanged(int w, int h, int oldw, int oldh) {        
    floatBoardWidth = w;
    floatBoardHeight = floatBoardWidth;

    bitmapScaledBoard = Bitmap.createScaledBitmap(bitmapBoard, (int)floatBoardWidth, (int)floatBoardHeight, true);      

        super.onSizeChanged(w, h, oldw, oldh);
}

现在为了检测边框被缩放到多少像素宽度以及正方形被缩放到多少像素的高度和宽度,我首先计算了整个图像被缩放了多少。我知道位图是 320 x 320,因为我创建了它。我使用以下公式来计算图像的缩放程度:

floatBoardScale = floatScreenWidth / 320;

在 480 宽屏幕的情况下,floatBoardScale 等于:1.5。然后为了计算我在完整位图中的边框被缩放到什么,我做了:

floatBorderWidth = 10 * floatBoardScale;

10 是我的 320 x 320 位图中的原始边框宽度。在我的最终代码中,我不会硬编码值,我将使用变量。无论如何,在这个公式的情况下,新计算的边框宽度应该是:15

当我将相同的比例因子乘以棋盘方格(原始位图中为 20 x 20)时,我得到了 30 x 30 的新值。当我在公式中使用这些值来计算人触摸的方格时,它起作用了。我触摸了正方形的每个角落和中心,它总是计算出正确的位置。这很重要,所以无论屏幕分辨率如何,我都知道用户想要将一块移动到哪里,并且视觉上它会显示在正确的位置。

我希望这可以帮助任何可能有同样问题的人。另外,如果有人有更好的方法来完成同样的事情,请发布。

4

1 回答 1

2

几件事。首先,开始阅读如何支持多屏。 密切注意了解骤降及其工作原理。

接下来,观看此视频(至少前 15-20 分钟)。

这个主题不是容易掌握的。我发现最好开始在我的代码中玩耍。我建议创建一个表面视图并开始使用一些位图、不同的模拟器(屏幕尺寸和密度)以及不同类型的可绘制文件夹。

不幸的是,这个话题比我认为谷歌想要承认的要多,虽然它绝对是可行的,但对于某些类型的应用程序来说,开始使用它并不容易。

最后,如果您不是在寻找一个抽象的答案(例如这个),您应该考虑将您的问题简化为更直接。

祝你好运!

于 2010-11-11T02:51:33.557 回答