如何确保玩家在允许他们移动之前接触到游戏块
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
,我们得到当前的 x
和 y
并更新红色方块的位置。如果是 false
,什么也不会发生。
我认为这应该足以建立基于光标(手指)位置的红色方块的实时移动。当 ACTION_UP
发生时,我们应该只将标志设置为 false
以在将来开始另一个操作。
我正在努力使游戏块(红色方块)无法移动,除非玩家最初在 上单击它,然后可以自由拖动直到释放它.目前,如果玩家点击屏幕上的任意位置,游戏块将在他们开始移动时移动到他们的 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
,我们得到当前的 x
和 y
并更新红色方块的位置。如果是 false
,什么也不会发生。
我认为这应该足以建立基于光标(手指)位置的红色方块的实时移动。当 ACTION_UP
发生时,我们应该只将标志设置为 false
以在将来开始另一个操作。