Canvas gamecamera - локализация перевода значений, испорченных из-за примененного масштабирования холста - PullRequest
1 голос
/ 22 августа 2011

Я работаю над игрой для Android и в настоящее время занята компонентом типа игровой камеры. Кажется, лучший способ - перевести холст (возможно, с матрицей), чтобы переместить весь холст, чтобы он действовал как игровая камера. (поправьте меня, если я ошибаюсь).

все это прекрасно складывается, игровая камера движется, а значения x и y камеры используются в качестве руководства для перевода местоположения холста:

    public void onMove(float distanceX, float distanceY){

          Camera.x += (int) distanceX;
          Camera.y += (int) distanceY;
     }

     protected void onDraw(Canvas canvas) {

             canvas.translate(Camera.x, Camera.y);

             level.draw(canvas);

             //the text is a ui component so shouldn't move with the level
             canvas.restore();
             canvas.drawText(fps + " fps", 0, 32, textPaint);
       }

При попытке взаимодействия с миром я просто добавляю координаты камеры к координатам касания, чтобы получить правильную точку в мире:

      public void onSingleTap(MotionEvent event) {

        float mouseX = event.getX() - Camera.x;
        float mouseY = event.getY() - Camera.y;
     }

Однако, У пользователя также есть возможность масштабировать экран, увеличивая масштаб до точки мира.

case MotionEvent.ACTION_MOVE:

    if (MODE == ZOOM && event.getPointerCount() == 2) {

        float newDist = spacing(event);

        if (newDist > 10f) {

            Camera.zoom = newDist / PrevMultiDist;

            //the midpoint for the zoom
            midPoint(midpoint, event);
            Camera.setPivot(midpoint.x, midpoint.y);

            translateMatrix.postScale(Camera.zoom, Camera.zoom, Camera.pivotX, Camera.pivotY);
        }
    }
 break;

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

Так что тушевент становится примерно таким:

      public void onSingleTap(MotionEvent event) {
      //ideally the zoomoffset might be added in the camera's location already?
        float mouseX = event.getX() - Camera.x - zoomOffsetX;
        float mouseY = event.getY() - Camera.y - zoomOffsetY;
     }

Я уже нашел этот вопрос: Android получает растровое изображение Rect (слева, сверху, справа, снизу) на Canvas , но он не предоставляет нужного мне awsner, и я не могу понять, если его расчеты могут помочь мне.

Я чувствую, что упускаю что-то действительно простое. Надеюсь, кто-то может помочь!

...