1

私はアンドロイドゲームに取り組んでおり、現在ゲームカメラタイプのコンポーネントで忙しいです。最良の方法は、キャンバス全体を動かしてゲームカメラのように振る舞うように (おそらくマトリックスを使用して) キャンバスを変換することです。(私が間違っている場合は修正してください)。

これはすべてうまくいっています。ゲームカメラが動いており、カメラの 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;

ビューが選択されたスポットにズームするために移動されているため、ズームはワールドタッチ変換座標を台無しにしています。カメラの位置からズーム オフセット値を差し引くと、世界の正しい位置が再び得られると思います。

したがって、 touchevent は次のようになります。

      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 get Bitmap Rect (left, top, right, bottom) on a Canvasですが、必要な awsner が提供されず、彼の計算が役立つかどうかわかりません。

本当に単純なものが欠けているような気がします。誰かが助けてくれることを願っています!

4

0 に答える 0