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

VB.NET运行时自动克隆对象:弹幕游戏批量创建移动子弹实现问询

VB.NET弹幕游戏批量子弹创建与移动实现方案

核心思路

用集合统一管理所有子弹对象,拆分两个Timer的职责:一个负责定时生成子弹,另一个负责驱动所有子弹移动并清理超出边界的子弹,逻辑更清晰,运行也更流畅。

具体实现步骤

  1. 声明全局集合:在窗体类里定义一个List(Of PictureBox),用来存储所有活跃的子弹,方便批量操作。
  2. 配置生成子弹的Timer:设置较低的触发间隔(比如200ms),每次触发时创建新的子弹控件,初始化属性后加入集合和窗体。
  3. 配置移动子弹的Timer:设置较短的触发间隔(比如16ms,接近60帧),遍历集合里的子弹,更新位置,同时清理超出屏幕的子弹。

完整代码示例

Public Class Form1
    ' 全局集合存储所有活跃子弹
    Private bullets As New List(Of PictureBox)()

    ' 生成子弹的Timer事件(命名为tmrSpawnBullet)
    Private Sub tmrSpawnBullet_Tick(sender As Object, e As EventArgs) Handles tmrSpawnBullet.Tick
        ' 创建新子弹控件
        Dim newBullet As New PictureBox()
        ' 设置子弹属性(按需调整)
        newBullet.Size = New Size(10, 10)
        newBullet.Image = My.Resources.BulletImage ' 替换为你的子弹图片
        newBullet.SizeMode = PictureBoxSizeMode.StretchImage
        newBullet.BackColor = Color.Transparent
        ' 设置初始位置(窗体顶部随机X坐标)
        newBullet.Location = New Point(Random.Next(0, Me.ClientSize.Width - newBullet.Width), -newBullet.Height)
        
        ' 将子弹加入集合和窗体控件
        bullets.Add(newBullet)
        Me.Controls.Add(newBullet)
    End Sub

    ' 移动子弹的Timer事件(命名为tmrMoveBullets)
    Private Sub tmrMoveBullets_Tick(sender As Object, e As EventArgs) Handles tmrMoveBullets.Tick
        ' 反向遍历集合,避免移除元素时引发遍历异常
        For i As Integer = bullets.Count - 1 To 0 Step -1
            Dim bullet = bullets(i)
            ' 向下移动3像素
            bullet.Location = New Point(bullet.Location.X, bullet.Location.Y + 3)
            
            ' 检查是否超出窗体下边界(按需调整坐标判断逻辑)
            If bullet.Location.Y > Me.ClientSize.Height Then
                ' 从窗体移除并释放资源
                Me.Controls.Remove(bullet)
                bullet.Dispose()
                ' 从集合中移除
                bullets.RemoveAt(i)
            End If
        Next
    End Sub

    ' 窗体加载时初始化Timer(也可在设计器里直接设置)
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        tmrSpawnBullet.Interval = 200 ' 每200ms生成一颗子弹
        tmrMoveBullets.Interval = 16 ' 每16ms移动一次,接近60帧流畅度
        tmrSpawnBullet.Start()
        tmrMoveBullets.Start()
    End Sub
End Class

关键注意事项

  • 集合遍历方式:必须反向遍历或者先复制集合再遍历,否则移除元素时会触发InvalidOperationException。
  • 资源释放:子弹超出边界时,要先从窗体控件移除,再调用Dispose()释放资源,避免内存泄漏。
  • 图片资源:提前把子弹图片添加到项目资源文件(右键项目→属性→资源→添加资源),替换代码里的My.Resources.BulletImage。
  • 坐标调整:如果你的窗体下边界是Y=0,把边界判断条件改成bullet.Location.Y < 0即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:45:18