一、设计如下界面
按钮上面是一个pictureBox,默认设置。没有枪和子弹
二、创建类数据成员
Point p1;//子弹的实时位置
Point rePt;//子弹的初始位置
Bitmap mybmp;//引入图片
Bitmap oldbmp;//保留初始图片
System.Timers.Timer t200ms = new System.Timers.Timer(200);
delegate void t200msDo(); //定义一个委托
三、完成图片初始化加载和定时器初始化
在pictureBox上面绘制和在pictureBox.Image上面绘制个人觉得主要区别是后者可以方便的切换,保存,背景融合等。
public Form1()
{
InitializeComponent();
Image myimg = new Bitmap("shot2.png");
mybmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
pictureBox1.Image = mybmp;
var g = Graphics.FromImage(pictureBox1.Image);
var brush = new SolidBrush(Color.White);
g.FillRectangle(brush, 0, 0, pictureBox1.Width, pictureBox1.Height);
g.DrawImage(myimg, 0, (pictureBox1.Height - myimg.Height) / 2);
oldbmp = (Bitmap)pictureBox1.Image.Clone();
p1.X = myimg.Width+50;
p1.Y = (pictureBox1.Height - myimg.Height) / 2+20;
rePt = p1;
t200ms.Elapsed += new System.Timers.ElapsedEventHandler(t200msOut);
t200ms.AutoReset = false;
t200ms.Enabled = false;
}
四、定时器响应和委托函数
主要进行子弹绘制和擦除。
public void t200msOut(object source, System.Timers.ElapsedEventArgs e)
{
Invoke(new t200msDo(t200msInvoke));
}
void t200msInvoke()
{
var g = Graphics.FromImage(pictureBox1.Image);
g.DrawImage(oldbmp,0,0);
//MessageBox.Show("1");
if (p1.X<pictureBox1.Width)
{
p1.X += 10;
var brush = new SolidBrush(Color.Black);
g.FillEllipse(brush, p1.X, p1.Y, 20, 20);
t200ms.Start();
}
pictureBox1.Refresh();
g.Dispose();
}
五、按钮响应函数
该函数用于启动定时器,并完成子弹复位。
private void Button1_Click(object sender, EventArgs e)
{
p1 = rePt;
t200ms.Start();
}
|