如何将一个tile层转化为一个对象进行相对于播放器的深度排序?

How to convert a tile layer into an object for depth sorting relative to the player?

我基本上是在制作星露谷克隆版,使用图块集和图块层来绘制每个房间的背景。我有一个'Parent Depth Object'。该对象的每个子对象(NPC、作物)的深度都相对于玩家对象进行排序,以显示在玩家的前面或后面。这很好用。

我将 'ground items'(桶、石头等)绘制到每个房间的单个瓷砖层上。我希望玩家也能够出现在它们的后面或前面。有什么方法可以使整个层像单个对象一样工作,这样我就可以将它添加到我的父深度对象中,或者我必须为每个地面项目创建一个单独的对象吗?

我的 'depthSorter' 对象创建了一个数据结构,将每个实例添加到其中并循环遍历,对每个相对于玩家的深度进行排序。


/// @description DSGridGetInst/Add/Sort/Loop

// get number of instances of parentDepthObject, save in variable instNum / resize grid
var instNum = instance_number(parentDepthObject);
var dGrid = dsDepthGrid;

ds_grid_resize(dGrid, 2, instNum);

// add instances to grid / have all of them run this code
var yy = 0; with(parentDepthObject)
{
    dGrid[# 0, yy] = id;
    dGrid[# 1, yy] = y;
    yy += 1;
}

// sort the grid in ascending order (lowest y value at top)
ds_grid_sort(dGrid, 1, true);

// loop through the grid and draw all the instances

var inst; yy = 0; repeat(instNum)
{
    // pull out an ID
    inst = dGrid[# 0, yy];
    // draw yourself
    with(inst)
    {
        event_perform(ev_draw, 0);
    }

    yy += 1;
}

我个人建议使用这些你想藏起来的物品作为物品,而不是瓷砖。磁贴本身不能包含脚本。所以按照你想要的方式使用它们会变得更加棘手。

但是,您不需要为每个 'ground item' 创建一个新对象。 相反,您可以制作一个名为 'ground item' 的对象,并将精灵/相关代码更改为该对象。

例如,在选择房间中的对象时,您可以使用 'Creation Code' 添加该对象的唯一代码。这样,您就可以将地面物品的精灵更改为它的唯一 ID。

另一个例子是创建一个对象,该对象是父对象 'ground object' 的子对象。所以每个对象都有自己的精灵,但重用了 'ground object'

中的对象