Flutter / Flame ограничивает область перетаскивания в игре

Я пытаюсь переместить игрока, перетаскивая его, но не хочу, чтобы он уходил за пределы экрана. Как я могу прилично его ограничить?

void onPanUpdate(DragUpdateDetails details) {
  if(game.screenSize.width >= playerRect.right && playerRect.left >= 0
      && game.screenSize.height >= playerRect.bottom && playerRect.top >= 0) {
    playerRect = playerRect.translate(details.delta.dx, details.delta.dy);
  } else { 
    playerRect = playerRect.translate(-details.delta.dx*4.2, -details.delta.dy*4.2);
  }
}

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


person Melissa Worthington    schedule 21.09.2020    source источник
comment
Я не думаю, что ваш код настолько плох, но я думаю, что ваш плеер может застрять за пределами экрана, если ему удастся выйти достаточно далеко за его пределы за одно обновление, а затем изменить направление перетаскивания. Потому что тогда он может оказаться в случае else на каждой итерации. Вы можете добавить дельту к if-check, чтобы избежать этого, но, вероятно, есть лучший способ все вместе сравнить два прямоугольника и узнать перевод оттуда.   -  person spydon    schedule 21.09.2020
comment
Проблема этого кода в том, что вы сказали. Каким бы ни было значение минусовой дельты, в любом случае мой плеер выйдет за пределы экрана. Не похоже на хорошее впечатление, когда игрок трясется за границы экрана. тем более, если чехлы вызывают замедление движения игрока. Я ничего об этом не нашел.   -  person Melissa Worthington    schedule 22.09.2020


Ответы (1)


Рад видеть еще одного пользователя нашего игрового движка! При проверке также необходимо учитывать дельту. Примерно так должно работать:

void onPanUpdate(DragUpdateDetails details) {
  final delta = details.delta;
  final size = game.screenSize
  double translateX = delta.dx;
  double translateY = delta.dy;
  // Make sure that the player never goes outside of the screen in the X-axis
  if (playerRect.right + delta.dx >= size.width) {
      translateX = size.width - playerRect.right; 
  } else if (playerRect.left + delta.dx <= 0) {
      translateX = -playerRect.left; 
  }
  // Make sure that the player never goes outside of the screen in the Y-axis
  if (playerRect.bottom + delta.dy >= size.height) {
      translateY = size.height - playerRect.bottom; 
  } else if (playerRect.top + delta.dy <= 0) {
      translateY = -playerRect.top; 
  }
  playerRect = playerRect.translate(translateX, translateY);
}

Если у вас есть более подробные вопросы, я предлагаю вам также присоединиться к нашему разногласию: https://discord.gg/pxrBmy4

person spydon    schedule 22.09.2020
comment
playerRect.left + delta.dx ›0 и playerRect.top + delta.dy› 0 должны быть playerRect.top + delta.dy ‹(=) 0 и playerRect.left + delta.dx‹ (=) 0. ‹должны быть используется вместо ›. этот код работает отлично. Большое Вам спасибо. - person Melissa Worthington; 22.09.2020
comment
Рад, что сработало, обновил код согласно вашему комментарию. - person spydon; 22.09.2020