设置游戏原点——探索allegro库
在进行游戏制作时,我们常常需要确定一个游戏世界的原点位置,比如角色出生点、物品生成位置等。在使用allegro库进行开发时,如何设置游戏的原点位置呢?下面我们将探讨几种方法。
窗口的坐标系
在了解allegro中的原点设置方法之前,我们需要先了解一下窗口坐标系的概念。在图形学中,常常使用笛卡尔坐标系来表示平面上的点。我们可以选择其中一条轴作为基准,叫做x轴(横轴),另一条轴叫做y轴(纵轴)。在allegro库中,窗口左上角的坐标为(0,0),x轴向右增加,y轴向下增加。如下图:
注:为了方便说明,上图中对窗口进行了放大,实际窗口大小会依据所设置的尺寸而不同。
设置游戏原点
方法一:使用游戏对象的坐标
如果我们一开始就创建了一个角色或物品,那么可以直接使用对象的坐标作为游戏世界的原点位置。比如我们要在屏幕中央显示一个圆形,可以使用下述代码:
ALLEGRO_DISPLAY*disp=al_create_display(640,480);
ALLEGRO_BITMAP*bmp=al_create_bitmap(50,50);
//设置原点在屏幕中央
intorigin_x=al_get_display_width(disp)/2;
intorigin_y=al_get_display_height(disp)/2;
//在原点位置画个圆
al_set_target_bitmap(bmp);
al_draw_filled_circle(25,25,25,al_map_rgb(255,0,0));
al_set_target_bitmap(al_get_backbuffer(disp));
al_draw_bitmap(bmp,origin_x,origin_y,0);
al_flip_display();
在上述代码中,我们使用了al_get_display_width()和al_get_display_height()获取了当前窗口的宽高,再求出它们的一半即可作为原点坐标。注意,我们同时设置了al_set_target_bitmap(),这是为了避免直接往窗口上画,而是在新建的位图里面画好后再将它绘制到窗口上。最后使用flip_display()刷新屏幕。
方法二:使用Transformations
Transformations是一种将图形从一个坐标系转移到另一个坐标系的方法。在allegro库中,我们可以使用al_translate_transform()函数来实现平移。下面的代码演示了如何将原点平移到屏幕中心并画一个圆:
ALLEGRO_DISPLAY*disp=al_create_display(640,480);
ALLEGRO_BITMAP*bmp=al_create_bitmap(50,50);
floatcenter_x=al_get_display_width(disp)/2.0f;
floatcenter_y=al_get_display_height(disp)/2.0f;
ALLEGRO_TRANSFORMtransform;
al_identity_transform(&transform);
al_translate_transform(&transform,center_x,center_y);
al_use_transform(&transform);
al_set_target_bitmap(bmp);
al_draw_filled_circle(25,25,25,al_map_rgb(255,0,0));
al_set_target_bitmap(al_get_backbuffer(disp));
al_draw_bitmap(bmp,0,0,0);
al_flip_display();
在上述代码中,我们使用al_identity_transform()函数创建了一个Transformations,再使用al_translate_transform()函数将它平移到屏幕中心。最后使用al_use_transform()函数将该Transformations应用到后续绘制的图形上。这种方法相对而言更加灵活,如果需要在多处使用同一个平移,只需要创建一个Transformations即可。但是如果只是需要对一个图形进行平移,使用方法一更加方便。
方法三:使用al_set_clipping_rectangle()
前面的两种方法都涉及到了位图的处理,并最终使用al_draw_bitmap()将它们绘制到屏幕上。如果不想这么麻烦,可以使用al_set_clipping_rectangle()函数。
它的具体使用方式如下:
- 先使用al_set_clipping_rectangle()函数设置一个矩形,该矩形的左上顶点就是你想要的游戏世界原点位置。
- 接下来绘制所有的图像,并调用al_set_clipping_rectangle()取消矩形限制。
代码如下所示:
ALLEGRO_DISPLAY*disp=al_create_display(640,480);
ALLEGRO_BITMAP*bmp=al_create_bitmap(50,50);
intcenter_x=al_get_display_width(disp)/2-25;
intcenter_y=al_get_display_height(disp)/2-25;
al_set_clipping_rectangle(center_x,center_y,50,50);
al_draw_filled_circle(center_x+25,center_y+25,25,al_map_rgb(255,0,0));
al_reset_clipping_rectangle();
al_flip_display();
在上述代码中,我们通过计算得到了矩形左上角坐标,然后使用al_set_clipping_rectangle()函数将它设置为裁剪区域。绘制圆形时只需要绘制相对于原点的坐标即可。最后使用al_reset_clipping_rectangle()函数取消限制。这种方法在绘制大量相对于原点的图像时更加方便。
总结
三种方法都可以用来设置游戏世界原点位置,具体选择哪一种方法需要根据实际情况进行判断。比如如果需要进行矩形限定,可以使用第三种方法。如果只是要画一个固定的图案,可以使用第一种方法。如果需要在多个地方使用同一个平移,可以选择第二种方法。希望这篇文章能帮助大家更好地使用allegro库开发游戏!