我试图让一个球在屏幕上弹跳,除了每次移动时令人讨厌的闪烁之外,这主要是工作。
我已经搜索了一段时间,大多数网站都告诉你启用双缓冲,这有点帮助,但它仍然严重闪烁。
有人对如何解决这个问题有任何建议吗?
谢谢:)
我的代码:
Imports System.Drawing
Public Class Form1
Public gr As Graphics
Public XSpeed As Integer = 2
Public YSpeed As Integer = 2
Public ParticleCoord(1) As Integer
Public Blackbrush As New SolidBrush(Color.Black)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
gr = Me.CreateGraphics()
YSpeed = CInt(Math.Ceiling(Rnd() * 10))
XSpeed = CInt(Math.Ceiling(Rnd() * 10))
ParticleCoord = {50, 50}
Timer.Enabled = True
End Sub
Private Sub ParticleMove(ByRef XSpeed, ByRef YSpeed)
If (ParticleCoord(0) < (12 + 1189) And ParticleCoord(0) > 12) And (ParticleCoord(1) < (12 + 449) And ParticleCoord(1) > 12) Then
ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
gr.Clear(Color.White)
gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
ElseIf (ParticleCoord(0) < (12 + 1189) And ParticleCoord(0) > 12) Then
YSpeed = -YSpeed
ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
gr.Clear(Color.White)
gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
ElseIf (ParticleCoord(1) < (12 + 449) And ParticleCoord(1) > 12) Then
XSpeed = -XSpeed
ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
gr.Clear(Color.White)
gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
Else
YSpeed = -YSpeed
XSpeed = -XSpeed
ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
End If
End Sub
Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick
ParticleMove(XSpeed, YSpeed)
End Sub
End Class
最佳答案
如评论中所述,您应该始终使用 Paint
事件中的 Graphics
对象。要调用重绘,请在您的控件上调用 Invalidate()
。不要不使用 Refresh()
(没那么糟糕)或 Application.DoEvents()
(非常糟糕)来执行重绘。
奖励:获得非常流畅的绘图体验的专业提示
摆脱OnPaintBackground()
,见my other answer here .
有了它,您将获得良好的渲染性能(对于 GDI+),我经常使用它。你可以在 here 上看到它在一个有趣的项目中,我分析了 WinForms 控件层次结构:WinFormsCT on GitHub .
关于vb.net - 在Windows窗体中重绘椭圆时如何停止闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497422/