添加游戏对象管理类
1、公共的创建初始化地图(静态方法)
2、私有的创建墙的方法(静态)
传入坐标、图片
不可以动物体类
1、创建一个构造方法,需要传入坐标、图片
添加游戏对象管理类
1、公共的创建初始化地图(静态方法)
2、私有的创建墙的方法(静态)
传入坐标、图片
不可以动物体类
1、创建一个构造方法,需要传入坐标、图片
创建基本的GameObject类(声明为一个抽象类)
坐标:构造函数变量X和Y
保护方法、abstract:绘制图片(必须重写,因为静态物体是一张图,动态物体是好几张图)
{
创建绘制方法(绘制自己)
获得GameFrame的图像类
绘制图像,并传入坐标
}
无法移动物体类,继承GO
构造函数图片变量
重写获得图片的方法,返回图片
右键点击(实现类)
可移动物体类,继承GO
枚举:上下左右
构造函数上下左右图片变量
构造函数变量速度
构造函数方向变量
重写获得图片方法,使用switch case的方法(上下左右),返回(上下左右)的四张图
透明图片的处理方法
将bitmap作为对象,默认null
switch case
break
将黑色背景变为透明
返回bitmap即可
创建我坦克、敌坦克、子弹类,继承可移动物体类
物体:坐标
不可移动物体:Image(有无)
可移动物体:Bitmap多图片状态(上下左右方向)
我的坦克:人控制
敌人坦克:AI控制
子弹:AI控制
Image不透明
Bitmap可以设置透明度
应用是不操作不进行
游戏是一直持续进行
游戏需要每秒持续循环执行
通过一个线程实现持续,不能放在Main函数内,否则会阻塞其他游戏逻辑
1、在Form1内创建一个线程,用于调用每一个tick的运行
2、在Form1内创建静态方法,通过类名就可以调用无需实例化,通过新线程启动起来
3、新建一个游戏框架类
4、框架内增加一个Start方法,创建一个Update方法
5、静态方法内,调用Start方法
6、创建While死循环,持续调用Update方法
7、创建变量,用于睡眠时间(每秒60帧)
8、死循环内增加一个睡眠时间,实现每秒60帧
9、但是,考虑updata本身有运行时间,真实情况下会让每秒低于60帧
10、关闭窗口,不会关系子线程,所以需要手动关闭子线程
11、找到Form1的窗体关闭事件FormClosed
12、把新创建的线程提出成为成员变量private Thread t;
13、在窗口关闭的方法里,使用Abort强制关闭线程
将项目设置为启动项目
Form1.Designer.cs
展开“Windows 窗体设计器生成的代码”
设置窗体的大小
设置窗体的名称
单个砖块30*30
小砖块15*15
画面450*450
绘制图片
将图片导入项目
放到Resources.cesx
f放在了Resources文件夹内
Resource类,把所有资源放在了静态资源(加载静态资源)
如果需要引用这些资源,需要加入Resources的命名空间
使用资源
Resources.Boss //类型是bitmap,或是Image
Image image = Properties.Resources.Boss
g.DrawImage 方法
收缩代码(灰色字体表示)
#region 说明文字
#endregion
使用Image来接收资源
也可以使用Bitmap(继承自Image)可以使用另外一些功能:例如制定尺寸,让某个颜色变成透明)
MakeTransparent(某个颜色)
不能在构造函数内进行绘制(因为当前窗体正在创建,绘制就无效了)
绘制窗体-属性-事件
Paint(重新绘制时)刷新内容时,新建时
双击Paint,撰写方法
创建画布
Graphics g = this.CreateGraphics();
创建一个颜色
Color c; //这是一个结构体
创建一个画笔
Pen p = new Pen(Color.Black);
调用draw方法
g.DrawLine() 有多个重载的方法
创建一条线
创建一个字符串
跳转到定义F12或Ctrl+点击
恢复跳转Ctrl+"-"(跳转到上一个光标位置)
设置默认创建的位置
在Form的构造函数内添加 this.StartPosition = FormStartPosition.CenterScreen;
CenterParent //父窗体内部的居中
Manual //自定义位置
this.Location = new Point(2000.500);
左上角为零零点,双屏的合起来计算
图形设备接口GDI
Properties
工具栏,拖入UI控件
Form1.Designer.cs 中出现对应的初始化控件代码(构造函数中显示初始化方法)
收缩某段代码(灰色字体)
业务(事件)代码,放在Form1.cs中
双击按钮进入某个按钮的方法内,撰写相应的功能
自行创建一个窗口类,继承自Form
生成一个窗口:
Application.Run(new MyForm());
WinForm
创建windows应用的类集合,不用深究(使用率少)
新建项目:窗体应用(.NET framwork)
使用最新框架4.7.2
“引用”(类集合)
App.config(项目设置)
Program.cs
Form1.cs (窗体设计)
public partial class Form1
Form1.Designer.cs
partial class Form1
Form1.resx(放置窗体内的文字)
partial 把一个类放到两个文件里去定义,让功能分开管理(实际上同一个类)
主线程和子线程不应该使用同一个资源,例如Console.WriteLine();
CPU交替执行多个任务,但人类看起来像是同时执行多个任务
Thread.Sleep
控制关闭线程:
1、myChileThread.Abort(); 强制关闭某个线程
2、添加一个isRun用来维持线程的运行(更推荐)
多线程
主线程
Main方法:主线程
alt + enter 打开命名空间
Thread
Thread myT = Thread.CurrentThread 获取当前的线程
myT.Name = "自定义线程名字";
主线程Main
子线程
开启新线程
1、类里面创建一个用于子线程的方法
2、创建一个委托(把一个方法当成数据传递过来)
ThreadStart start = new ThreadStart(子线程的方法); //新建一个线程运行这个方法
3、创建一个线程,运行委托的方法
Thread childThread = new Thread(start);
4、启动线程内的方法
childThread.Start();
步骤2、步骤3可以简写:
Thread childThread = new Thread(new ThreadStart(ChildThreadMethod));
线程的执行顺序,两个线程的执行情况不互通,所以会产生某些线程执行完成时间有先后出入的情况。
多个线程同时执行,执行快慢不确定,所以先后顺序不确定
线程不会自动启动:创建 Thread
对象后必须显式调用 Start()
方法
主线程是自动创建的:当程序启动时,操作系统会自动创建主线程并执行 Main()
方法
没有委托层:主线程直接执行入口方法,不需要任何委托包装
自动类型转换(隐式转换)
1、从大类型到小类型可以自动转(反过来则不行)
强制类型转换(显式转换),可能会丢失数据
(int)
用父类型的方式来声明一个子类型的实例(大的装小的)
Father f = new Son();
自动转换,将son的类型转换成了father
强制类型转换:
Son s = (son)f; //前提条件:必须首先是一个Son()的对象
也可以使用这样的写法:
Son s = f as Son; //如果转换不成功会返回null
alt + enter 显示VS的修复错误
委托是什么?
1、visual studio 2019使用alt+enter可以提供多种修改方案
指定图片一种颜色透明:
名字.MakeTransparent(Color.要透明的颜色)
线程中断:
childThread.Abort(); //childThread是随机命名的
线程:
Thread t = Thread.CurrentThread;
e
你去看看教职工食堂有什么