【问题标题】:Issues with screen sizes and activity rendering屏幕尺寸和活动渲染问题
【发布时间】:2010-07-24 20:54:54
【问题描述】:

我目前正在开发我的第一个 Android 应用程序和我的第一个游戏。我一直在使用 CliqXT (HVGA) 开发上网本。一切进展顺利,它在较小的屏幕上完美呈现。我知道在大屏幕上渲染时会遇到一些问题,但是我遇到的问题不是我所期望的,我有点卡住了。

所以基本上游戏由一个主 SurfaceView 组成,我将在其上渲染平铺的游戏世界。我按照本教程开始,我的结构仍然非常相似,只是它根据玩家位置计算边界:

http://www.droidnova.com/create-a-scrollable-map-with-cells-part-i,654.html

游戏也有玩家可以进入的各种建筑。进入后,它会为该特定建筑物启动另一项活动。构建活动只是具有在 XML 中定义的 Android UI 内容(按钮、TextViews 等)的普通视图。

我预期会发生什么:

所以我希望建筑 UI 能够在更大的屏幕上正确呈现。我在“dp”中指定了所有尺寸,在“sp”中指定了字体,希望它们能够正确缩放。我预计实际的游戏瓷砖地图通常可以正确渲染,但由于分辨率/ dpi 更高,可能真的很小。我正在使用与上面链接的教程非常相似的函数(calculateLoopBorders(),我的版本粘贴在下面)来计算基于屏幕高度和宽度(getHeight() 和 getWidth())要渲染的图块数量。

实际情况:

整个游戏只是被渲染为 HVGA。瓷砖地图和建筑 UI 只是缩小到较小的屏幕尺寸,在左侧、右侧和底部留下黑色边框(见图)。

如果有人能指出我正确的方向,将不胜感激,非常感谢!

(你们中的一些人可能认识这个公共领域的 DOS 经典)

编辑:感谢 Christian 修复代码格式。

mCellHeight 和 mCellWidth 是单元格的宽度/高度(以像素为单位)

mMapHeight 和 mMapWidth 是整个游戏世界的宽度/高度(以图块数量表示)

  public void calculateLoopBorders() {

  mWidth = getWidth();
  mHeight = getHeight();


  mStartRow = (int) Math.max(0, mPlayer.mRow - ((int) (mHeight / 2) / mCellHeight));
  mStartCol = (int) Math.max(0, mPlayer.mCol - ((int) (mWidth / 2) / mCellWidth));

  mMaxRow = (int) Math.min(mMapHeight, mStartRow + (mHeight / mCellHeight)) + 1;
  mMaxCol = (int) Math.min(mMapWidth, mStartCol + (mWidth / mCellWidth));

  if (mMaxCol >= mMapWidth) {
   mStartCol = mMaxCol - (mWidth / mCellWidth);
  }

  if (mMaxRow >= mMapHeight) {
   mStartRow = mMaxRow - (mHeight / mCellHeight); 
  }

  int x1 = mStartCol * mCellWidth;
  int y1 = mStartRow * mCellHeight;
  int x2 = x1 + mWidth;
  int y2 = y1 + mHeight;

  mBgSrcRect = new Rect(x1, y1, x2, y2);
  mBgDestRect = new Rect(0,0, mWidth, mHeight);
 }

【问题讨论】:

标签: android compatibility


【解决方案1】:

我想通了。我在项目中的目标是 1.5,所以它假设 HVGA。 Targeting 2.1 解决了这个问题,位图甚至似乎使用某种 android 魔法正确缩放。

不过我还有一个问题,当我完成这个游戏时,我希望它能够在 1.5+ 设备上运行。我是否需要将单独的构建投放市场,每个设备类别一个?对于可以在应用程序本身的一行或两行代码中处理的事情来说,这似乎很麻烦......但我从未发布过应用程序,所以它可能在此过程中很容易处理。

【讨论】:

  • 您可以以 1.6 为目标,并将支持的最低 SDK 设为 1.5(清单中的<uses-sdk android:minSdkVersion="3" />)并使您的代码与 1.5 兼容。这应该允许它在 1.5 之后的所有版本上工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多