在C#中以平滑方式绘制移动球体的最佳方法

时间:2015-02-14 15:52:11

标签: c# graphics

您好:我正在尝试创建一个显示移动球体的应用。应用程序将改变速度和方向。我尝试过Adobe Flash,但无法顺利完成。在这种情况下,平滑度至关重要。所以我正在尝试C#。

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

有人可以推荐最佳路径吗?我将有一个主菜单,用户将选择速度/方向/多少等...然后只需显示"游戏窗口"与移动的球体。任何指导都将非常感谢。

仅在PC上显示。

由于 -Ed

2 个答案:

答案 0 :(得分:0)

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

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

如果您首先追求或WPF,那可能无关紧要。您可以在下学习基础知识,然后转到可能要求您在做任何事情之前先学习一下。

摘要

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

一旦完成所有操作,我们就会在一次操作中将整个屏幕外位图切换到显示屏。这有助于消除:

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

根据自上次更新后的时间计划更新所有图块的位置Timer。这允许更逼真的运动并且避免在负载下的加速和减速。平铺在OnUpdate方法中移动。

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

Please refer to my full SO answer complete with sample code

答案 1 :(得分:-1)

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

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

然后你应该知道什么来移动 什么;一个不错的Bitmap或只是空白背景的圆圈,或BitmapForm的控件。

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

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

如果您移动Form.Doublebuffered=true,为了平稳移动,请务必设置Form。如果您移动任何其他控件(PictureBox除外),则需要子类才能访问DoubleBuffered属性!

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