3

まずはコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace winform_project
{
  public partial class Form1 : Form
  {
    void movement_correct(PictureBox pic, int i)
    {
        System.Threading.Thread.Sleep(25);
        pic.Top += (i - 1);
        pic.Left += (i + 3);
    }

    void movement_up(PictureBox pic, int i)
    {
        System.Threading.Thread.Sleep(25);
        pic.Top -= (i - 1);
        pic.Left -= (i + 3);
    }
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            movement_correct(pictureBox1, i);
            movement_correct(pictureBox2, i);
            movement_correct(pictureBox3, i);
            movement_correct(pictureBox4, i);
            movement_correct(pictureBox5, i);
            movement_correct(pictureBox6, i);
            movement_correct(pictureBox7, i);
            movement_correct(pictureBox8, i);
            movement_correct(pictureBox9, i);
            movement_correct(pictureBox10, i);
        }

        for (int i = 0; i < 5; i++)
        {
            movement_up(pictureBox1, i);
            movement_up(pictureBox2, i);
            movement_up(pictureBox3, i);
            movement_up(pictureBox4, i);
            movement_up(pictureBox5, i);
            movement_up(pictureBox6, i);
            movement_up(pictureBox7, i);
            movement_up(pictureBox8, i);
            movement_up(pictureBox9, i);
            movement_up(pictureBox10, i);
        }

    }
 }
}

ダミーのピクチャーボックスは10個です。ボタンをクリックするたびに、彼らは少し動き始めます (スペースインベーダーの敵のようなものです)。

winforms で滑らかなアニメーションを作成しようとしています。問題は、アニメーションが思ったほど滑らかではないことです。私のコードでは、すべてのボックスが同時に動いているわけではありません。動きに少し顕著なギャップがあります。私が求めているのはスムーズな動きです。

マルチスレッド化を考えていましたが、オブジェクトごとに 1 つのスレッドを意味することに気付きました。他の方法はありますか(winforms内)。

助けてくれてありがとう。

4

3 に答える 3

1

Thread.Sleep(n)タイミングの目的で使用すると、アニメーションがスムーズにならないことが保証されています。これは、渡された値がThread.SleepOS によって最小スリープ時間として扱われるためです。つまり、実際のスリープ時間はもう少し長くなる可能性があります (通常は長くなります)。代わりに、 QueryPerformanceCounterを使用してアニメーションを駆動する必要があります。

適切な高解像度タイミング エンジンを使用しても、「テアリング」効果が発生します。

于 2012-10-31T14:56:25.677 に答える
1

メソッドを取り出してループ反復で 1 回実行すると、各ボックスと呼び出しsleep()の間の遅延が (250 ミリ秒以上) から (25 ミリ秒強) に短縮されます。movement_correct()movement_up()

于 2012-11-01T19:58:45.737 に答える
1

for ループで and を呼び出すthis.SuspendLayout()this.ResumeLayout()、すべてのボックスを同時に動かし続けるのに役立ちます。滑らかさは得られないかもしれませんが、すべてが一体となって動き続けます。

于 2012-10-31T14:58:52.793 に答える