Android 2D游戏:实现onTouch方法单次触摸仅执行一次
解决你的2D游戏触摸问题
嘿,我来帮你搞定这两个触摸相关的问题!咱们逐个分析解决:
问题1:触摸一列时多个单元格变化
你的代码里用了两层嵌套循环遍历所有单元格,当触摸某一列的x坐标范围时,同一列的多个行单元格都会满足x范围判断,导致多次调用play(),自然就会有多个单元格变化。
解决思路:你应该定位到当前触摸列中符合条件的单个单元格(比如最下方的空单元格,毕竟这类游戏通常是落子到列的底部),而不是遍历所有行。可以先根据触摸x坐标确定对应的列j,然后从下往上遍历该列的行,找到第一个空单元格后再执行play(),这样就只会触发一次。
问题2:按住屏幕时onTouch持续执行
onTouch方法会响应MotionEvent的所有动作(比如ACTION_DOWN、ACTION_MOVE、ACTION_UP),你现在的代码不管什么动作都会执行逻辑,所以按住屏幕滑动时,ACTION_MOVE会持续触发方法。
解决思路:只在**首次触摸按下(ACTION_DOWN)**时执行你的游戏逻辑,其他动作直接返回false或者跳过处理。
修改后的代码示例
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyView a = new MyView(this); setContentView(a); a.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View view, MotionEvent motionEvent) { // 只处理按下动作,避免重复触发 if (motionEvent.getAction() != MotionEvent.ACTION_DOWN) { return false; } float mX = motionEvent.getX(); // 先确定触摸的列j int targetColumn = -1; for (int j = 0; j < size; j++) { // 用第一行的单元格来判断列的x范围(因为同一列x坐标应该一致) if (mX > board[0][j].getterxPos() - 50 && mX < board[0][j].getterxPos() + 50) { targetColumn = j; break; } } // 如果找到了目标列,从下往上找第一个空单元格 if (targetColumn != -1) { for (int i = size - 1; i >= 0; i--) { if (board[i][targetColumn].getterCellType() == '.') { playColumn = board[i][targetColumn].getterColumn(); play(); break; // 找到后立即退出循环,只执行一次play() } } } return true; } }); }
额外说明
- 我假设你的
size是棋盘的行列数,并且同一列的单元格x坐标是一致的,所以用第一行的单元格来判断列的范围更高效。 - 从下往上遍历行是为了找到当前列最底部的空单元格,这符合大多数落子类2D游戏的逻辑,如果你的游戏逻辑不同,可以调整遍历方向。
内容的提问来源于stack exchange,提问作者tarktark
相关产品推荐
相关产品推荐

