Как преобразовать тайловый слой в объект для сортировки по глубине относительно игрока?

По сути, я делаю клон 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;
}


person Sam Luxton    schedule 05.10.2019    source источник


Ответы (1)


Я лично рекомендую использовать эти предметы, которые вы хотите убрать, как объекты, а не плитки. Плитки не могут сами содержать сценарий. Так что становится сложнее использовать их так, как вы хотите.

Однако вам не нужно создавать новый объект для каждого «наземного элемента». Вместо этого вы можете создать объект под названием «наземный предмет» и изменить спрайт/сопутствующий код для этого объекта.

Например, при выборе объекта в комнате вы можете использовать «Код создания», чтобы добавить код, уникальный для этого объекта. Таким образом, вы можете изменить спрайты наземного предмета на его уникальный идентификатор.

Другой пример — сделать объект дочерним по отношению к родительскому «наземному объекту». Таким образом, каждый объект имеет свой собственный спрайт, но повторно использует объект из «наземного объекта».

person Steven    schedule 07.02.2020
comment
Это великолепно. Большое спасибо, Стивен. - person Sam Luxton; 18.04.2020