Как обнаружить свайп в игре с трепетанием / пламенем

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

Я мог бы реализовать распознавание касания с помощью учебника. Но я не смог реализовать это с обнаружением свайпа.

моя основная функция с Taprecognition выглядит так: Моя основная функция -

void main() async{
  Util flameUtil = Util();
  await flameUtil.fullScreen();
  await flameUtil.setOrientation(DeviceOrientation.portraitUp);

  GameManager game = GameManager();
  runApp(game.widget);

  TapGestureRecognizer tapper = TapGestureRecognizer();
  tapper.onTapDown = game.onTapDown;
  flameUtil.addGestureRecognizer(tapper);
}

В моем классе GameManager у меня есть:

class GameMAnager extends Game{
  // a few methods like update, render and constructor
  void onTapDown(TapDownDetails d) {
    if (bgRect.contains(d.globalPosition)) { //bgRect is the background rectangle, so the tap works on the whole screen
      player.onTapDown();
    }
  }

И мой класс игрока содержит:

  void onTapDown(){
    rotate();
  }

Теперь я хочу изменить это, чтобы он вращался в направлении смахивания вместо onTapDown. Пытался как-то добавить

  GestureDetector swiper = GestureDetector();
  swiper.onPanUpdate = game.onPanUpdate;

к моему основному и

  void onPanUpdate() {

  }

в мой класс gameManager. Но не могу найти ничего похожего на TapDownDetails для панорамирования.

Есть предложения по этому поводу?

Я видел некоторую помощь в этом, чтобы обернуть виджет в GestureDetector и использовать его следующим образом:

GestureDetector(onPanUpdate: (details) {
  if (details.delta.dx > 0) {
    // swiping in right direction
  }
});

Но я не мог заставить его работать над моим проектом.

3 ответа

Вы можете использовать HorizontalDragGestureDetector (или PanGestureRecognizer, если вам нужны обе оси), используйте следующее в своем основном методе

HorizontalDragGestureRecognizer tapper = HorizontalDragGestureRecognizer();
tapper.onUpdate = game.dragUpdate;

а затем в GameManager

void dragUpdate(DragUpdateDetails d) {
    // using d.delta you can then track the movement and implement your rotation updade here
}

Это должно помочь:D

Если вам нужны обе оси, вы можете использовать PanGestureRecognizer (как сказал @Marco Papula).

Используйте это в своем основном методе:

PanGestureRecognizer panGestureRecognizer = PanGestureRecognizer();
panGestureRecognizer.onEnd = game.onPanUpdate;
flameUtil.addGestureRecognizer(panGestureRecognizer);

и ваш метод onPanUpdate:

void onPanUpdate(DragEndDeatils d) {
    if(d.velocity.pixelsPerSecond.dx.abs()>d.velocity.pixelsPerSecond.dy.abs()) {
      // X Axis
      snake.velocity = d.velocity.pixelsPerSecond.dx<0 ? LeftSwipe : RightSwipe;
    } else {
      // Y Axis
      snake.velocity = d.velocity.pixelsPerSecond.dy<0 ? UpSwipe : DownSwipe;
    }
}

Если вы используете более новую (v1) версию Flame, вам больше не нужно оборачивать ее в свой собственный GestureDetector (думал, что вы можете). Теперь во Flame встроены обертки для всех событий, включая панорамирование! Вы можете смешать свою игру с:

      class MyGame extends BaseGame with PanDetector {
  // ...
}

И реализовать onPanUpdateполучить желаемое поведение; или используйте множество любых других детекторов (ознакомьтесь с документацией для получения дополнительных опций и подробностей о том, как его использовать).

Другие вопросы по тегам