1

ここしばらく遊んでいたこの小さなアプリケーションを見つけました。単純に画像を円で回転させたいと思っていましたか?または、画像全体を上下にバウンスさせるには、このプログラムをどのように変更すればよいでしょうか? 私が試したすべてのことは、画像を左または右に移動させたとしても、画像を引き伸ばすだけです。私に何ができるかについてのアイデアはありますか?コードは以下です

   public partial class Form1 : Form
   {
          private int width = 15;
          private int height = 15;

          Image pic = Image.FromFile("402.png");
          private Button abort = new Button();
          Thread t;

          public Form1()
          {
            abort.Text = "Abort";
            abort.Location = new Point(190, 230);
            abort.Click += new EventHandler(Abort_Click);
            Controls.Add(abort);

            SetStyle(ControlStyles.DoubleBuffer| ControlStyles.AllPaintingInWmPaint| ControlStyles.UserPaint, true);

            t = new Thread(new ThreadStart(Run));
            t.Start();
          }
          protected void Abort_Click(object sender, EventArgs e) 
          {
            t.Abort();
          }

          protected override void OnPaint( PaintEventArgs e )   
          {
             Graphics g = e.Graphics;
             g.DrawImage(pic, 10, 10, width, height);
             base.OnPaint(e);
          }

          public void Run() 
          {

              while (true) 
              {
                for(int i = 0; i < 200; i++) 
                {
                    width += 5;

                  Invalidate();
                  Thread.Sleep(30);
                }

              }
          }
    }
4

1 に答える 1

1

だから私はあなたが何を達成しようとしているのかわかりませんが、ファンディーを邪魔しないようにするために、WinFormsはGDI +ライブラリであり、GUIのものを意味しているので、アニメーションのようなものはおそらくグラフィックライブラリでより適切に処理されるでしょう. SFMLのように。

とにかく、あなたが望むものを達成する方法は無数にあります。円を描くように何かを動かすには、少し単純なトリガーが必要です。跳ねる動きの場合、正弦曲線に従うのが最も簡単な方法だと思います。

バウンス用の疑似コード (構文が完全かどうかは不明) を次に示します。

フィールド定義:

private double frame = 0;

オンペイント:

Graphics g = e.Graphics;
g.DrawImage(pic, 10, 10 + Math.sin(frame)*10, width, height);
frame+=.01;
base.OnPaint(e);

このように、ペイント イベントがトリガーされるたびに、t は .01 ラジアンずつ増加します。sin には -1 と 1 の間で振動するドメインがあり、これを 10 倍して跳ね返る効果を得ることができます。

Frame は「キーフレーム」を表します。速度を上げたい場合は、frame+=__値を大きくしてください。範囲を広げたい場合は、オフセットを変更しますMath.sin(frame)*__

于 2012-04-08T05:20:16.913 に答える