如何让Timer_Tick事件中玩家碰撞标签时InputBox仅弹出一次
问题根因
Timer 的 Tick 事件会按预设的间隔重复执行,只要玩家 PictureBox 和目标标签处于碰撞相交状态,每一次 Tick 都会触发一次输入框弹窗,所以会出现连续弹出多个窗口的问题。
修复方案
你只需要加一个全局标志位,控制同一次碰撞只触发一次答题逻辑即可,步骤如下:
- 第一步:在窗体代码的所有子过程外部,声明一个布尔类型的全局标志位,用来标记当前是否正在处理答题逻辑:
' 放在窗体类的通用声明区域,所有Sub之外 Private isProcessingQuestion As Boolean = False
- 第二步:修改
Timer1_Tick的逻辑,碰撞检测前先判断标志位状态,同时增加玩家离开碰撞区域后的标志位重置逻辑,修改后完整代码如下:
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Temps += 1 lblTimer.Text = Temps Dim Réponse As Integer ' 碰撞检测前先判断是否正在答题 If PictureBoxJoueur.Bounds.IntersectsWith(lblCase1.Bounds) Then If Not isProcessingQuestion Then ' 标记为正在答题,避免重复触发 isProcessingQuestion = True ' 加Val()处理非数字输入避免崩溃 Réponse = Val(InputBox("Qu'est ce que 4 + 7 ", "Répond a la question ci-dessous:")) If Réponse = 11 Then ' 显式转整数计算避免字符串拼接错误 lblScore.Text = CInt(lblScore.Text) + 1 MsgBox("Bravo!") Else lblScore.Text = CInt(lblScore.Text) - 1 MsgBox("Mauvaise réponse!") End If ' 如果该题目只需触发一次,可直接隐藏标签,不需要后续重置标志位 ' lblCase1.Visible = False End If Else ' 玩家离开碰撞区域后,重置标志位,下次碰撞可以再次触发 isProcessingQuestion = False End If End Sub
内容的提问来源于stack exchange,提问作者Sophie Beauchesne
相关产品推荐
相关产品推荐

