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

iOS Set游戏开发:实现匹配卡片先显绿背景再移除

解决Set游戏匹配卡片延迟删除的方案

核心思路是把「标记卡片匹配」和「从数组移除卡片」拆成两步执行,中间加入延迟,让绿色背景有足够时间展示后再删除卡片:

  1. 先标记匹配状态,不立即删除
    当检测到卡片符合匹配规则时,先将这些卡片的isMatched属性设为true,此时你的ZStack会自动显示绿色背景,视图不会立刻移除卡片。

  2. 添加延迟任务,稍后删除卡片
    在标记匹配状态后,通过异步延迟任务,等待指定时间(比如1秒)再从dealedCards数组中过滤掉已匹配的卡片。

具体代码示例

模型层的匹配逻辑调整

func handleMatch(for selectedCards: [Card]) {
    // 第一步:标记匹配的卡片
    for card in selectedCards {
        if let idx = dealedCards.firstIndex(where: { $0.id == card.id }) {
            dealedCards[idx].isMatched = true
        }
    }
    
    // 第二步:延迟1秒后删除匹配卡片
    Task {
        // 等待1秒(单位:纳秒)
        try await Task.sleep(nanoseconds: 1_000_000_000)
        // 回到主线程更新UI数组
        await MainActor.run {
            // 可选:添加动画让移除更平滑
            withAnimation {
                dealedCards = dealedCards.filter { !$0.isMatched }
            }
        }
    }
}

视图层保持原有逻辑

你之前写的ZStack代码不需要改动,因为isMatched为true时会自动显示绿色背景,直到延迟结束后卡片被从数组中移除:

ZStack {
    if card.isMatched {
        RoundedRectangle(cornerRadius: 12).fill(.green)
    }
    cardContent
}

注意点

  • 必须在MainActor.run中更新dealedCards数组,因为UI操作必须在主线程执行。
  • 可以根据需求调整延迟时间(比如把1_000_000_000改成其他值,1秒=10^9纳秒)。
  • 添加withAnimation能让卡片移除时带有平滑的过渡动画,提升用户体验。

内容的提问来源于stack exchange,提问作者Vakhtang Saginadze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:35:01