Как реализовать Swipe в Android-игре без просмотра

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

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

Это образец, который я попробовал реализовать на основе предыдущего вопроса StackOverflow. – Android: как справляться с жесткими движениями справа налево .

Я создал OnSwipeTouchListener.java в соответствии с инструкциями. Однако я столкнулся с проблемой, связанной с использованием.

В GameScreen.java (где происходят все события касания), я добавил это как образец –

onSwipeTouchListener = new OnSwipeTouchListener() { public void onSwipeTop() { Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show(); } public void onSwipeRight() { Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show(); } public void onSwipeLeft() { Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show(); } public void onSwipeBottom() { Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show(); } }; imageView.setOnTouchListener(onSwipeTouchListener); 

Это приводит к появлению множества ошибок (в основном с использованием imageView), и ни один из них не может быть разрешен.

Будет ли у кого-нибудь альтернативная реализация салфетки, характерной для моего случая?

Solutions Collecting From Web of "Как реализовать Swipe в Android-игре без просмотра"

Если у вас есть доступ к событиям касания, попробуйте это

  int len = touchEvents.size(); Graphics g = game.getGraphics(); for (int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if (event.type == TouchEvent.TOUCH_DOWN) { x1=event.x; y1=event.y; } if (event.type == TouchEvent.TOUCH_UP) { x2=event.x; y2=event.y; dx=(x2-x1); dy=(y2-y1); tu=1; } if((tu==1) && (Math.abs(dx)>Math.abs(dy))) { if(dx>0) { if(!(robot.getSpeedX()<0)) { robot.stop(); robot.moveRight(); } } else { if(!(robot.getSpeedX()>0)) { robot.stop(); robot.moveLeft(); } } tu=0; } if((tu==1) && (Math.abs(dx)<=Math.abs(dy))) { if(dy>0) { if(!(robot.getSpeedY()<0)) { robot.stop(); robot.moveDown(); } } else { if(!(robot.getSpeedY()>0)) { robot.stop(); robot.moveUp(); } } tu=0; } 

Вы можете сделать это двумя способами:

Опция 1:

В пределах основного класса вашей игры:

 class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { float slope = (e1.getY() - e2.getY()) / (e1.getX() - e2.getX()); float angle = (float) Math.atan(slope); float angleInDegree = (float) Math.toDegrees(angle); // left to right if (e1.getX() - e2.getX() > 20 && Math.abs(velocityX) > 20) { if ((angleInDegree < 45 && angleInDegree > -45)) { //code for left to right swipe should go here } // right to left fling } else if (e2.getX() - e1.getX() > 20 && Math.abs(velocityX) > 20) { if ((angleInDegree < 45 && angleInDegree > -45)) { //code for right to left swipe should go here } } return true; } catch (Exception e) { // nothing } return false; } } 

Затем вы можете зарегистрировать любое представление для приема / прослушивания жестов:

  final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector()); gameView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return false; return false; } }); //the parent layout findViewById(R.id.parent_layout).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return false; return false; } }); //an image view findViewById(R.id.image_view).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return false; return false; } }); 

Вариант 2:

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

Вы должны опубликовать свой GameScreen как Nana Ghartey

Предполагая, что у вас есть доступ к данным касания, вы можете сделать что-то вроде следующего

 private static final int DEFAULT_THRESHOLD = 36;// Better to be something in dps. ... = new View.OnTouchListener() { int initialX = 0; int initialY = 0; final float slop = ViewConfiguration.get(context).getScaledTouchSlop(); public boolean onTouch(final View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { initialX = (int) event.getX(); initialY = (int) event.getY(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { int currentX = (int) event.getX(); int currentY = (int) event.getY(); int offsetX = currentX - initialX; int offsetY = currentY - initialY; if (Math.abs(offsetX) > slop) { if (offsetX > DEFAULT_THRESHOLD) { // TODO :: Do Right to Left action! } else if (offsetX < -DEFAULT_THRESHOLD) { // TODO :: Do Left to Right action! } } if (Math.abs(offsetY) > slop) { if (offsetY > DEFAULT_THRESHOLD) { // TODO :: Do Bottom to Top action! } else if (offsetY < -DEFAULT_THRESHOLD) { // TODO :: Do Top to Bottom action! } } } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { // Do nothing! } }; 

Хорошая вещь об этой реализации заключается в том, что пользователю не придется снимать руку с экрана, контролируя направление змеи.

Поместите супер методы в свой код, например:

 public void onSwipeTop() { super.onSwipeTop(); Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show(); }