您好:我正在尝试创建一个将显示移动球体的应用程序。 应用程序将改变速度和方向。 我尝试过Adobe Flash,但无法使其流畅。 在这种情况下,平滑度至关重要。 所以我正在尝试 C#。
最初,我可以看到这可以通过以下方式实现:1(创建一个球体的图片框,并使用计时器更改其坐标。或2(使用this.paint函数绘制一个填充的圆,并以某种方式使用计时器擦除并重新绘制它。
有人可以推荐最佳路径吗? 我将有一个主菜单,用户可以在其中选择速度/方向/数量等...然后简单地显示带有移动球体的"游戏窗口"。 任何指导将不胜感激。
这只能在PC上显示。
谢谢-艾德
我刚刚在这里回答了一个类似的问题。
注意:根据您的需要,尽管您负责一切,但在winforms(在某些条件下(下可以实现流畅的动画。 WPF提供了一个动画框架,但WPF可能是一个更难的里程碑。
你应该先追求winforms还是WPF可能并不重要。 您可以说可以在winforms下学习基础知识,然后转到wpf。 WPF 可能需要您先学习很多东西,然后才能做任何事情。
总结
从本质上讲,这样做的作用是创建一个我们将首先绘制的屏幕外位图。 它的大小与用户控件的大小相同。 控件的OnPaint
调用DrawOffscreen
传入附加到屏幕外位图的Graphics
。 在这里,我们只渲染可见的图块/天空,而忽略其他图块/天空,以提高性能。
完成所有操作后,我们将在一个操作中将整个屏幕外位图删除到显示器上。 这有助于消除:
- 闪烁
- 撕裂效应(通常与横向移动有关(
Timer
计划根据自上次更新以来的时间更新所有磁贴的位置。 这允许更逼真的运动,并避免在负载下加速和减速。 切片在OnUpdate
方法中移动。
如果您在代码中记下Timer1OnTick
我会在对所有内容进行动画处理后调用Invalidate(Bounds);
。 这不会导致立即绘制,而是 Windows 会将绘制操作排队以在以后完成。 连续的待处理操作将融合为一个。 这意味着我们可以在重负载下比绘画更频繁地对位置进行动画处理。 动画机制与绘画无关。 这是一件好事,你不想等待油漆发生。 xna做了类似的事情
请参考我的完整SO答案以及示例代码
一些提示可以让你开始:
首先,您需要决定要定位哪个平台:WPF
或Winforms
。
然后你应该知道在什么地方移动什么;一个漂亮的Bitmap
,或者只是一个圆圈,穿过一个空的背景,或者一个Bitmap
或一个带有控件的Form
。
Winforms
您的两种方法都将起作用,特别是如果您设置了一个圆形区域,请参阅此处的示例。(有趣的评论中的部分!
是的,Timer
是制作球体动画的方式。顺便说一句,Panel
甚至Label
都可以像PictureBox
一样显示Bitmap
。
为了平滑移动,请确保设置Form.Doublebuffered=true
,如果您跨过Form
。如果您在任何其他控件(PictureBox
或Label
除外(之间移动,则需要对其进行子类化才能访问DoubleBuffered
属性!
移动项目的Location
保留在变量中作为PointF
并使用floats
作为其速度通常也是一个好主意,因为这样您就可以细粒度速度和Location
变化以及Timer Intervals
!