【发布时间】:2019-09-02 22:07:07
【问题描述】:
我试图让一个球在屏幕上弹跳,除了每次移动时令人讨厌的闪烁之外,这主要是工作。
我已经搜索了一段时间,大多数网站都告诉你启用双缓冲,这有点帮助,但它仍然严重闪烁。
有人对如何解决这个问题有任何建议吗?
谢谢:)
我的代码:
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
【问题讨论】:
-
永远不要使用 CreateGraphics。使用正在绘制的容器的 Paint 事件中的 Graphics。这里有很多例子可供研究。
-
对不起,我不知道 stackoverflow 是否搞砸了,但我没有看到您关于仅获得 15 毫秒的消息 :)
-
永远不要使用 CreateGraphics。使用正在绘制的容器的 Paint 事件中的 Graphics。这里有很多例子可供研究。
-
你的球闪烁,因为你先是
gr.Clear(Color.White),然后是gr.FillEllipse(blackBrush, ...。在这些调用之间,表格被绘制并且没有球。这与定时器频率无关。 -
互联网很好。当我一直告诉你它是 CreateGraphics 时,你似乎卡在计时器上了。 CreateGraphics 是一种作弊,因为它会在屏幕上临时绘制。它会忽略您的缓冲。
标签: vb.net winforms graphics paint flicker