Как обнаружить свайп в игре с трепетанием / пламенем
Я хочу создать игру в трепете с пламенем. Для этой игры я хочу обнаруживать свайпы.
Я мог бы реализовать распознавание касания с помощью учебника. Но я не смог реализовать это с обнаружением свайпа.
моя основная функция с 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
получить желаемое поведение; или используйте множество любых других детекторов (ознакомьтесь с документацией для получения дополнительных опций и подробностей о том, как его использовать).