我正在尝试在VB网络中创建一个简单的弹力球应用程序; 我正在使用计时器和FillEllipse()方法尝试广告在计时器的每个刻度处创建一个新的圆圈。 代码:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim Gr As Graphics = Me.CreateGraphics
Gr.FillEllipse(Brushes.Teal, X, Y, W, H)
CollisionDetect()
X = X + X_Dir
Y = Y + Y_Dir
Gr.Dispose()
End Sub
结果呢?形式不断地自我绘制,而不清除最后一个圆圈。这意味着你最终会得到一个“线”的球体。
澄清: X很好,X-Coords Y是Y-Y-Coords
X_Dir是一个整数,它被添加到循环的每次迭代中,所以下次循环迭代时,它将位于不同的位置; Y_Dir与Y Coords相同;
CollisionDetect()为空。它还没有被填满,它将处理与表格两侧的碰撞。 W,H分别是宽度和高度。
想法?
答案 0 :(得分:0)
通常在触发Paint事件时完成绘制。将具有所需背景颜色的Panel
控件添加到表单中。处理面板的Paint
事件
Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
e.Graphics.FillEllipse(Brushes.Teal, X, Y, W, H)
End Sub
在绘制之前,面板将始终自动清除。
将计时器刻度事件处理程序更改为
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Panel1.Invalidate() ' This triggers the Paint event
CollisionDetect()
X = X + X_Dir
Y = Y + Y_Dir
End Sub
请注意,如果面板被其他窗体隐藏,则会自动触发Paint事件,并且必须重新绘制。如果计算机繁忙且无法绘制,则可能会跳过某些绘制事件。因此,请将您的游戏逻辑(计算)保留在Timer1_Tick
。
如果您希望直接在表单上绘图,可以使用表单的绘图事件而不是面板的绘图事件,并通过调用Me.Invalidate()
而不是Panel1.Invalidate()
来执行此操作。