ゲームで時間を計測するときやスコアを表示するとき数字をデジタルっぽく表示させるライブラリをつくりました。
DigitalWatch6クラスの「6」は6桁で表示するという意味です。
6桁といっているのにピクチャーボックスが8個あります。これは時間を「XX:XX:XX」と表示させるためです。コロン2個分多くつくっているわけです。
それからpng形式でデジタルっぽい数字もつくります。
最初にユーザーコントロールの上にピクチャーボックスを配置して、その位置を記憶させます。それからユーザーコントロールのサイズも記憶させます。ユーザーコントロールのサイズが変更されたときに元のサイズと比較してどれくらい拡大または縮小されたかを調べます。これがわかればピクチャーボックスの位置とサイズもわかります。
時刻を表示させるときはSetTime(TimeSpan ts)メソッドとSetTime(int first, int second, int third, int fourth, int fifth, int sixth)メソッドでどの桁にどの数字が入るか調べて、事前にBitmapsに取得しておいたBitmapをセットします。自然数nを表示させたければBitmaps[n]を使えばよいということになります。
これを単純なクリックゲームをつくるに表示させてみるとどれくらい時間がかかるのか知ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
namespace DigitalWatchLib { public partial class DigitalWatch6 : UserControl { List<PictureBox> PictureBoxes = new List<PictureBox>(); List<Bitmap> Bitmaps = new List<Bitmap>(); Bitmap colonBitmap = null; // 最初のピクチャーボックスの位置 List<Point> InitLocations = new List<Point>(); // 最初のピクチャーボックスのサイズ List<Size> InitSizes = new List<Size>(); Size InitControlSize = Size.Empty; public DigitalWatch6() { InitializeComponent(); CreateBitmapList(); colonBitmap = Properties.Resources.colon; CreatePictureBoxList(); // ピクチャーボックスの境界線を消す foreach (PictureBox pictureBox in PictureBoxes) pictureBox.BorderStyle = BorderStyle.None; // ピクチャーボックスの位置を保存しておく foreach (PictureBox pictureBox in PictureBoxes) InitLocations.Add(pictureBox.Location); // ピクチャーボックスのサイズを保存しておく foreach (PictureBox pictureBox in PictureBoxes) InitSizes.Add(pictureBox.Size); // ユーザーコントロールのサイズを保存しておく InitControlSize = this.Size; // ユーザーコントロールの背景色をBitmapの背景と同じにする BackColor = Color.Black; } void CreatePictureBoxList() { PictureBoxes.Add(pictureBox1); PictureBoxes.Add(pictureBox2); PictureBoxes.Add(pictureBox3); PictureBoxes.Add(pictureBox4); PictureBoxes.Add(pictureBox5); PictureBoxes.Add(pictureBox6); PictureBoxes.Add(pictureBoxColon1); PictureBoxes.Add(pictureBoxColon2); } void CreateBitmapList() { Bitmaps.Add(Properties.Resources.number0); Bitmaps.Add(Properties.Resources.number1); Bitmaps.Add(Properties.Resources.number2); Bitmaps.Add(Properties.Resources.number3); Bitmaps.Add(Properties.Resources.number4); Bitmaps.Add(Properties.Resources.number5); Bitmaps.Add(Properties.Resources.number6); Bitmaps.Add(Properties.Resources.number7); Bitmaps.Add(Properties.Resources.number8); Bitmaps.Add(Properties.Resources.number9); } private void UserControl1_Load(object sender, EventArgs e) { pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox4.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox5.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox6.SizeMode = PictureBoxSizeMode.StretchImage; pictureBoxColon1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBoxColon2.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.Image = Bitmaps[0]; pictureBox2.Image = Bitmaps[0]; pictureBox3.Image = Bitmaps[0]; pictureBox4.Image = Bitmaps[0]; pictureBox5.Image = Bitmaps[0]; pictureBox6.Image = Bitmaps[0]; pictureBoxColon1.Image = colonBitmap; pictureBoxColon2.Image = colonBitmap; } protected override void OnResize(EventArgs e) { // ユーザーコントロールがどれくらい拡大縮小したか調べる int width = this.Size.Width; int height = this.Size.Height; int initWidth = InitControlSize.Width; int initHeight = InitControlSize.Height; double widthExtend = 1d * width / initWidth; double heightExtend = 1d * height / initHeight; for (int i = 0; i < PictureBoxes.Count; i++) { Size size = InitSizes[i]; Point point = InitLocations[i]; PictureBoxes[i].Size = new Size((int)(size.Width * widthExtend), (int)(size.Height * heightExtend)); PictureBoxes[i].Location = new Point((int)(point.X * widthExtend), (int)(point.Y * heightExtend)); } base.OnResize(e); } void SetTime(int first, int second, int third, int fourth, int fifth, int sixth) { pictureBox1.Image = Bitmaps[first]; pictureBox2.Image = Bitmaps[second]; pictureBox3.Image = Bitmaps[third]; pictureBox4.Image = Bitmaps[fourth]; pictureBox5.Image = Bitmaps[fifth]; pictureBox6.Image = Bitmaps[sixth]; } public void SetTime(TimeSpan ts) { int first = ts.Minutes / 10; int second = ts.Minutes % 10; int third = ts.Seconds / 10; int fourth = ts.Seconds % 10; int fifth = ts.Milliseconds / 100; int sixth = ts.Milliseconds / 10 % 10; SetTime(first, second, third, fourth, fifth, sixth); } } } |
これを単純なクリックゲームをつくるに表示させてみましょう。
できあがったdllを参照に追加。そして
1 2 3 4 5 6 |
using DigitalWatchLib; class DigitalWatchEx : DigitalWatch6 { // 中身は空でよい } |
とやればツールボックスからドラッグアンドドロップでフォームに追加することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
public partial class Form1 : Form { List<Label> Labels = new List<Label>(); Timer Timer = new Timer(); public Form1() { InitializeComponent(); InitLabels(); Timer.Interval = 10; Timer.Tick += Timer_Tick; BackColor = Color.White; } DateTime StartTime = DateTime.Now; void GameStart() { List<int> vs = CreateRandomNumber(); SetRandomNumber(vs); RandomNumbers = vs; LastClickedNumber = 0; // スタート時刻を記憶しておく StartTime = DateTime.Now; Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { // 現在時刻とゲーム開始時刻との差を計算してデジタル時計に表示する DateTime now = DateTime.Now; TimeSpan ts = now - StartTime; digitalWatchEx1.SetTime(ts); } bool IsCleared = false; void OnGameClear() { // ゲームクリアしたら時計を止める Timer.Stop(); IsCleared = true; Text = "ゲームクリア!"; MessageBox.Show("ゲームクリア!"); } } |