13

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

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

Это образец, который я пытался реализовать на основе предыдущего вопроса StackOverflow - Android: How to handle right to left swipe gestures.

Я создал 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), и ни один из них могут быть решены.

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

+0

Вы можете оставить класс GameScreen. и какие ошибки бросаются. Можете ли вы опубликовать трассировку стека logcat? ... таким образом, если ваша проблема не была устранена –

ответ

2

Если у вас доступ к потрогать событий попробуйте это

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; 
     } 
+0

Это, похоже, решает проблему. Спасибо :) – Caife

3

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

4

Вы должны опубликовать GameScreen в Нана 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! 
     } 
}; 

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

5

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

Вариант 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 непосредственно имеет доступ к потрогать события, вы можете прочитать их и реализовать логику мазковых действий. Код для этого похож на ответ Мостафы Газара.