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).
另请注意,我们添加了一半的屏幕尺寸,以便播放器居中。
有很多方法可以解决这个问题,但上面的方法应该给你一个
好的开始。作为奖励,使用转换可以轻松添加诸如缩放之类的东西
和旋转。
我正在编写一个像 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).
另请注意,我们添加了一半的屏幕尺寸,以便播放器居中。
有很多方法可以解决这个问题,但上面的方法应该给你一个 好的开始。作为奖励,使用转换可以轻松添加诸如缩放之类的东西 和旋转。