Получение координат при касании относительно прокручиваемой карты

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

Это означает, что когда я касаюсь одной точки экрана, getX() и getY() возвращают соответствующие значения, а затем, когда я прокручиваю карту, возвращаемые координаты должны относиться к карте, а не к экрану.
например. У меня есть фоновая карта 750 x 750, а размер экрана моего устройства — 480 x 800.
при первом касании возвращаются координаты (100, 200). теперь, когда я прокручиваю карту и касаюсь другого места, я получаю координаты 200, 200.
Я хочу получить координаты относительно карты, а не экрана.

Я пытался понять это в течение долгого времени и тщетно рыскал по сети и другим сайтам.

пожалуйста, помогите.
заранее спасибо
\m/

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

@Override
public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {

    case MotionEvent.ACTION_DOWN:
         touchStart.set(ev.getX(), ev.getY());
     x = ev.getX();
     y = ev.getY();
        break;
    case MotionEvent.ACTION_MOVE:
        newX = ev.getX() - touchStart.x + prevPicStart.x;
        newY = ev.getY() - touchStart.y + prevPicStart.y;
        if ((newX <= 0 && newX > 0 - mBG.getWidth() + Craz.DISP_WIDTH)) {
            picStart.x = newX;
          }
        if ((newY <= 0 && newY > 0 - mBG.getHeight() + Craz.DISP_HEIGHT)) {
            picStart.y = newY;

        }
        invalidate();
        break;

    case MotionEvent.ACTION_UP:

        prevPicStart.x = picStart.x;
        prevPicStart.y = picStart.y;

        break;
    }
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    Paint paint = new Paint();
    canvas.drawBitmap(mBG, picStart.x, picStart.y, paint);

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

    mBDoor.draw(canvas);
}

person Blacklight119    schedule 05.04.2011    source источник
comment
это пользовательский вид? вы реализовали прокрутку с помощью scrollTo()/scrollBy()? вы можете просто добавить значения getScroll*() к вашим координатам относительно экрана.   -  person bigstones    schedule 05.04.2011


Ответы (1)


Это довольно легко. Когда вы прокручиваете карту, у вас есть смещение. Если вы прокрутите вправо (фон будет двигаться влево), ваше смещение будет отрицательным. Допустим, у вас есть смещение по x равное -50, и вы щелкаете координаты экрана 100, вы просто выполняете математику:

mapCoordX = screenX - offsetX; // makes: 100 - (-50) = 150

просто глядя на координату X, для Y должно быть то же самое.

Я написал руководство по карте плитки и прокручивая их. Может быть, вы тоже посмотрите на это.

Псевдокод!

for (int id = 0; id < mapSize; id++) {
  Tile tile = new Tile(id);
  startX = id * tileWidth;
  startY = id % rowLenght + id / rowLenght;
  tile.setBackground(createCroppedBitmap(background, startX, startY));
}
person WarrenFaith    schedule 05.04.2011
comment
@WarrenFaith, не могли бы вы рассказать мне, как разбить большое изображение? моя фоновая карта 750x700 - person Blacklight119; 06.04.2011
comment
мне нужны координаты, потому что я разрабатываю игру, в которой у меня есть большая карта и объекты, размещенные на ней. когда я прокручиваю карту, мне нужно, чтобы объекты перемещались в одном и том же положении. я разместил свой код вверх. - person Blacklight119; 06.04.2011
comment
@Blacklight, когда вы будете следовать опубликованному руководству, вы сможете создать мозаичную карту. Вы можете использовать создание мозаичных объектов для обрезки области фона. Я отредактировал свой ответ для минимального введения - person WarrenFaith; 06.04.2011
comment
@WarrenFaith спасибо за помощь. я заставил его работать правильно. мне нужно сделать путь в этом, то есть мой спрайт персонажа должен следовать определенному пути, чтобы перейти из одной точки в другую. как это сделать на тайловой карте? - person Blacklight119; 11.04.2011
comment
Для путешествия/поиска пути проверьте этот алгоритм: en.wikipedia.org/wiki/A* _search_algorithm - person WarrenFaith; 11.04.2011
comment
@WarrenFaith, эй, мне нужна помощь в опубликованном тобой псевдокоде. я не могу заставить его работать. пожалуйста, не могли бы вы сказать мне, как именно создать обрезанное растровое изображение? дело в том, что у меня есть большое изображение, которое я хочу разбить. - person Blacklight119; 12.04.2011
comment
Есть два способа: замостить его внешней программой или обрезать на лету с помощью createBitmap(Bitmap source, int x, int y, int width, int height) вы также можете нарисовать полное изображение и создать поверх виртуальную мозаичную карту. Таким образом, вы можете перемещать и то, и другое, и вам не нужно обрабатывать растровое изображение для каждой плитки... существует множество возможных решений. Если вы снова застряли, создайте новый вопрос... - person WarrenFaith; 12.04.2011