You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现下落方块游戏:如何检测双指同时点击及对应视图?

嘿,针对你下落方块游戏里双指同时点击删除的需求,我给你梳理一套可行的实现思路,亲测好用!

核心思路

要实现双指同时点击两个方块的检测,关键是跟踪活跃触摸点的状态,并通过「时间差阈值」判断是否属于“同时”操作——毕竟人的双指不可能完全同步点击,得给个合理的容错范围。

具体实现步骤
  1. 定义“同时”的判定标准:
    先设置一个时间阈值(比如100ms,也就是0.1秒),只要两个触摸的开始时间差不超过这个值,就判定为“同时点击”。

  2. 维护触摸状态集合:
    为每个触摸点记录三个关键信息:触摸ID(区分不同手指)、命中的方块实例、触摸开始的时间。

  3. 处理触摸事件的全生命周期:

    • 触摸开始时:检测触摸位置是否命中方块,若命中则将该触摸的状态加入活跃列表。
    • 触摸结束/取消时:从活跃列表中移除对应的触摸状态。
    • 帧更新时:遍历活跃列表,检查是否存在两个符合条件的触摸点(时间差在阈值内、命中不同方块),若满足则删除这两个方块,并清理对应的触摸记录。
代码示例(以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:28:58