我正在工作的一个2.5D项目中,所有图像资产都位于高分辨率(约512x512);由于这是一款伪3D游戏,所以游戏中有相应的摄像头缩放,并且我想要这些小图看起来很棒。由于游戏主要发生在一个大房间中,因此为了避免这个房间变得太大,我在代码中使用缩放来适配那些大图像的32x32栅格。

目前它已经成功运作了,但.tilesets已经成为另外一个整件事了。目前的最好的实现是以下:

  • 使用不同的tile宽和高的两个.tileset(一个32x32,一个512x512),
  • 使用较小的图层在游戏的主房间中绘制地图层,
  • 通过代码创建一个新的图层来展示较大的图层,
  • 使用tilemap_get和tilemap_set传输从小图集中获取的.tile信息到代码中创建的(tile信息来自主房间中的tileset)
  • 最后,使用matrix_set进行缩放,draw_tilemap进行绘制

本方案可以绘制一个缩放的tile层,但我通过使较小的图层不可见来保持它用于碰撞等,所以问题在于本方案只能绘制一个手 Sanat,不能绘制全图。

32x32分辨率的图块地图在房间编辑器中的看法

在缩放后,512x512地图进行绘制的图像; 我们注意到,地图的绘制并不会继续往下绘制

由于大图块集位于512x512,所以我们估计这一区域是相同的区域总大小,这是我们能以gigant的原始图块集获得最多展示区域的原因;所以我们超过了房间大小的限制。通过改变图块集的偏移,显示图块集具有较小图块集的信息,这使得问题不在于图块集本身。

看起来通过在代码中设置matrix_set缩放这一手法解决不了问题,除非我们能够通过代码改变512x512的图块集的宽和高;然而目前我们找不到方法实现这一点,我们也不知道有没有任何函数可以在线上为地图(tile)覆写。现在的代码如下:

Create Event:

var ground_layer_small = layer_get_id("ground_tileset");
global.ground_tilemap_small = layer_tilemap_get_id(ground_layer_small);
var ground_layer_big = layer_create(layer_get_depth(ground_layer_small));
global.ground_tilemap_big = layer_tilemap_create(ground_layer_big, 0, 0, til_grass_big, room_width div 32, room_height div 32);

for (var i = 0; i <= room_width div 32; ++i) {
    for (var j = 0; j <= room_height div 32; ++j){
 tilemap_set(global.ground_tilemap_big,tilemap_get(global.ground_tilemap_small, i, j), i, j)
    }
}

Draw Event:

var sprite_divisor = 1/16;
matrix_set(matrix_world,matrix_build(0,0,0,0,0,0,sprite_divisor,sprite_divisor,1));
draw_tilemap(global.ground_tilemap_big,0,0);
matrix_set(matrix_world,matrix_build_identity());