Проблема с поиском слов

Я разрабатываю игру, похожую на поиск слов. Для этого я использовал AndEngine, а для отображения сетки слов использовал TiledMap. В этой игре нам нужно соединять буквы, чтобы составить слово, когда мы перетаскиваем палец, он будет рисовать линии на плитках и соединять буквы. Я могу точно рисовать линии по вертикали и горизонтали, но когда я пытаюсь провести линию по диагонали, она идет к ближайшей плитке и рисует линию от последней затронутой плитки до соседней плитки. Но когда я осторожно перехожу к диагональным плиткам, линия рисуется точно.

Может ли кто-нибудь помочь мне решить эту проблему?

e.g.
----------------
|1   2   3   4 |
|5   6   7   8 |
|9  10  11  12 |
|13 14  15  16 |
----------------

как показано выше, например.

Я могу нарисовать линию для "1234" & "159", это означает, что все горизонтальные и вертикальные положения работают точно. Но для "963" это не так точно, как я рисую для горизонтали и вертикали.

case TouchEvent.ACTION_MOVE:

    xMove = pSceneTouchEvent.getX();
    yMove = pSceneTouchEvent.getY();
    TMXLayer tmxLayer1 =  mTMXTiledMap.getTMXLayers().get(0);
    TMXTile tmxTile1 = tmxLayer1.getTMXTileAt(xMove, yMove); 
    tmxTile1.setTextureRegion(mPlayerTextureRegion);

    if (tmxTile1.getTileRow() == 1 && tmxTile1.getTileColumn() == 1) {
    //letter M
        xMove = pSceneTouchEvent.getX();
        yMove = pSceneTouchEvent.getY();
        //yMove = pSceneTouchEvent.getX();
        if (xMove >= (TILESQUARE * 1)+20 && yMove >= (TILESQUARE * 1)+20) {//added
            yMove = (TILESQUARE * 1) + 30;//gets x-cordinate of center
            xMove = (TILESQUARE * 1) + 30;//gets y-cordinate of center
            Log.i("On Action Move X11", ""+xMove);
            Log.i("On Action Move Y11", ""+yMove);
                          //tmxTile1.setTextureRegion(mPlayerTextureRegion);
            if (!addedAmazeM) {
                addedAmazeM = true;
                System.out.println("You are in (1,1) tile");
                wordArray.add("M");
                HashMap<Float, Float> moveXY = new HashMap<Float, Float>();
                moveXY.put(xMove, yMove);
                //linePath.add(moveXY);
                Point tile11Pt = new Point();
                tile11Pt.x = (int) xMove;
                tile11Pt.y = (int) yMove;
                linePoints.add(tile11Pt);
            }
        }
    }

person Saurabh    schedule 09.07.2013    source источник


Ответы (3)


Другой подход — использовать круговой хитбокс. Это позволит вашему пальцу проходить по углам, но никогда не пропускать плитку и не прыгать, как лошадь в шахматах.

Можете ли вы опубликовать код для проверки пальцев?

Изменить*: я бы сохранил предыдущую плитку, содержащую мою последнюю действительную плитку, а затем

tmxLayer1.getTMXTileAt(xMove, yMove);

вернуть ноль, если я был между круговыми хитбоксами. Пример getTMXTileAt:

  1. найти плитку, как функция делает сейчас.
  2. найти центр плитки.
  3. Проверьте, находится ли моя нажатая точка в пределах определенного «радиуса чувствительности» этой центральной точки
  4. плитка считается действительной только в том случае, если она находится внутри. Если нет: мой палец находится между плитками.

Вам нужно добавить нижние границы как к x, так и к y, если вы все еще хотите использовать коробочный подход. Я все же рекомендую перейти на круговой. Так же проще.

Объявите статический int для чувствительности, например: 20

тогда делай

int tX,tY;
tX = moveX - tileSquareCenterX;
tY = moveY - tileSquareCenterY;
tX *= tX;
tY *= tY;
if(tX + tY < sensitivity*sensitivity)

вместо

(xMove >= (TILESQUARE * 1)+20 && yMove >= (TILESQUARE * 1)+20) {//added
person Agnfolie    schedule 09.07.2013
comment
привет, Проблема, с которой я столкнулся, заключается в том, что я хочу нарисовать линию на плитке 1-> 6-> 11-> 16 (это означает диагональ). Не могли бы вы помочь мне в примере кода, где мне нужно изменить? - person Saurabh; 09.07.2013
comment
Да и сверяясь с кругами, вы сможете идти по диагонали. Попробуйте реализовать то, что я перечислил выше. - person Agnfolie; 09.07.2013

Мне кажется, что у вас большие хитбоксы для пальца, что нет места, где палец может двигаться по диагонали, не регистрируя попадание в горизонтальный или вертикальный бокс.

Если это так, то это должно быть легко решено путем уменьшения размера «хитбокса» на пару пикселей. Это позволит вам проводить пальцем по углам.

person Agnfolie    schedule 09.07.2013

Как сказал Агнфоли, уменьшите размер хитбокса, только не на несколько пикселей, а постарайтесь уменьшить его примерно до 50%.

В основном, только если вы рисуете через середину поля, он это принимает, а не если вы просто касаетесь границы.

person Benjamin Schwalb    schedule 09.07.2013
comment
значит я уменьшаю дальность касания ближе к центру плитки, так ли это? - person Saurabh; 09.07.2013
comment
вы уменьшаете размер хитбокса по направлению к центру следующим образом: |__[хитбокс]__|__[хитбокс]__| - person Benjamin Schwalb; 09.07.2013