C#のWinFormsでワールド変換で図形を回転5「カーソルキーで図形を移動する2」

コンピュータ

カーソルキーの左右で旋回し、上で前進、下で後退するようにしてみました。

ソースコード

using System.Drawing.Drawing2D;

namespace Kaiten02;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.ClientSize = new Size(640, 480);
        this.KeyPreview = true;

        Bitmap bmp1 = new (64, 64);
        using(Graphics bmp_g = Graphics.FromImage(bmp1))
        {
            // 矢印
            PointF[] points = [
                new PointF(bmp1.Width/2, 0),
                new PointF(bmp1.Width-1, bmp1.Height-1),
                new PointF(bmp1.Width/2, bmp1.Height*2/3),
                new PointF(0, bmp1.Height-1),
                new PointF(bmp1.Width/2, 0),
            ];
            // 三角
            PointF[] points2 = [
                new PointF(0, 0),
                new PointF(8, 0),
                new PointF(0, 8),
                new PointF(0, 0),
            ];

            bmp_g.FillPolygon(Brushes.White, points); // 塗潰し
            bmp_g.DrawLines(Pens.Black, points); // 縁取り
            bmp_g.FillPolygon(Brushes.Pink, points2); // 中心
        }
        PictureBox picbox = new()
        {
            BackColor = Color.Navy,
            Parent = this,
            Size = new Size(640, 480),
        };

        float r = 0;
        float x = 0;
        float y = 0;
        float ud = 0;

        picbox.Paint += (s, e) =>
        {
            var g = e.Graphics;

            g.ResetTransform();

            // 中心へ移動
            g.TranslateTransform(picbox.Width/2-bmp1.Width/2+x, picbox.Height/2-bmp1.Height/2+y);

            // 回転
            g.TranslateTransform(bmp1.Width/2, bmp1.Height/2);

            g.RotateTransform(r);

            g.TranslateTransform(-bmp1.Width/2, -(bmp1.Height/2));

            // 上下移動
            g.TranslateTransform(0, ud);
            ud = 0;

            PointF[] points3 = [new PointF(bmp1.Width/2, bmp1.Height/2)];
            g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, points3); 
            x = points3[0].X - (picbox.Width/2);
            y = points3[0].Y - (picbox.Height/2);
            //Console.WriteLine("x:{0} y:{1}", (int)x , (int)y);

            // 描画
            g.DrawImage(bmp1, 0, 0);
        };
        this.KeyDown += (s, e) =>
        {
            if (e.KeyCode == Keys.Left)
            {
                // 左
                if (--r < 0) r = 359;
                picbox.Invalidate();
            }
            else if (e.KeyCode == Keys.Right)
            {
                // 右
                if (++r > 359) r = 0;
                picbox.Invalidate();
            }
            else if (e.KeyCode == Keys.Up)
            {
                // 上
                ud = -8;
                picbox.Invalidate();
            }
            else if (e.KeyCode == Keys.Down)
            {
                // 下
                ud = +8;
                picbox.Invalidate();
            }
        };
    }
}

TransformPoints()を使い図形の中心がワールド変換を行うことでPictureBoxの中心からどれだけ移動したか算出しています。

コメント