Реализация Android при прохождении по игровой карте, перемещение по диагонали работает некорректно

#java #android

#java #Android

Вопрос:

Ситуация выглядит так, что когда главный герой (chibi1) ходит вертикально или горизонтально, все работает нормально. Проблема в том, что мы хотим двигаться по диагонали. Главный герой пропускает поле предназначенной карты, затем продвигается вперед и останавливается на разных полях.

В коде проблема в том, что я не знаю, что поместить в правую часть уравнения stepsSkew = ?WHAT?; , чтобы в результате получить примерно 1 (оно вычисляется как double), когда главный герой перемещает одно диагональное поле (два в результате, когда 2 диагональных поля и так далее). Горизонтальные и вертикальные переменные, которые отвечают за подсчет этих полей, stepsX а stepsY также вычисляют движение аналогично тому, как одно поле, переданное по горизонтали / вертикали, дает приблизительно 1 (его двойное, например, 1.007134), и это работает.

Я думаю, может быть, использовать теорему Пифагора в этом уравнении, но как именно это должно выглядеть в этом примере? Но, возможно, я ошибаюсь…

Переменная steps просто подсчитывает те шаги, которые уже пройдены, например, 1,2,3, … .

Полный код выглядит так:

GameSurface.java

 public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    int movingVectorX, movingVectorY;
    double stepX, stepY, stepsX, stepsY, stepsSkew;
    List<Integer> pathX = new ArrayList<>(), pathY = new ArrayList<>(), movingVectorsX = new ArrayList<>(), movingVectorsY = new ArrayList<>();

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);

        (...)

        movementControl(canvas);
    }

(...)
 

movementControl()

     private void movementControl() {
    stepX = Math.abs(getChibiXCenterWhenTapUp - chibi1.getX() - (chibi1.getWidth() / 2));
    stepY = Math.abs(getChibiYCenterWhenTapUp - chibi1.getY() - (chibi1.getHeight() / 2));

    if (movingVectorX != 0 amp;amp; movingVectorY == 0)
        stepsX = stepX / cellWidth;
    if (movingVectorX == 0 amp;amp; movingVectorY != 0)
        stepsY = stepY / cellHeight;
    if (movingVectorY != 0 amp;amp; movingVectorX != 0) {
        // HERE IS A PROBLEM
        stepsSkew = ?WHAT?;
    }


    steps = (int) (stepsX   stepsY   stepsSkew);

    if (pathX.size() > 1 amp;amp; pathY.size() > 1) {
        if ((chibi1.getX()   (chibi1.getWidth() / 2) < pathX.get(steps)) amp;amp; !drawerOn)
            movingVectorX = 1;
        if ((chibi1.getX()   (chibi1.getWidth() / 2) > pathX.get(steps)) amp;amp; !drawerOn)
            movingVectorX = -1;
        if ((chibi1.getY()   (chibi1.getHeight() / 2) < pathY.get(steps)) amp;amp; !drawerOn)
            movingVectorY = 1;
        if ((chibi1.getY()   (chibi1.getHeight() / 2) > pathY.get(steps)) amp;amp; !drawerOn)
            movingVectorY = -1;
    }

    if (steps < (pathY.size() - 1)) {
        chibi1.setMovingVector(movingVectorsX.get(steps), movingVectorsY.get(steps));
    }

    if (steps >= (pathY.size() - 1)) {
        chibi1.setMovingVector(0, 0);
        if (selectedNode != enemyNode) {
             chibi1.setX((cellWidth * ((chibi1.getX() / cellWidth)))   (cellWidth / 2) - (chibi1.getWidth() / 2));
             chibi1.setY(((cellHeight) * ((chibi1.getY() / cellHeight)))   (cellHeight / 2) - (chibi1.getHeight() / 2));
        }
        movingVectorY = 0;
        movingVectorX = 0;
        steps = 0;
        }
    }
 

GestureListener.java

     @Override
    public boolean onSingleTapUp(MotionEvent e) {
       setValuesOnTapUp(e);

       (...)

       return true;
   }

   (...)
 

setValuesOnTapUp()

     void setValuesOnTapUp(MotionEvent e) {

    (...)

    gs.getChibiXCenterWhenTapUp = gs.chibi1.getX()   (gs.chibi1.getWidth() / 2);
    gs.getChibiYCenterWhenTapUp = gs.chibi1.getY()   (gs.chibi1.getHeight() / 2);
}
 

Я знаю, что этого много, и если вам нужна дополнительная информация, пожалуйста, просто спросите.

Спасибо!