【问题标题】:Best way to draw moving sphere in a smooth way in C#在 C# 中以平滑方式绘制移动球体的最佳方法
【发布时间】:2015-02-14 15:52:10
【问题描述】:

您好:我正在尝试创建一个显示移动球体的应用程序。应用程序将改变速度和方向。我已经尝试过 Adob​​e Flash,但无法顺利完成。在这种情况下,平滑度是必不可少的。所以我正在尝试 C#。

最初,我可以看到这可以通过以下方式实现: 1) 创建一个球体的 PictureBox,并使用 Timer 更改其坐标。或者 2) 使用 this.paint 函数绘制一个实心圆,并以某种方式通过计时器擦除和重绘它。

有人可以推荐最佳路径吗?我将有一个主菜单,用户将在其中选择速度/方向/多少等......然后简单地显示带有移动球体的“游戏窗口”。任何指导将不胜感激。

这只能在 PC 上显示。

谢谢 -埃德

【问题讨论】:

  • 您可能应该发布您正在尝试的代码 - 但作为一般方法,使用 GDI+(通过覆盖 OnPaint),将 SmoothingMode 转为抗锯齿,并确保您是使用floatdouble 坐标,而不是int。这应该足以让您入门,或者如果您使用一些代码进行更新,我可能会建议一些基本更改。
  • 您可以像@Octopoid 建议的那样使用 GDI,或者您可以使用 WPF/Direct2D 等 DirectX 技术。后面会更流畅。
  • 我还要补充一点 - 当您只有几个基本对象时,使用 Timer 就可以了,尽管您要确保在表单中使用 ONE,不是每个圆圈一个/对象。如果您想让任何事情变得更复杂,尽管您可能想开始研究游戏框架,或者至少考虑一下如何管理单个全局更新/重绘。这对于协调碰撞检查和确保即使帧速率下降也能保持一致的移动速度至关重要。
  • 谢谢各位。我明天会发布我的想法:)。

标签: c# graphics


【解决方案1】:

我只是answered 一个类似的问题here

注意:根据您的需要,可以在(在某些条件下)下实现流畅的动画,尽管您负责一切。 提供了一个动画框架,但 可能是一个更难的里程碑。

您应该先追求 还是WPF 可能并不重要。可以说您可以在 下学习基础知识,然后转到 可能需要您学习相当多的知识才能做任何事情。

总结

本质上,它的作用是创建一个我们将首先绘制的离屏位图。它与 UserControl 的大小相同。控件的OnPaint 调用DrawOffscreen,传入附加到离屏位图的Graphics。在这里,我们循环只渲染可见的瓦片/天空而忽略其他,以提高性能。

完成后,我们通过一次操作将整个屏幕外位图快速显示到显示器上。这有助于消除:

  • 闪烁
  • 撕裂效果(通常与横向运动有关)

有一个Timer 计划根据自上次更新以来的时间更新所有图块的位置。这允许更逼真的运动,并避免在负载下加速和减速。瓷砖在OnUpdate 方法中移动。

如果您在代码中注明Timer1OnTick,我会在为所有内容设置动画后调用Invalidate(Bounds);。这不会导致立即绘制,而是 Windows 将排队等待稍后完成的绘制操作。连续的待处理操作将被融合为一个。这意味着我们可以在重载期间比绘画更频繁地为位置设置动画。 动画机制独立于绘画。这是一件好事,你不想等待油漆出现。 做了类似的事情

Please refer to my full SO answer complete with sample code

【讨论】:

  • 天哪,为什么不是useful
【解决方案2】:

这里有一些提示可以帮助您:

首先,您需要决定定位哪个平台:WPFWinforms

那么你应该知道什么跨越什么;一个漂亮的Bitmap 或只是一个空背景上的圆圈或一个Bitmap 或一个带有控件的Form

Winforms 中,您的两种方法都可以,尤其是。如果您设置一个圆形区域see here 为例。 (有趣的评论部分!)

是的,Timer 是为球体设置动画的方式。顺便说一句,Panel 甚至Label 可以显示BitmapPictureBox

如果移动穿过Form,请确保设置Form.Doublebuffered=true,以确保平稳移动。如果您跨过任何其他控件(PictureBoxLabel 除外),您将需要对其子类化才能访问DoubleBuffered 属性!

将移动项目的Location 保留在变量中作为PointF 并使用floats 作为其速度通常也是一个好主意,因为这样您可以细化速度和Location 变化还有Timer Intervals!

【讨论】:

  • 感谢 TaW。我正在查看您的 Windows 示例。谢谢你的例子。 WPF难学吗?在我之前作为 3D 图形硬件管道设计师的生活中,我从未掌握过 DirectX……但那是 20 年前的事了!
  • WPF 难学吗? Imo:是的。但是您的里程可能会有所不同。它对 DirectX 的使用不会是您的问题,因为它是完全集成的(除非您需要访问其内部)。完美的视频流畅度需要与显示器的刷新率同步,这是 wpf 内置的,在 Winforms 中根本不可行。但是到目前为止,我发现 WPF 太难学了.. - 使用示例来确定它是否足够好..
  • ..但请注意:示例本身不会移动任何东西,只是展示如何创建球形图片框。
  • TaW:我整个下午都在这。您能解释一下为什么要使用“using”子句吗?换句话说,你怎么知道 CreateGraphics 返回一个 iDisposable 项目?除此之外,我无法让您的代码正常工作。图片框不动。我知道点击例程被调用是因为我在那里有一个 debug.writeline ...我还不熟悉 CreateGraphics 来理解这应该做什么?我让图片框有一个边框,这样我就可以知道它在哪里......即使我认为我使用的是完整路径,图片框中也没有显示任何内容:
  • 好吧...我不知道您的示例为什么使用 pb2,它的父级做了什么设置,也不知道 CreateGraphics 是什么。由于它不起作用,我只是尝试使用10ms的计时器,并移动pictureBox1.location。真是生涩!即使 DoubleBuffered 设置为 true:
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多