ошибка столкновения в Gamemaker 2.0

Вот мой код столкновения. (Я получил его от FriendlyCosmonaut, но добавил отладочное сообщение для собственной выгоды):

// COLLISION CHECK
//Horizontal

if (place_meeting(x+moveX,y,obj_solid)){
    repeat(abs(moveX)){
        if(!place\_meeting(x+sign(moveX),y,obj\_solid)){
            x = x + sign(moveX);
        } else {
            break;
        }
    }
    moveX = 0;
    show_debug_message("collision");
}

//Vertical
if (place_meeting(x,y+moveY,obj_solid)){
    repeat(abs(moveY)){
        if(!place\_meeting(x,y+sign(moveY),obj\_solid)) {
            y = y + sign(moveY);
        } else {
            break;
        }
    }
    moveY = 0;
    show_debug_message("collision");
}

см. рисунок, красная рамка является частью спрайта для ясности

введите здесь описание изображения

игра допускает перекрытие в 32 пикселя, прежде чем фактически установить для moveY значение 0; маска столкновения начинается на 16 пикселей ниже верхней части спрайта. (исходная точка установлена ​​​​в верхнем левом углу, что находится за пределами диапазона маски столкновения.) Затем он ловит меня там, и я не могу двигаться ни в каком направлении. и выходные данные отладки регистрируются как 100 столкновений...

основываясь на документации yoyo, я думал, что place_meeting предназначен только для взаимно точных масок, которые, по общему признанию, я здесь не использую, но код не будет работать, даже если я это сделаю (хотя, вероятно, даст другие координаты и вывод - я не проверял все сценарии).

Я действительно понятия не имею, почему это не работает, и пробовал другие коды с тем же эффектом. это то, что я выбрал в качестве отправной точки для устранения неполадок, и я ценю любую помощь, которую я могу получить! пожалуйста, не приходите за мной, потому что я не предоставил все необходимые детали или что-то не понял. Я новичок, и я здесь, чтобы учиться. :)

Обновление: по-видимому, столкновение происходит с другими типами масок столкновений (например, точными и алмазными). Но это не создает тот вид, который мне нужен — это действительно должен быть прямоугольник, созданный вручную.


person HighScoreGrrl    schedule 02.02.2021    source источник
comment
Возможно, это не имеет значения, но почему между place_meeting и obj_solid стоят \ ? Я не уверен, было ли это намеренно   -  person Steven    schedule 19.02.2021
comment
Что касается самого вопроса, я думаю, что это связано с самой исходной точкой, потому что она установлена ​​​​в верхнем левом углу и за пределами поля столкновения.   -  person Steven    schedule 19.02.2021


Ответы (1)


вам нужно заменить повтор на некоторое время.

    if (place_meeting(x+moveX,y,obj_solid)){
      while(!place_meeting(x+sign(moveX),y,obj_solid)){
         x = x + sign(moveX);
      }
      moveX = 0;
    }
    x += moveX;

то же самое для вертикального столкновения, эта схема должна быть более чистой и непосредственной.

person Sansonight    schedule 23.02.2021