using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Bitmap[] bmp = new Bitmap[2]; int screeen = 0; Timer t = new Timer(); PictureBox pictureBox; const int canvas_w = 640; const int canvas_h = 480; List moguras = new List(); double fps = 30.0d; private void Form1_Load(object sender, EventArgs e) { this.FormBorderStyle = FormBorderStyle.FixedToolWindow; this.ClientSize = new Size(canvas_w, canvas_h); bmp[0] = new Bitmap(canvas_w, canvas_h, PixelFormat.Format32bppArgb); bmp[1] = new Bitmap(canvas_w, canvas_h, PixelFormat.Format32bppArgb); t.Interval = (int)(1.0d / fps * 1000); t.Tick += new EventHandler(t_Tick); t.Enabled = true; pictureBox = new PictureBox(); pictureBox.Dock = DockStyle.Fill; pictureBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown); pictureBox.MouseUp += new MouseEventHandler(pictureBox_MouseUp); this.Controls.Add(pictureBox); Random rnd = new Random(); for (int i = 0; i < 5; i++) { Mogura m = new Mogura(rnd,fps); if (i % 2 == 0) { m.point = new Point(i * 128 + 14, 100); } else { m.point = new Point(i * 128 + 14, 300); } moguras.Add(m); } } Point mc; void pictureBox_MouseUp(object sender, MouseEventArgs e) { this.Text = Point.Empty.ToString(); mc = Point.Empty; } void pictureBox_MouseDown(object sender, MouseEventArgs e) { this.Text = e.Location.ToString(); mc = e.Location; } void t_Tick(object sender, EventArgs e) { using(Graphics g = Graphics.FromImage(bmp[screeen])) { g.SmoothingMode = SmoothingMode.AntiAlias; g.FillRectangle(Brushes.SaddleBrown, 0, 0, bmp[screeen].Width, bmp[screeen].Height); foreach (Mogura m in moguras) { //マウスクリックがあった場合の座標 //今のままだとタイミング的にたまーにヤバイかもしれない if(mc != Point.Empty ) m.HitTest(mc); m.Move(); m.Draw(g); } } pictureBox.Image = bmp[screeen]; screeen ^= 1; } } public class Mogura { public int mode = 0; public Point point = new Point(0, 0); int count = 100; Random _rnd; double _fps; public Mogura(Random rnd,double fps) { this._rnd = rnd; this._fps = fps; this.rndset1(); } public void HitTest(Point p) { //当たり判定の範囲をどうするか決めてくれ //このままだと1ドット単位での判定なので狭すぎる if (p == this.point) { if (this.mode == 1) { this.mode = 2; this.count = 5 * (int)this._fps; } } } public void Move() { if (this.count <= 0) { if (this.mode == 0) { this.mode = 1; this.rndset2(); } else if (this.mode == 1) { this.mode = 0; this.rndset1(); } else if (this.mode == 2) { this.mode = 0; this.rndset1(); } } this.count--; } private void rndset1() { this.count = this._rnd.Next(2, 5) * (int)this._fps; } private void rndset2() { this.count = this._rnd.Next(1, 2) * (int)this._fps; } public void Draw(Graphics g) { Matrix m = new Matrix(); m.Translate(this.point.X, this.point.Y); g.Transform = m; //mode = 0 引っ込んでる if (this.mode == 0) { g.FillPie(Brushes.Black, 0, 0, 100, 50, 0, 360); } //mode = 1 出てる else if (this.mode == 1) { g.FillPie(Brushes.Red, 0, 0, 100, 50, 180, 180); //もぐらっぽくなるように足してくれ g.FillPie(Brushes.Red, 0, 0, 100, 50, 0, 180); } //mode = 2 叩かれた else if (this.mode == 2) { //モグラを叩いたときの絵になるように足してくれ //g.FillPie(Brushes.Black, 0, 0, 100, 50, 180, 180); //g.FillPie(Brushes.Black, 0, 0, 100, 50, 0, 180); } //その他 バグ else { } m.Reset(); g.Transform = m; } } }