#gml #game-maker-studio-2
#gml #game-maker-studio-2
Вопрос:
Я создаю скрипт, который сортирует глубину для моих объектов, устанавливая приоритет переменной y, но затем проверяет, имеют ли объекты, которые касаются друг друга, большую глубину, чем они правее, но по какой-то причине последняя часть не работает.
Вот код:
ds_grid_sort(_dg,1,true);
_yy = 0;
repeat _inst_num
{
_inst = _dg[# 0, _yy];
with _inst
{
with other
{
if (x > _inst.x and y = _inst.y)
{
_inst.depth = depth building_space;
}
}
}
_yy ;
}
Я определил, что проблема в том, что ничего не выдает true, когда игра проверяет y = _inst.y
часть _inst
инструкции, но это не имеет никакого смысла, учитывая, что все они находятся в одной и той же координате y. Может кто-нибудь, пожалуйста, скажите мне, что я делаю не так?
Ответ №1:
Как упоминал Стивен, рекомендуется использовать двойные знаки равенства для сравнений ( y == _inst.y
) и один знак равенства для присваиваний ( _yy = 0;
) , но GML не волнует, используете ли вы один знак равенства для сравнения, поэтому это не вызовет вашей проблемы. Хотя это имеет значение практически на любом другом языке, кроме GML.
Насколько я понимаю, проблема, похоже, заключается в том, что вы используете other
. Когда вы используете код with other
, он не выполняет итерацию по всем другим объектам, он захватывает только один экземпляр. Вы можете проверить это, запустив этот код и посмотрев, сколько отладочных сообщений он показывает:
...
with other
{
show_debug_message("X: " string(x) "; Y: " string(y));
...
Вы могли бы использовать with all
. Это будет перебирать все объекты или with object
, где object
находится либо объект, либо родительский объект. Это будет перебирать все экземпляры этого объекта. Однако ни одна из этих функций не проверяет, перекрываются ли объекты (она просто будет перебирать их все), поэтому вам придется проверять наличие столкновений. Вы могли бы сделать что-то вроде этого:
...
with all
{
if place_meeting(x, y, other)
{
if (x > _inst.x and y = _inst.y)
{
_inst.depth = depth building_space;
}
}
...
Я не знаю, как выглядит остальная часть вашего кода, но может быть более простой способ достичь вашей цели. Возможно ли изначально установить глубину на основе переменных x и y? Что-то вроде depth = -x-y;
? Для людей, не знакомых с GameMaker, объекты с меньшим значением глубины отображаются над объектами с более высокими значениями глубины; вот почему я предлагаю установить глубину равной -x-y
.Ниже показано, как будет выглядеть вид этой сетки (первая строка и столбец — переменные x и y; остальные числа будут глубиной объекта в этой позиции):
Наличие одного уравнения, по которому все работает, также сделает так, что если у вас есть что-то движущееся (например, проигрыватель), вы можете легко и эффективно обновлять их глубину, чтобы иметь возможность отображать их правильно относительно всех других объектов.
Ответ №2:
Я думаю, так и должно быть y == _inst.y
. Но я не уверен, поскольку GML имеет тенденцию принимать такое форматирование.
Это лучшая практика ==
для проверки того, равны ли они при использовании условий.