屏幕大小和活动呈现的问题

时间:2010-07-01 17:00:12

标签: android compatibility

我正在开发我的第一个Android应用程序,以及我的第一个游戏。我一直在开发带有CliqXT(HVGA)的上网本。事情进展顺利,它在较小的屏幕上完美呈现。我知道在大屏幕上渲染时我会遇到一些问题,但我遇到的问题并不是我所期待的,而且我有点陷入困境。

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

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

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

我期望发生的事情:

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

实际发生的事情:

整个游戏正好被渲染成好像是HVGA。 tilemap和建筑UI只是按比例缩小到较小的屏幕尺寸,左边,右边和底部留下黑色边框(见图片)。

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

(有些人可能认识到这个公共领域的DOS经典)

alt text

alt text

编辑:感谢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);
 }

1 个答案:

答案 0 :(得分:0)

我明白了。我在项目中的目标是1.5,所以假设是HVGA。 Targeting 2.1修复了问题,位图甚至似乎使用某种Android魔法正确扩展。

我仍然有一个问题,当我完成这个游戏时,我想让它与1.5+设备一起使用。我是否需要将单独的版本放入市场,每个设备类一个?对于可以在应用程序本身的一行或两行代码中处理的事情来说,这似乎很麻烦...但我从未发布过应用程序,所以也许在这个过程中很容易处理。