allegro - 如何绘制显示的有限部分

allegro - How to draw limited part of display

我正在编写一个像 agar.io 这样的游戏,我想创建一个像 5000x5000 这样的世界,但是例如玩家只能看到 900x600 的部分。

即玩家必须有瞄准镜。我的背景不是位图,我基本上是将后备缓冲区设为黑色,在其上绘制图元并翻转它。

我该怎么做?

听起来 transforms 可以帮到你。

基本上,您有一个 900x600 的显示 (al_create_display(900, 600)),但是让您的对象在 5000x5000 space.

中的任何位置都有位置

当您的玩家移动时,您会随之移动摄像机变换。您的绘制循环可能如下所示:

  al_clear_to_color(al_map_rgb(0,0,0));

  ALLEGRO_TRANSFORM trans;
  al_identity_transform(&trans);
  al_translate_transform(&trans, -player_x, -player_y);
  al_use_transform(&trans);

  // draw the player
  al_draw_filled_circle(player_x + SCREEN_W / 2, player_y + SCREEN_H / 2,
                        32, al_map_rgb(255,0,0));

  // draw all other entities
  // ....

  al_flip_display();

请注意,相机移动了 -player_x,-player_y。如果玩家在 (1000, 1000),在 (1500, 1500) 处的对象应绘制在 (1500-1000,1500-1000),或 (500,500) 相对于 玩家。位于 (500, 500) 将在 (500-1000,500-1000) 或 (-500,-500) 抽取;这将是 屏幕外。

我们实际上不必为每个对象执行此减法。您只需在其 绝对 位置绘制每个对象,转换会将其转换为玩家的 relative 位置(玩家的 'local' space).

另请注意,我们添加了一半的屏幕尺寸,以便播放器居中。

有很多方法可以解决这个问题,但上面的方法应该给你一个 好的开始。作为奖励,使用转换可以轻松添加诸如缩放之类的东西 和旋转。