【发布时间】:2015-09-13 17:14:42
【问题描述】:
我正在编写像 agar.io 这样的游戏,我想创建一个像 5000x5000 这样的世界,但例如玩家只能看到 900x600 的部分。
即玩家必须有一个范围。我的背景不是位图,我基本上是让后备缓冲区变黑,在上面绘制图元并翻转它。
我该怎么做?
【问题讨论】:
-
使用谷歌,在某个地方尝试。如果你发现了更具体的问题(你会的),回来问这个。
我正在编写像 agar.io 这样的游戏,我想创建一个像 5000x5000 这样的世界,但例如玩家只能看到 900x600 的部分。
即玩家必须有一个范围。我的背景不是位图,我基本上是让后备缓冲区变黑,在上面绘制图元并翻转它。
我该怎么做?
【问题讨论】:
听起来transforms 可以在这里为您提供帮助。
基本上,您有一个 900x600 的显示器 (al_create_display(900, 600)),但让您的对象在 5000x5000 空间中的任何位置都有位置。
当您的玩家移动时,您会随着他们移动相机变换。您的绘图循环可能如下所示:
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) 处抽取;这将是
屏幕外。
虽然我们实际上不必对每个对象都执行此减法。您只需在其 absolute 位置绘制每个对象,转换会将其转换为相对于玩家的位置 relative(玩家的“本地”空间)。
还请注意,我们添加了一半的屏幕大小,因此播放器居中。
有很多方法可以解决这个问题,但上面应该给你一个 好的开始。作为奖励,使用变换可以轻松添加缩放等内容 和旋转。
【讨论】: