カーソルキーの左右で旋回し、上で前進、下で後退するようにしてみました。
ソースコード
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の中心からどれだけ移動したか算出しています。
コメント