如何确保玩家在允许他们移动之前接触到游戏块

How to make sure a player is touching the game piece before allowing them to move it

我正在努力使游戏块(红色方块)无法移动,除非玩家最初在 上单击它,然后可以自由拖动直到释放它.目前,如果玩家点击屏幕上的任意位置,游戏块将在他们开始移动时移动到他们的 cursor/finger。如果我尝试使用类似的东西:

case MotionEvent.ACTION_DOWN: //player pressing down
            if (gamePiece.getRectangle().contains((int) event.getX(), (int) event.getY())) {
                switch (event.getAction()) {;
                    case MotionEvent.ACTION_MOVE: //player moving their finger
                        gamePiecePoint.set((int) event.getX(), (int) event.getY() - 100);
                {
            }

检查方块是否包含玩家点击的点确实会阻止玩家移动,但它会使移动非常不一致,因为光标在移动时不会直接停留在游戏块上。

我想要做的是要求对游戏块进行初始触摸,然后允许自由移动直到他们释放方块。我只是不确定如何完成此操作。

这是我当前的 onTouchEvent 实现。 ACTION_DOWN 案例中的 if 语句阻止块立即捕捉到玩家点,但是当光标移动时,游戏块移动到它。

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: //player pressing down
            if (!(gamePiece.getRectangle().contains((int) event.getX(), (int) event.getY()))) {
                break;
            }
        case MotionEvent.ACTION_MOVE: //player moving their finger
            gamePiecePoint.set((int) event.getX(), (int) event.getY() - 100);
            //GameBoard.checkInteraction(gamePiecePoint);
            break;
        case MotionEvent.ACTION_UP:
            gamePiecePoint = GameBoard.checkInteraction(gamePiecePoint);
            break;

    }

    return true;
    //return super.onTouchEvent(event);
}

编辑:根据@Nicola 的建议,我将 switch-case 块更改为以下内容(定义为 class 级别的 wasClicked)...

switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: //player pressing down
            // Check if action down happened inside the gamePiece
            wasClicked = gamePiece.getRectangle().contains((int) event.getX(), (int) event.getY());
  
        case MotionEvent.ACTION_MOVE: //player moving their finger
            if (wasClicked) {
                gamePiecePoint.set((int) event.getX(), (int) event.getY() - 100);
            }
            
        case MotionEvent.ACTION_UP:
            gamePiecePoint = GameBoard.snapToNearest(gamePiecePoint);
            // Snaps player gamePiece to nearest tile on release
}

我确实注意到,如果我将 wasClicked = false; 放入 ACTION_UP 案例中,它会破坏系统并且我一次只能移动少量的 gamePiece。我不是 100% 确定为什么会发生这种情况,但是当我使用 system.out 从控制台监视 ACTION_UP 时,我注意到它在我移动部件时不断触发,而不仅仅是当我释放堵塞。我不确定这是有意为之,但没有它它也能工作,所以我现在很满意。非常感谢!!

创建一个标志 canMovePiece 可能会有帮助。
ACTION_DOWN 发生时,如果事件的坐标包含在红色方块内,我们可以将 canMovePiece 设置为 true,如果不是,则什么都不会发生。
现在,如果标志是 true,我们知道玩家可以移动红色方块,所以每次 ACTION_MOVE 发生(不要在 ACTION_DOWN 内创建 switch-case 方块,你可以只在 onTouchEvent() 中使用一个 switch-case) 可以检查标志的值:如果它是 true,我们得到当前的 xy 并更新红色方块的位置。如果是 false,什么也不会发生。

我认为这应该足以建立基于光标(手指)位置的红色方块的实时移动。当 ACTION_UP 发生时,我们应该只将标志设置为 false 以在将来开始另一个操作。