Swift实现下落方块游戏:如何检测双指同时点击及对应视图?
嘿,针对你下落方块游戏里双指同时点击删除的需求,我给你梳理一套可行的实现思路,亲测好用!
核心思路
要实现双指同时点击两个方块的检测,关键是跟踪活跃触摸点的状态,并通过「时间差阈值」判断是否属于“同时”操作——毕竟人的双指不可能完全同步点击,得给个合理的容错范围。
具体实现步骤
定义“同时”的判定标准:
先设置一个时间阈值(比如100ms,也就是0.1秒),只要两个触摸的开始时间差不超过这个值,就判定为“同时点击”。维护触摸状态集合:
为每个触摸点记录三个关键信息:触摸ID(区分不同手指)、命中的方块实例、触摸开始的时间。处理触摸事件的全生命周期:
- 触摸开始时:检测触摸位置是否命中方块,若命中则将该触摸的状态加入活跃列表。
- 触摸结束/取消时:从活跃列表中移除对应的触摸状态。
- 帧更新时:遍历活跃列表,检查是否存在两个符合条件的触摸点(时间差在阈值内、命中不同方块),若满足则删除这两个方块,并清理对应的触摸记录。
代码示例(以Unity 2D游戏为例)
首先定义一个存储触摸数据的结构体:
// 用于存储触摸的关键信息 public struct TouchRecord { public int fingerId; // 手指ID,区分不同触摸 public GameObject targetBlock; // 命中的方块 public float startTime; // 触摸开始的时间(秒) }
然后在方块管理类中实现逻辑:
using UnityEngine; using System.Collections.Generic; public class BlockManager : MonoBehaviour { private List<TouchRecord> activeTouchRecords = new List<TouchRecord>(); // 同时点击的时间阈值,可根据测试调整 private const float SimultaneousThreshold = 0.1f; // 2D射线检测的层级(确保只检测方块) public LayerMask blockLayer; void Update() { HandleTouchEvents(); CheckForSimultaneousClicks(); } // 处理触摸的开始、结束事件 private void HandleTouchEvents() { foreach (Touch touch in Input.touches) { switch (touch.phase) { case TouchPhase.Began: // 2D射线检测触摸位置的方块 Vector2 touchPos = Camera.main.ScreenToWorldPoint(touch.position); RaycastHit2D hit = Physics2D.Raycast(touchPos, Vector2.zero, Mathf.Infinity, blockLayer); if (hit.collider != null && hit.collider.CompareTag("Block")) { activeTouchRecords.Add(new TouchRecord { fingerId = touch.fingerId, targetBlock = hit.collider.gameObject, startTime = Time.time }); } break; case TouchPhase.Ended: case TouchPhase.Canceled: // 移除结束的触摸记录 activeTouchRecords.RemoveAll(record => record.fingerId == touch.fingerId); break; } } } // 检测是否存在符合条件的双指同时点击 private void CheckForSimultaneousClicks() { if (activeTouchRecords.Count >= 2) { // 取前两个活跃触摸(如果有多个触摸,优先处理第一对符合条件的) TouchRecord firstTouch = activeTouchRecords[0]; TouchRecord secondTouch = activeTouchRecords[1]; // 判定条件:时间差在阈值内,且命中不同的方块 bool isSimultaneous = Mathf.Abs(firstTouch.startTime - secondTouch.startTime) <= SimultaneousThreshold; bool isDifferentBlocks = firstTouch.targetBlock != secondTouch.targetBlock; if (isSimultaneous && isDifferentBlocks) { // 删除两个方块 Destroy(firstTouch.targetBlock); Destroy(secondTouch.targetBlock); // 清空这两个触摸记录,避免重复触发 activeTouchRecords.Remove(firstTouch); activeTouchRecords.Remove(secondTouch); } } } }
注意事项
- 阈值调整:如果玩家觉得触发难度高,可以把
SimultaneousThreshold调大到0.15秒(150ms);如果太容易误触,就调小到0.08秒。 - 碰撞体设置:确保每个方块都添加了
BoxCollider2D(勾选Is Trigger与否都可以,只要射线能检测到),并且标签设为"Block",层级也对应设置。 - 防止重复触发:删除方块后记得移除对应的触摸记录,避免同一对触摸在后续帧重复触发删除逻辑。
- 触摸移动的兼容:如果允许玩家双指点击后轻微移动手指,可以在判定时增加“触摸移动距离不超过X像素”的条件,提升操作容错性。
内容的提问来源于stack exchange,提问作者K.K.D
相关产品推荐
相关产品推荐

