我想实现图像在无限循环中作为背景流动的代码。去做这个。 我准备了2个图像对象(图片框)。那么
我实现了如下的移动图像代码。 (我在本主题中清理了一些不必要的代码)
private void InitializeComponent()
{
this.p1.Image = ((System.Drawing.Image)(resources.GetObject("picture")));
this.p1.Location = new System.Drawing.Point(0, -1000); // 0,0 // 0, -1000
this.p1.Size = new System.Drawing.Size(1000, 1000);
this.p2.Image = ((System.Drawing.Image)(resources.GetObject("picture")));
this.p2.Location = new System.Drawing.Point(0, 1000); // 0,0 // 0, -1000
this.p2.Size = new System.Drawing.Size(1000, 1000);
t1 = new Thread(new ParameterizedThreadStart(loop));
t1.Start();
}
private void loop(Object o)
{
CTMethod cttest = new CTMethod(movePictureBox);
while (true)
{
try
{
this.Invoke(cttest);
Thread.Sleep(10); // I updated..
} catch(Exception e) {
break;
}
}
}
private void movePictureBox()
{
if (p1.Top == 0)
{
p2.Top = p1.Top-p2.Height;
}
if (p2.Top == 0)
{
p1.Top = p2.Top-p1.Height;
}
p1.Top++;
}
此代码效果很好。但我遇到了一些问题。 2个图像的链接线(连接线)看起来是口吃或偶尔发抖。 我不知道为什么图像像这样移动。这与lerp(插值)有关系吗? 如果有人知道原因,你能帮我吗?
答案 0 :(得分:0)
这可能是因为您使用的是System.Drawing.Point
http://msdn.microsoft.com/en-us/library/system.drawing.point%28v=vs.110%29.aspx
这意味着由System.Drawing.Point
确定的位置将捕捉整数,从而在动画期间导致一个像素的跳跃。
您可能希望使用System.Drawing.Pointf
(因为它使用浮点数而不是整数)
同样适用于System.drawing.size
,它以整数形式描述宽度和高度
不幸的是,所有Winforms控件(如Rotem所指出的)都使用System.Drawing.Point
,这使得它们本身不适合平滑动画。
最好不要将图片直接绘制到Graphics
对象。
答案 1 :(得分:0)
您可以尝试在表单构造函数中添加此代码,
SetStyle( ControlStyles.ResizeRedraw, true );
SetStyle( ControlStyles.UserPaint, true );
SetStyle( ControlStyles.AllPaintingInWmPaint, true );
SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
在WinForms中自定义绘图不是一个好选择,XNA是不错的选择,它用双缓冲区绘制。