首页 > 编程语言 >用C# + Winform 做一个简易的游戏设计器。

用C# + Winform 做一个简易的游戏设计器。

时间:2022-11-25 13:34:30浏览次数:48  
标签:游戏 C# 子类 List 简易 Unity 线程 ## Winform

--- title: c# GameDesigner2 description: published: true date: 2022-10-05T12:14:46.146Z tags: editor: markdown dateCreated: 2022-10-05T07:57:15.455Z --- # 地址 [GitHub地址:https://github.com/AlbertGarcia0219/GameDesigner2](https://github.com/AlbertGarcia0219/GameDesigner2) [Gitee地址:https://gitee.com/KiwiSenpaii/game-designer2](https://gitee.com/KiwiSenpaii/game-designer2) # 目的 我是前端菜鸟,尝试学习后端的继承,线程等思想。 # 设计 一个线程负责设计,一个线程负责模拟运行。 1. 模仿Unity游戏引擎,游戏引擎有两个生命周期钩子,`Start()`和`Update()`,其中`Start()`只在窗口打开时执行执行一次,`Update()`的执行次数要看CPU的能力了。根据`Unity.testFPS()`的测试,在没有线程休眠的情况下,极限是每秒58帧。 2. 尽量将逻辑分开,窗体逻辑作为主线程,接收键鼠事件。`GameMainThread`是游戏的线程,负责模拟游戏的运行。 3. `Form1`只负责窗体的逻辑,不负责游戏的逻辑,例如打开弹出框,选择材料等。`Unity`是游戏的引擎,把所有与游戏相关的逻辑放在`Unity`中,例如创建敌人,摧毁墙等。这样在Coding的时候逻辑更清晰,扩展性更好,利于代码维护。
# 代码 ## 继承 左侧是类,右侧是线程 ![](./img1.jpg) 游戏主要使用到的类 1. `GameObject`抽象类 > 坐标,宽高,图片,帧函数,碰撞算法,绘制自身 2. `Stationary` > 实现父类抽象方法`GetImg`,设置宽高,并无子类,图中子类不过是换了图片和游戏数据。 3. `Active` > 新增方向,速度,移动和碰撞检测函数 4. `Active`子类 > 重写父类帧函数,重写碰撞检测等等
## 游戏数据和List的关系 List存储了实际的游戏对象,用来遍历。 GameData是对游戏当前数据的映射,1是wall(墙),2是wall2(不可破坏的墙)等等,参考`Unity`的游戏设计模块。
**继承虽然可以很好地复用代码,但是同时会破坏封装。假设子类的某个函数使用到了父类的某个函数或者属性,一旦父类修改代码,子类几乎是必定要修改代码,破坏了封装反而会增加维护成本。最好的办法是用接口+组合** ## 碰撞检测 这次采用了比屏保泡泡更好的碰撞检测,用`Active`运动的下一帧的位置,也就是未来的位置来判断是否碰撞,省去了屏保泡泡碰撞之后将两个泡泡分开的步骤。 ## 游戏数据 用二维数组做一个映射,并不根据二维数组渲染页面,用List存储实际的对象。 ## MoveCheck 其实更应当作为一个抽象方法。 ## 线程锁 因为多线程会出现两个线程同时操作同一资源的情况,需要上锁。 # 补充 1. 不能在遍历的一个`List`的同时去删除`List`中的元素。 # 缺陷 1. 游戏声音无法重合,无论 new 多少个`SoundPlayer`都只能同时播放一个音频。 > 尝试使用多线程播放多个音频,失败。 2. 后期逻辑不清晰。Unity引擎同时负责了模拟游戏和设计游戏,耦合性太强,没有用泛型,复用性差。

标签:游戏,C#,子类,List,简易,Unity,线程,##,Winform
From: https://www.cnblogs.com/AlbertGarcia/p/16924833.html

相关文章

  • LeetCode 48.旋转图像(中等)
    题目描述:给定一个​​n × n​​​的二维矩阵 ​​matrix​​​表示一个图像。请你将图像顺时针旋转​​90​​度。你必须在原地旋转图像,这意味着你需要直接修改......
  • LeetCode 260.只出现一次的数字III(中等)
    题目描述:给定一个整数数组​​nums​​,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法......
  • elasticsearch 之 histogram 直方图聚合
    目录1.简介2.bucket_key如何计算3.有一组数据,如何确定是落入到那个桶中4、需求4.1准备mapping4.2准备数据5、histogram聚合操作5.1、根据response_time聚合,间隔为55.1......
  • LeetCode 476.数字的补数(简单)
    题目描述:给你一个正整数​​num​​,输出它的补数。补数是对该数的二进制表示取反。示例1:输入:num=5输出:2解释:5的二进制表示为101(没有前导零位),其补数为010。所以......
  • LeetCode 693.交替位二进制数(简单)
    题目描述:给定一个正整数,检查它的二进制表示是否总是0、1交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。示例1:输入:n=5输出:true解释:5的二进制表示是:101示......
  • LeetCode 268.丢失的数字(简单)
    题目描述:给定一个包含​​[0,n]​​​中​​n​​​个数的数组​​nums​​​,找出​​[0,n]​​这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间......
  • LeetCode 338.比特位计数(简单)
    题目描述:给你一个整数​​n​​​,对于​​0<=i<=n​​​中的每个​​i​​​,计算其二进制表示中​​1​​​的个数,返回一个长度为​​n+1​​​的数组​......
  • one preparation of algorithms in short text clustering
    文本聚类算法文本聚类一般步骤文本表示(TextRepresentation)把文档表示成聚类算法可以处理的形式。聚类算法选择或设计(ClusteringAlgorithms)算法的选择,往往伴随着相......
  • Tomcat常见问题总结,无法启动服务,无法访问,控制台乱码问题
    Tomcat无法启动,无法访问新下载的Tomcat,运行startup.bat后一闪而过,无法启动Tomcat服务。可能会有这样的效果可以在CMD窗口下进入Tomcat安装目录,运行startup可以看到报错......
  • UseIconfontInReact
    1.获取当前icon库2.全局文件index.html添加对iconfont的支持head标签中添加以下代码<scriptsrc="./iconfont.js"></script><style>.icon{......