【问题标题】:Word Search Game Issue单词搜索游戏问题
【发布时间】:2013-07-09 07:18:03
【问题描述】:

我正在开发一个类似单词搜索的游戏。为此,我使用了 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);
            }
        }
    }

【问题讨论】:

    标签: android andengine tile


    【解决方案1】:

    另一种方法是使用圆形碰撞盒。这将使您的手指能够通过角落,但永远不会跳过一块瓷砖并像国际象棋中的马一样跳跃。

    您可以发布一些用于您的手指检查的代码吗?

    编辑*: 我将保存一个包含我最新的有效图块的 previousTile,然后拥有

    tmxLayer1.getTMXTileAt(xMove, yMove);
    

    如果我在圆形碰撞盒之间,则返回 null。 示例 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
    

    【讨论】:

    • 嗨,我面临的问题是,我想在瓷砖 1->6->11->16 上画一条线(这意味着对角线)。您能否在代码示例中帮助我,我应该在哪里更改?
    • 是的,通过检查圆圈,您将能够对角线。尝试实现我上面列出的内容。
    【解决方案2】:

    在我看来,你必须为手指设置大的碰撞箱,没有空间可以让手指在不记录水平或垂直箱子上的碰撞的情况下沿对角线移动。

    如果是这种情况,应该通过将“hitbox”的大小减小几个像素来轻松解决。这将使您能够通过角落拖动手指。

    【讨论】:

      【解决方案3】:

      就像 Agnfolie 说的,减少 hitbox 的大小,不仅仅是几个像素,而是尽量减少到 50%。

      基本上,只有当您在字段中间绘制时,它才会接受它,而不是仅触摸边框。

      【讨论】:

      • 意思是我缩小了磁贴中心附近的触摸范围,是这样吗?
      • 你将hitbox的大小向中心减小,如下所示:|__[hitbox]__|__[hitbox]__|
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多