連なるタコさん(後編)

こんにちは、きうちです。

今回は連なるタコさん(前編)の続きをお送りします。

前回はウィンドウの中をキー操作やマウス操作に反応して、タコさんが連なって移動するものを作りました。

今回はこれをデスクトップマスコットっぽくしてみたいと思います。

まず、前回の状態だとちょっとタコさんがちらついて表示されていたので、フォームをダブルバッファにします。
(前回のフォームをコピーしてForm2を作り、そこで作業をしているのでフォーム名がForm2になっています。)

コンストラクタに処理を追加します。

  • タイトルバーや縁をなくす
  • フォームを透明にする
  • フォームを全画面にする

public Form2()
{
    InitializeComponent();

    member = new Octopus[20];
    for (int i = 0; i < member.Length; i++)
    {
        member[i] = new Octopus(new Point(400, 300));
    }

    this.FormBorderStyle = FormBorderStyle.None; // タイトルバーや縁をなくす
    this.BackColor = Color.White; // フォームの背景色を白にする
    this.TransparencyKey = Color.White; // フォームの透過色として白を指定する
    this.WindowState = FormWindowState.Maximized; // フォームを全画面にする
}

この状態で実行してみます。

開発に使用しているVisual Studioの画面の上にレイヤーができたように、タコさんが表示されました。

しかし・・・マウスに反応しないですね。

キーボードには反応してくれます。

どうも、フォームを透明にしたことで、MouseMoveイベントが発生しなくなってしまったようですね。
タコさんの上にマウスポインタを移動させると、その時だけは反応してくれます。

そこで、フォームのMouseMoveイベントを利用するのはすっぱりあきらめます。

タイマーでいきます。

フォームにタイマーを1個追加して、そのTICKイベントの中で処理を行うことにします。

MouseMoveイベントのときと違い、イベント引数からマウスポインタの座標を取得できませんので `System.Windows.Forms.Cursor.Position` でマウスポインタの座標を取得します。

また、マウスポインタが移動していない時まで反応してしまうのはよくないので、マウスポインタが移動した時だけ処理を行うようにします。


▲MouseMoveイベントは無くします


▲タイマーを追加します


▲インターバルはデフォルトの100msのまま。EnabledはTrueに。


▲TICKイベントを追加します

private Point currentMouseP = new Point(0, 0); // マウスポインタの位置保持用

private void timer1_Tick(object sender, EventArgs e)
{
    // マウスポインタの位置を取得する
    int x = System.Windows.Forms.Cursor.Position.X;
    int y = System.Windows.Forms.Cursor.Position.Y;

    // マウスポインタが移動していたら処理
    if (currentMouseP.X != x || currentMouseP.Y != y)
    {
        currentMouseP = new Point(x, y);
        var v = new Point(x - member[0].P.X, y - member[0].P.Y);
        for (int i = member.Length - 1; i > 0; i--)
        {
            member[i].V = member[i - 1].V;
            member[i].P = MoveObject(member[i].P, member[i].V);
        }
        member[0].V = v;
        member[0].P = MoveObject(member[0].P, member[0].V);
        Refresh();
    }
}

実行すると…

おお、マウスポインタに反応して動いてくれるようになりました。

…しかし…ちょっとマウスポインタに迅速に着いてきすぎですね。
座標増分を 1/5 にしてみることにします。

timer1_Tick の if節2行目。

var v = new Point((x - member[0].P.X) / 5, (y - member[0].P.Y) / 5);

実行すると…

うん、いい感じ。

…なんか動きがヘビっぽくなったな。

苦手な方がご覧になっていたらごめんなさい^^;

★ ★ ★

というわけで、「連なるタコさん(後編)」をお送りしましたが、いかがでしたでしょうか。

応用次第でもっと面白いものも作れると思います。

あと、今の状態だと他のウィンドウが上に重なることができてその場合タコさんが非表示になるんですが、フォームの TopMost プロパティを True にするとかすればよかったと思います(確か)。

ご興味がありましたら是非トライしてみてください^^

それでは!

追伸

ソースを以下にアップしました。ご参考までに…

https://github.com/YasuhikoKiuchi/OctopusFormation

タグ: