Получаване на координати при събитие на докосване спрямо превъртаема карта

Има ли начин да получите координатите на събитие с докосване върху карта, която може да се превърта?

Това означава, че когато докосна в една точка на екрана, getX() и getY() връщат съответните стойности и след това, когато превъртя картата, върнатите координати трябва да са спрямо картата, а не към екрана.
напр. Имам фонова карта 750x750, а размерът на екрана на устройството ми е 480x800.
когато докосна за първи път, кажете, че върнатите координати са (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* _алгоритъм за_търсене - 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