1、@是转义字符
2、路径问题:(BackgroundImage要注意相对路径和绝对路径)
《1.》绝对路径
不用考虑其位置所在文件夹,只需要根据这个路径就能够直接找到目标
《2.》相对路径
以当前运行的文件为起始点,根据相对的路径去寻找目标,跳出使用“…/”,进入使用“文件夹名/”
eg:飞机打字游戏
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 飞机大战
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//飞机大战项目整体划分
/*1、界面UI(背景图、战机信息、游戏信息)
* 2、战机控制
* 3、战机生成器
* 4、游戏逻辑控制
* 5、首先打字游戏
* (1)设置背景
* (2)字母生成
* <1>每秒生成1.5个
*/
Panel YX = new Panel();//控件盒子的集合,游戏主页面
//随机字母,可以用数字转换成字母形式
Random sj = new Random();
//pictureBox装图片的盒子(装F飞机图片的盒子)
PictureBox tupianplsyer = new PictureBox();
private void Form1_Load(object sender, EventArgs e)
{
this.Size = new Size(1920, 1000);
this.BackColor = Color.Green;
//this.FormBorderStyle = FormBorderStyle.None;//去掉框架
//this.BackgroundImage = Image.FromFile(@"../../img/bg.jpg");
//FromFile()从指定的文件创建
//@转义字符
//路径问题:(BackgroundImage要注意相对路径和绝对路径)
//1.绝对路径
//不用考虑其位置所在文件夹,只需要根据这个路径就能够直接找到目标
//2.相对路径
//以当前运行的文件为起始点,根据相对的路径去寻找目标,跳出使用“../”,进入使用“文件夹名/”
//把页面放在最中间
this.Left = Screen.PrimaryScreen.Bounds.Width / 2 - this.Width / 2;
this.Top = Screen.PrimaryScreen.Bounds.Height / 2 - this.Height / 2;
//创建游戏区
//Panel YX = new Panel();
YX.Width = 1200;
YX.Height = 600;
//YX.BackgroundImage = Image.FromFile(@"../../img/bg.jpg");
YX.BackColor = Color.White;
YX.BackgroundImageLayout = ImageLayout.Stretch;//沿工作区拉伸
this.Controls.Add(YX);//表示获取包含在this当前所指的控件里,将add里的控件全部添加到this中的所有控件
//图片放进去后,让图片放在框架中间
YX.Location = new Point(40, 30);//表示图片显示的位置
//字母生成器(zimuTime名字),给这个字母生成器添加一个计时器事件
Timer zimuTime = new Timer();
zimuTime.Interval = 700;//调用的事件时间
zimuTime.Tick += ZimuTime_Tick;
zimuTime.Start();
//字体下落的计时器
Timer flyziti = new Timer();
flyziti.Interval = 10;
flyziti.Tick += Flyziti_Tick;
flyziti.Start();
//飞机图片
//飞机图片大小
tupianplsyer.Size= new Size(100, 100);
//飞机位置
tupianplsyer.Top = YX.Height - tupianplsyer.Height;//飞机图片的位置
tupianplsyer.Left = YX.Width / 2 - tupianplsyer.Width / 2;
tupianplsyer.Image = Image.FromFile(@"../../img/RP03.png");
tupianplsyer.SizeMode = PictureBoxSizeMode.StretchImage;//自适应图片大小
tupianplsyer.Tag = "feiji";
YX.Controls.Add(tupianplsyer);
//添加键盘事件
//Keydown和KeyPress区别
//Keydown一直按着会一直触发
//KeyPress点击一下出现一下
this.KeyPress += Form1_KeyPress;
}
//用计时器每700调用一次文字
private void ZimuTime_Tick(object sender, EventArgs e)
{
//生成字母,使用生成label字母
Label lazm = new Label();
lazm.Tag = "zm";
lazm.Text = ((char)sj.Next(97, 123)).ToString();//先强转为字符(字母),然后转成字符串,因为左右数据类型要一致,右面服从左面
lazm.Font = new Font("", sj.Next(20,39), FontStyle.Bold);
lazm.ForeColor = Color.FromArgb(sj.Next(226), sj.Next(226), sj.Next(226));
lazm.Top = 0;
lazm.Left = sj.Next(0, YX.Width - lazm.Width);//表示随机的位置,所以要把游戏主页面提到全局变量
lazm.AutoSize = true;///字体大小自适应
//有背景图片时,可以添加一个tarnsparent表示字体背景颜色透明/字体颜色透明色
lazm.BackColor = Color.Transparent;
YX.Controls.Add(lazm);//把所以显示字体添加/装在YX中,然后就显示
}
//字体下落
private void Flyziti_Tick(object sender, EventArgs e)
{
foreach (Control item in YX.Controls)
{
//飞机不下落的二种方法
/* //法一:
//用GetType获取当前实例类型,获取item这个里面,名字为Lable
//GetType每个属性都有
if (item.GetType().Name== "Label")//获取当前进入的类型
{
item.Top += 3;
}*/
//法二:
if (item.Tag.ToString()=="zm"||item.Tag.ToString()== "zmbiaoji")
{
//item里面的属性都因该有tag来判断,如果有一个没赋tag,会显示空指针错了,表示未将对象引用设置到对象的实例,eg:两个事物比较,先要他们比较类型一样,否则还没比较就报错,一个人和猴子比尾巴,还么开始比就错误了(不能保证每一个元素有Tag,才不会报错,先保证循环元素存在)
item.Top += 3;
if (item.Top>=YX.Height)//大于边界后就释放
{
item.Dispose();
//Dispose释放多余
}
}
//item.Top += 3;
//item的tag是zd则,这个item为子弹
if (item.Tag.ToString()=="zd")
{
item.Top -= 3;
if (item.Top<-item.Height)
{
item.Dispose();//大于边界后就释放
}
foreach (Control yigezd in YX.Controls)//循环便利每一个子弹,比较距离清除子弹和字母
{
if (yigezd.Tag.ToString()== "zmbiaoji")
{
if (item.Top<=yigezd.Top+yigezd.Height&&item.Left+item.Width/2==yigezd.Left+yigezd.Width/2)//表示字母和子弹在同一位置
{
item.Dispose();
yigezd.Dispose();
}
}
}
}
}
}
//按下对应的字母
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
//sender事件发起者
//e参数,代表指定的键/代表事件对象/代表第三方/事件触发对象(谁触发代表谁)
// e.KeyChar//设置或获取与按下键对应的字符
//因为是多个键,所以循环便利
foreach (Control item in YX.Controls)
{
if (item.Text==e.KeyChar.ToString()&&item.Tag.ToString()=="zm")//item.Tag.ToString()=="zm"字母时对应产生一个子弹,不会同时产生多个
{
item.Tag = "zmbiaoji";//该标记,就不会产生多余子弹
tupianplsyer.Left = item.Left + item.Width / 2 - tupianplsyer.Width / 2;
//同样的中轴线,字母的距离left的距离加上,字母宽的一半,减上飞机图片的一半就是,飞机left的距离
//创建子弹
PictureBox zidan = new PictureBox();
zidan.Tag = "zd";
zidan.Size = new Size(8, 18);
zidan.SizeMode = PictureBoxSizeMode.StretchImage;
zidan.Image = Image.FromFile(@"../../img/Ammo1.png");
zidan.Left = tupianplsyer.Left + tupianplsyer.Width / 2 - zidan.Width / 2;
zidan.Top = tupianplsyer.Top -zidan.Height;
YX.Controls.Add(zidan);
//跳出当前事件
return;//跳出整个事件,如果给return下面写则全部跳出//判断只出现一个
}
}
}
}
}