• C# --- 坦克大战开发 --- 绘制游戏界面


    1.designer 文件中的这两行代码分别管理我们界面的宽高和界面的名称


     2.游戏是动态变化的,哪怕我们不给这个游戏任何输入它里面的某些游戏对象如敌人也会根据自己的逻辑自发的行动

    也就是说我们需要一个程序在运行时无论我们是否有输入都一直在执行的方法 --- 这个方法就是用来执行我们的游戏逻辑的

    比如说我们需要一个不停执行的方法来刷新我们的屏幕实现画面的更新,监视鼠标的点击

    如果说没有一个一直执行的方法,而只是执行一次命令的话,就会导致游戏全程画面只刷新了一次,或者说游戏全程只接收了一次鼠标点击

    如果有一个不停执行的方法,画面就可以以每秒多少次的速度不停刷新,然后我们也可以以每秒多少次的速度不停的获取鼠标点击状态

    再比如我们的游戏逻辑是获取输入参数,刷新画面 ---> 如果这个逻辑只执行一次,那么玩家就只能看到两张画面(一开始的一张和刷新后的一张),这显然是不行的。但是如果我们不停的循环执行这个逻辑,那么计算机就能够以每秒多少次的速度获取输入参数,试时刷新画面

    3.并且一个游戏是由多个逻辑循环组合而成的(玩家的操作检测逻辑循环,敌人的AI逻辑循环,画面的刷新逻辑循环,动画效果的播放逻辑循环,碰撞判定....等等),为了在一个程序中实现多个逻辑循环,我们就需要使用到线程

    如果不使用线程而只在主线程中实现这么多逻辑循环的话就会导致阻塞现象的出现

    原因是:在一个线程中代码是按照由上往下的顺序执行的,执行到循环的时候就会在循环执行完后再往下执行,此时如果我们需要同时执行另一个循环的话是不可能的,也就是说我们无法再刷新画面的同时检测玩家的移动,这就会导致游戏逻辑的缺失,为了实现游戏逻辑的并发性,我们需要通过线程来执行不同的逻辑,使其并发运行

    游戏是一个庞大的逻辑并发体,什么叫逻辑并发呢?比如我们可以在游戏中边战斗边跑步,这就是游戏的战斗逻辑和奔跑逻辑并发运行才能实现的功能,类似的并发还有很多,所以为了实现并发,线程对于游戏开发来说是不可或缺的,游戏本身就是一个庞大的多线程项目

    可以参考氰化物欢乐秀里的时停上帝,在时间停止世界里的那个人就是一个CPU,尽管他一次只能做一件事,但是只要他切换的速度足够快,他就能让所有事看起来像同时发生的一样,于是他成为了上帝,让一个静止的世界动了起来

    时停上帝

    而我们开发游戏,其实就是成为操控上帝的人,我们为上帝开辟环境,创建好一个静态世界,然后再给上帝安排好工作(线程),然后上帝就会用快到让我们以外这些工作被同时进行的速度去完成这些工作,进而使得这个世界活了起来(比如在我们看这篇文章的同时,有人就在街头外解放自我,当世界拥有了并发性,这个世界就活了起来)

    每创造一个游戏就是在电脑中创造了一个静态的世界,CPU就是游戏世界里的上帝,上帝可以让它处理的所有工作同时进行,使得这个静态的世界动起来,而我们就是给上帝安排工作的人


    4.winform窗口的调用逻辑:

    1.首先一旦创建线程后,线程就会自动执行放到它里面的方法

    2.根据这一点,我们只需要在窗口类的构造函数中创建线程,然后在窗口类中创建静态方法并放到线程中,这样的话当我们在主函数中创建一个窗口类时,其构造函数被调用,线程被创建,线程中的方法被执行,然后所有子线程和主线程执行完毕后,程序结束。


    5.线程相关点:

    1.在一个线程中我们也可以创建另一个线程,这两个线程之间的地位是等价的!!

    2.在编译器中的时间单位都是毫秒!!

    3.关于线程的休眠方法:Thread.Sleep(int time)--- 这个休眠方法的运行逻辑是让线程在这行代码处停留time毫秒时间,然后再继续执行线程中的代码 --- 整体就是 : 执行 --- 暂停 --- 继续执行

    4.当停留时间为 1000/60 毫秒 (相当于1/60秒)时,我们就称之为60帧刷新,为什么可以这么称呼呢 --- 你想想停留1/60秒,然后执行花费几毫秒,然后再停留1/60秒,然后再执行几毫秒;在这个过程中几毫秒和1/60秒相比是可以忽略的,于是我们可以近似的看作每1/60秒执行一次,那一秒就60次 -- 就是60帧了,实际上是1.000x/60秒执行一次,但可以近似看作1/60秒

    5.这个就是在线程中实现每循环一次就停留一会儿的方法 --- 直接用Sleep方法让线程在sleep代码处暂停一会,然后再继续执行代码(执行循环)

     6.如何实现窗口被关闭的时候,循环线程别结束呢? --- 在窗口属性哪里点击FromClosed事件,并创建事件方法来实现关闭


    7.绘制地图:

    1.创建画布

    2.在对应的逻辑下操作画布

     

  • 相关阅读:
    Oracle 迁移至Mysql
    电磁仿真设计RMxprt-6p72s电励磁凸极同步电机分析案例
    gitlab利用CI多工程持续构建
    B. Sets and Union
    测试记录-验证码测试
    Cell:代谢组学肠道微生物群介导生酮饮食的抗癫痫作用
    SpringCloud:网关gateway
    自定义类型:结构体,声明,变量初始化,结构体内存对齐。
    Docker swarm 集群搭建
    java毕业设计电影推荐系统Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/qq_51947882/article/details/126417234