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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:03