1

我目前正在尝试用自上而下的视角编写一个简单的射击游戏。我正在使用 SurfaceView 和 Canvas 在屏幕上绘制图形,但我不知道如何使“相机”可滚动。玩家角色始终位于屏幕中央,并且相机(本质上是 SurfaceView 的画布)应该一直跟随他(例如,就像在 Alien Swarm 中一样)。但是,我无法弄清楚如何定期实现这一点。我现在这样做的方式是根据玩家的输入移动游戏世界中的所有其他对象 - 如果它们的坐标恰好在屏幕上,则绘制它们。玩家始终停留在相同的坐标上。有什么方法可以实际移动(滚动) SurfaceView 本身?我看到了 Scroll 小部件和 SurfaceView 方法。scrollBy(int x, int y),但我尝试实现其中任何一个都会导致强制关闭。任何帮助表示赞赏,在此先感谢!

PS 只是一个注释——我对在这个项目中使用 open GL 不感兴趣。

4

2 回答 2

2

正如基里尔在评论中指出的那样,上面的答案是不正确的。要实现一个简单的滚动相机,你需要

  1. 将您的画布转换为玩家位置的倒坐标
  2. 绘制背景
  3. 转换回 (0,0)
  4. 画出玩家

所以,把它放在代码中

//Translate to -playerX, -playerY and draw the background
canvas.translate(-playerX, -playerY);
background.draw();

//Translate back to 0,0 and draw the player
canvas.translate(playerX, playerY);
player.draw();

这样,玩家总是停留在屏幕上的相同位置,你会看到背景在它后面移动。

需要注意的一件事是 canvas.translate(x,y) 不会将画布转换为坐标 (x,y)。它按指定的距离平移。起初这可能会令人困惑。

例子 :

  1. 你在 (0,0)
  2. 你打电话给 canvas.translate(2,3)
  3. 你打电话给 canvas.translate(-1,-1)
  4. 你现在在 (1, 2)
于 2012-11-02T15:41:22.577 回答
1

绘制完成后,您可以使用 Translation 来滑动屏幕内容。如果字符要保持在中间,您将编写如下所示的代码:

draw_the_screen();
canvas.translate(x,y);
draw_the_avatar();

当您翻译时,直到该点的所有内容都将被翻译。当您绘制头像时,平移(滑动)将已经发生,并且将在您绘制它的任何位置结束(即:屏幕中心)。

希望这可以帮助。

于 2010-09-25T02:42:12.447 回答