iOS Set游戏开发:实现匹配卡片先显绿背景再移除
解决Set游戏匹配卡片延迟删除的方案
核心思路是把「标记卡片匹配」和「从数组移除卡片」拆成两步执行,中间加入延迟,让绿色背景有足够时间展示后再删除卡片:
先标记匹配状态,不立即删除
当检测到卡片符合匹配规则时,先将这些卡片的isMatched属性设为true,此时你的ZStack会自动显示绿色背景,视图不会立刻移除卡片。添加延迟任务,稍后删除卡片
在标记匹配状态后,通过异步延迟任务,等待指定时间(比如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
相关产品推荐
相关产品推荐

