VB.NET运行时自动克隆对象:弹幕游戏批量创建移动子弹实现问询
VB.NET弹幕游戏批量子弹创建与移动实现方案
核心思路
用集合统一管理所有子弹对象,拆分两个Timer的职责:一个负责定时生成子弹,另一个负责驱动所有子弹移动并清理超出边界的子弹,逻辑更清晰,运行也更流畅。
具体实现步骤
- 声明全局集合:在窗体类里定义一个
List(Of PictureBox),用来存储所有活跃的子弹,方便批量操作。 - 配置生成子弹的Timer:设置较低的触发间隔(比如200ms),每次触发时创建新的子弹控件,初始化属性后加入集合和窗体。
- 配置移动子弹的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
相关产品推荐
相关产品推荐

