如何将瓦片图层转换为对象以进行相对于播放器的深度排序?

Posted

技术标签:

【中文标题】如何将瓦片图层转换为对象以进行相对于播放器的深度排序?【英文标题】:How to convert a tile layer into an object for depth sorting relative to the player? 【发布时间】:2019-10-05 10:38:47 【问题描述】:

我实际上是在制作 Stardew Valley 克隆,使用瓷砖组和瓷砖层来绘制每个房间的背景。我有一个“父深度对象”。该对象的每个子对象(NPC、作物)的深度相对于玩家对象进行排序,以显示在玩家的前面或后面。这工作正常。

我在每个房间的单个瓷砖层上都绘制了“地面物品”(桶、岩石等)。我希望玩家也能够出现在这些的后面或前面。有什么方法可以让整个图层看起来像一个单独的对象,这样我就可以将它添加到我的父深度对象中,还是我必须为每个地面项目创建一个单独的对象?

我的“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;


【问题讨论】:

【参考方案1】:

我个人建议将这些您想要放在后面的物品用作对象,而不是瓷砖。瓦片本身不能包含脚本。因此,以您想要的方式使用它们会变得更加棘手。

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

例如,在房间中选择一个对象时,您可以使用“创建代码”添加该对象的唯一代码。这样,您可以将地面项目的 sprite 更改为其唯一 ID。

另一个例子是创建一个对象,它是父“地面对象”的子对象。所以每个对象都有自己的精灵,但会重用“地面对象”中的对象

【讨论】:

太好了。非常感谢史蒂文。

以上是关于如何将瓦片图层转换为对象以进行相对于播放器的深度排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JavaScript 日期对象转换为刻度

将 UITable 中 UITableViewCell 中子视图中对象的 CGRect 转换为相对于 self.view 的 CGRect

Mapbox:如何连续包装要素层

子对象相对于父对象的旋转

如何相对于角度移动?

如何缓慢播放视频以进行标记