Как мне перевернуть спрайт игрока, не заставляя его прыгать дальше, чем нужно?

Вопрос или проблема

Я пытаюсь создать игру в жанре RPG с открытым миром. Я только начал, и у меня есть возможность перемещения игрока и смены анимаций между анимацией ожидания и анимацией ходьбы. Однако я совсем недавно закодировал переворот игрока по оси X, что работает, но с одним уточнением. Игрок переворачивается чуть слишком сильно, как будто имитируя длинный прыжок. Как мне удержать игрока на одном месте после переворота?

Я пробовал изменять масштаб игрока, менять скорость. Я даже перепробовал некоторый рекомендованный код в интернете, который делал странные вещи. Я не могу найти никого, у кого была бы такая проблема.

var move = keyboard_check(vk_right) - keyboard_check(vk_left);
if (move < 0)
{
  sprite_index = spr_char_walking;
  image_xscale = -7;
  image_yscale = 7; // переворачивает спрайт, когда движется в другую сторону
  
}
else if(move > 0)
{
    sprite_index = spr_char_walking;
    image_xscale = 7;
    image_yscale = 7;
    
}
else
{
  sprite_index = spr_char_idle;
  
  
}

Где находится центр вашего спрайта?

По умолчанию у вновь созданных спрайтов центр находится в верхнем левом углу. Это “опорная точка”, которая находится в (x, y), когда вы рисуете спрайт, и все остальное расширяется оттуда.

Когда вы переворачиваете спрайт, вы зеркалите всё, включая позицию центра. Таким образом, для спрайтов, которые вы собираетесь зеркалить, обычно вы хотите, чтобы центр находился в центре.

Верхний пример: переворот спрайта с центром в (0, 0), в верхнем левом углу.

Демонстрация переворота спрайтов

Нижний пример: переворот того же спрайта, но с центром, перемещённым в нижний центр.

Другие решения этой проблемы могут заключаться в добавлении смещения при рисовании спрайта, если он перевернут (при условии, что вы рисуете спрайт сами, а не используете стандартное событие рисования)

Ответ или решение

Чтобы правильно решить проблему отображения вашего игрового персонажа (плеера) в 2D RPG, когда он поворачивается, без изменения его положения на экране, необходимо учесть несколько ключевых аспектов, включая точку привязки (origin) спрайта и метод, которым вы обрабатываете его отражение.

Проблема и Решения

Проблема: Когда вы переворачиваете спрайт персонажа (например, с помощью изменения image_xscale), он "долгая прыжка" кажется излишним смещением, если точка привязки (origin) находится в углу спрайта, а не в его центре. Это приводит к тому, что спрайт смещается относительно своей первоначальной позиции.

Что такое Точка Привязки (Origin)?

Точка привязки — это точка, от которой происходит отрисовка спрайта на экране. По умолчанию, большинство спрайтов имеют эту точку в левом верхнем углу (0,0). Когда вы применяете отражение к спрайту, позиция точки привязки также меняется, что ведет к нежелательному смещению.

Рекомендации

  1. Изменение Точки Привязки:
    Убедитесь, что точка привязки вашего спрайта расположена по центру. Это позволит вам избежать "перепрыгивания" при его перевороте. Вы можете сделать это в вашем графическом редакторе (например, в Аseprite, Photoshop и других) или внутри среды разработки вашего игрового движка (GameMaker и т.д.).

  2. Код для Изменения Положения:
    В вашем игровом коде нужно использовать image_xscale для отражения спрайта, но без изменения его положения на экране. Например, если вы установите точку привязки по центру, тогда код, который вы предоставили, не потребует дополнительных смещений.

Пример исправленного кода

var move = keyboard_check(vk_right) - keyboard_check(vk_left);
if (move < 0)
{
    sprite_index = spr_char_walking;
    image_xscale = -1; // отразить спрайт
    image_yscale = 1;  // масштаб по Y остается прежним
}
else if (move > 0)
{
    sprite_index = spr_char_walking;
    image_xscale = 1;  // нормальное отображение
    image_yscale = 1;  // масштаб по Y остается прежним
}
else
{
    sprite_index = spr_char_idle; // оставить спрайт неподвижным
}

Дополнительные Варианты

Если вы хотите более гибкий подход или ваш игровой движок не позволяет легко изменять точку привязки, рассмотрите возможность добавления смещения при отрисовке спрайта, когда он перевёрнут. Например, вы можете скорректировать координаты X перед отрисовкой на основе текущего значения image_xscale.

draw_sprite(sprite_index, 0, x + (image_xscale < 0 ? -offset : offset), y);

Где offset – это значение, которое компенсирует смещение при отражении.

Заключение

Правильная настройка точки привязки спрайта и использование гибких методов отрисовки помогут вам решить проблему с отражением вашего персонажа без изменения его положений. Если после выполнения этих шагов проблема все еще будет существовать, проверьте другие элементы кода, связанные с движением и отображением вашего персонажа, чтобы убедиться, что они не конфликтуют с новыми изменениями.

Оцените материал
Добавить комментарий

Капча загружается...