【C#】迷路を作ろう コントロールを動かそう

スポンサーリンク

今回は、設置したプレーヤー(ピクチャーボックス)をキーボードの操作で動くようにしたいと思います!!

前回のピクチャーボックスの配置の関数を修正

前回の作った関数では、ピクチャーボックスが関数内で定義していましたが、他の関数でも使いたいので、外に出しましょう!!

下記が修正後です。PictureBoxを他の関数でも使えるように、上位で定義しました。

private PictureBox PicPlayer;

private void Placement_Player()
{
    //ラベルを定義する & ラベルの名前を定義する
    string picbxname = "picbxplayer";

    //2回目以降を考えて、名前から取得する
    PicPlayer = (PictureBox)this.Controls[picbxname];
    if(PicPlayer == null)
    {
        PicPlayer = new PictureBox();
    }

    PicPlayer.Name = picbxname;
    PicPlayer.Image = BmpPlayer;
    PicPlayer.Visible = true;
    PicPlayer.Size = new Size(playersize, playersize);
    PicPlayer.SizeMode = PictureBoxSizeMode.StretchImage;

    //スタート位置のLocation(配置)とSize(大きさ)を取得
    Point pnt = lblMaze(0, 1).Location;
    Size sz = lblMaze(0, 1).Size;

    //スタートマスの真ん中に行くように計算する。
    int x = pnt.X + (sz.Width / 2) - (playersize / 2);
    int y = pnt.Y + (sz.Height / 2) - (playersize / 2);
    PicPlayer.Location = new Point(x, y);

    //コントロールに追加する
    this.Controls.Add(PicPlayer);
    PicPlayer.BringToFront();
}

ピクチャーボックスの位置を移動させよう

ピクチャーボックスの配置の座標は、Locationのプロパティで決まります。

LocationはPoint型なので、Locationに新しいPoint型を代入すれば、ピクチャーボックスの配置を移動させることが出来ます。

PicPlayer.Location = new Point(100,200);

この場合、PicPlayerのピクチャーボックスを(100,200)の位置に再配置する事ができます。

1回押される毎に移動させたいので下記のような関数を作りました。

private void Move_PictureBox(PictureBox pic,Point pntValue)
{
    int x = pic.Location.X + pntValue.X;
    int y = pic.Location.Y + pntValue.Y;

    pic.Location = new Point(x, y);
    return;
}

引数1(pic)では、ピクチャーボックスのコントロール。(今回は必要ないのですが、どんなピクチャボックスでも対応できるように)

引数2(pntValue)では、移動させたい量をPoint型でもらいます。

キーボード入力が来たら、ピクチャーボックスを移動させよう

必要な関数は準備できたので、キーボード入力(矢印)の入力で移動させましょう。

キーボードの矢印を検知するのは少し特殊で、ProcessDialogKeyをオーバーライドして使います。

まずは、ProcessDialogKeyをオーバーライドする記載方法です。

protected override bool ProcessDialogKey(Keys keyData)
{
    return base.ProcessDialogKey(keyData);
}

オーバーライドできましたので。続いては処理です。

引数keyDataから何を押されているかを取得します。

下記は例えで、左[←]を押されているかを確認する場合です。

//左キーが押されているか調べる
if((keyData & Keys.KeyCode) == Keys.Left)
{
    //←が押されている
}

この条件分岐を入れて、さらに先ほどの関数も追加しましょう。

protected override bool ProcessDialogKey(Keys keyData)
{
    //左キーが押されているか調べる
    if ((keyData & Keys.KeyCode) == Keys.Left)
    {
        Move_PictureBox(PicPlayer, new Point(-5, 0));
        return true;
    }

    //右キーが押されているか調べる
    if ((keyData & Keys.KeyCode) == Keys.Right)
    {
        Move_PictureBox(PicPlayer, new Point(5, 0));
        return true;
    }

    //上キーが押されているか調べる
    if ((keyData & Keys.KeyCode) == Keys.Up)
    {
        Move_PictureBox(PicPlayer, new Point(0, -5));
        return true;
    }

    //下キーが押されているか調べる
    if ((keyData & Keys.KeyCode) == Keys.Down)
    {
        Move_PictureBox(PicPlayer, new Point(0, 5));
        return true;
    }

    return base.ProcessDialogKey(keyData);
}

今回は、矢印方法に応じて、5ピクセルずつ移動するようにしました。

このままではマジックナンバーになってしまうので、移動量は定数として定義しましょう。

private const int MOVE_VALUE = 5;

先ほどの関数の『5』の部分は『MOVE_VALUE』に書き換えましょう。

不具合を修正しよう

今のままでは、起動時に矢印キーを押されると例外が発生します。

nullのPictureBoxのプロパティにアクセスしようとした為、例外が発生してしまいました。

そこで、Move_PictureBox()を修正しようと思います。

private void Move_PictureBox(PictureBox pic, Point pntValue)
{
    if (pic != null)
    {
        int x = pic.Location.X + pntValue.X;
        int y = pic.Location.Y + pntValue.Y;

        pic.Location = new Point(x, y);
    }
    return;
}

引数1のPictureBoxがnullかどうかの条件分岐を追加しました。

まとめ

無事に動作ができる事を確認☆★

キーボードの矢印キーを押す事でピクチャーボックスを移動させることが出来ました。

プロパティLocationをPoint型を代入する事で実現させることが出来ました。

またProcessDialogKeyをオーバーライドし、矢印キーの入力を検知する事も可能にっっ!!

しかし、今のままでは、フォーム内外自由に移動してしまいますwww

次回は、壁にぶつかったら、停止させるように考えていこうと思います。

コメント

タイトルとURLをコピーしました