- PR -

pictureBox を使用したアニメーション

1
投稿者投稿内容
bucci
会議室デビュー日: 2005/11/01
投稿数: 18
投稿日時: 2006-06-23 18:06
今、背景画像の上にImageを描画し、そのImageが動くものを作ろうとしています。
一般的にはどのように行うのでしょうか?

1.背景をFormのBackgroundに設定し、動かす画像をpictureBoxのImageに設定。
 TimerでpictureBoxのtopとleftをインクリメントしてみました。
 →もわ〜んとした感じでスムーズではなかったです。

2.大きいpictureBoxのbackgroundに背景を設定し、動かす画像をGraphicsクラスの
 DrowImageを使用して描画する。Timerを使用し、表示する位置を変えて動くように見せる。
 →残像が残る。Clearがありましたが、色で塗りつぶすと書かれていました。
 BackgroundがImage画像なので単色塗りつぶすのは使えません。
 BackgroundのImageをnullにし、Backgroundを再描画し、
 さらに動かす画像をDrowImageするのがいいのでしょうか?

 それとも、動かす画像の位置付近を、背景画像の一部を切り抜いて
 描画し、その上に動かす画像を描画するのがいいのでしょうか?

3.上記以外。


いろいろネットで検索をしていたら、マスクの画像を容易して・・・
というのもありました。このばあいどのようにするのがいいのか
教えていただけないでしょうか?

よろしくお願いします。
bucci
会議室デビュー日: 2005/11/01
投稿数: 18
投稿日時: 2006-06-23 18:53
書き忘れてしまいました。
C#(vs.net 2003、.netframework 1.1)を使用しています。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-24 08:53
引用:

bucciさんの書き込み (2006-06-23 18:06) より:

2.大きいpictureBoxのbackgroundに背景を設定し、動かす画像をGraphicsクラスの
 DrowImageを使用して描画する。Timerを使用し、表示する位置を変えて動くように見せる。
 →残像が残る。Clearがありましたが、色で塗りつぶすと書かれていました。
 BackgroundがImage画像なので単色塗りつぶすのは使えません。
 BackgroundのImageをnullにし、Backgroundを再描画し、
 さらに動かす画像をDrowImageするのがいいのでしょうか?

 それとも、動かす画像の位置付近を、背景画像の一部を切り抜いて
 描画し、その上に動かす画像を描画するのがいいのでしょうか?



2番の方法ですが、以下の様にしてませんよね?
コード:

private void timer1_Tick(object sender, System.EventArgs e)
{
// 描画位置変更
Pos++;
// 再描画
using(Graphics g = PictureBox1.CreateGraphics())
{
// bmp:動かす画像イメージ
g.DrawImage(bmp, Pos, Pos);
}
}


してたら、残像か残るのは当然ですが・・・

通常、以下のコードでいいと思います。
コード:

private Bitmap bmp;
private int Pos = 0;

private void Form1_Load(object sender, System.EventArgs e)
{
bmp = new Bitmap("c:\Image.bmp");
// 透過色指定
bmp.MakeTransparent(Color.White);
// 背景イメージ設定
this.pictureBox1.BackgroundImage = new Bitmap("c:\BackImage.bmp");
this.timer1.Enabled = true;
this.timer1.Start();
}

private void timer1_Tick(object sender, System.EventArgs e)
{
// 描画位置変更
Pos++;
// 再描画
this.pictureBox1.Invalidate();
}

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawImage(bmp, Pos, Pos);
}



#ちらつきが目立つのであれば、ダブルバッファリングの処理を追加してください。


[ メッセージ編集済み 編集者: 深山 編集日時 2006-06-24 08:55 ]
bucci
会議室デビュー日: 2005/11/01
投稿数: 18
投稿日時: 2006-06-24 21:42
深山さんありがとうございました。

うまく表示されました。
ちらつきが目立ったため、ダブルバッファリングを調べてみました。
このような制御方法があるとは知りませんでした。
NET Framework 1.xでも設定可能みたいなので
これから試してみます。
本当にありがとうございました。今からわくわく気分です。
1

スキルアップ/キャリアアップ(JOB@IT)