第二课的任务主要是培养编程思想。这是编程世界中最核心最有用东西。
和数学思想不一样,数学在逻辑思维上追求深度。而编程思想追求广度。
目光必须长远,代码必须优雅简单可行。
在编程的时候,就是在读自己代码的时候,你是参与者也是旁观者,代码质量的好坏决定这个项目的可持续性。所以我非常讨厌二次开发,改代码是最累人的活。
现在想不管什么编程语言,想练习抽象思维。
需求是:
设计LOL游戏
分析:
LOL的英固定雄基本的信息有天赋,被动技能,以及一张属性表。
这里属性表都是一个名字匹配一个数值(PS:非数值的可以用数值来代替,比如“郑仲”就可以用“2”号来替代)
而技能与天赋,这是用来影响英雄的东西,这是设计的难点,本质上来说这是一种无法交易的物品。因为都在物品栏或者技能栏中点击使用(或者被动),所以我们现在统称为“物品”。再看与它想关的数据,可能涉及到地图坐标,比如“眼”;可能涉及到英雄属性,比如“小红”;可能涉及到英雄的动作,比如“沙漏”。也就是说它能涉及到一场战役中的各种东西。所以,物品是不能用单纯的数据库存储的。而要用一个对应的代码块来代表这些奇异的功能。
暂时分析到这边,接下来讲一下游戏内部运作的方式
绝大部分游戏都有一个fps值(除了扫雷之类的没必要),而这又是联机游戏,也就是说帧数(fps)的走动和数据的改动是分开的,需要时间戳来校准同步。。
一场战役中游戏地图、英雄信息独立在内存中计时走动,而后调用显卡把数据给去取显示,几微秒后再显示一次,才有了动画。所以暂时不搞这显示问题。
而联机游戏中各个玩家的电脑中数据是相通的。唯一不同的是你有权限上传你英雄的数据。
所有人都是把数据发到服务器上再通过服务器统一收集再转发给所有人,这就叫**观察者模式(设计模式)**,这里面门道非常多,暂时不讲。
时间戳是非常重要的概念,所有电脑数据同步就是考这个时间戳来实现,ping也是通过这个来计算的。
就像你通过回声计算井有多深一样:发送一个带时间戳的数据到LOL服务器,服务器返回你发的数据,对比发送点的时间,就可以计算出延迟ping。
有了各个电脑上的延迟时间,才能实现补帧:比如我告诉你,
- 一秒前(2.0秒)吴明英开始笑了,那么补帧就是,我被笑声惊呆了,
- 虽然你没有“我被惊呆”这个数据(因为你延迟了一秒),但是你补帧了,因为理论上在0.5秒后我会被惊呆,而这时你自身的时间是(3.0),所以你补的是我惊呆后0.5秒的动作(PS:每个动作都是设计好的,都有一个时间长度,所以能计算这个时间点对应的样子)。
- 一秒后,“我被惊呆”这个数据从服务器发过来,没错,但依旧要进行校准,记住,每个数据都有时间戳,有了这个时间戳才能校准你的补帧。
- 因为你的补帧是:在2.5秒的时候“我被惊呆”,而正确的数据是2.6秒,很小的差距,可能是我突然后仰了拉开了和吴明英的差距,所以时间长了一点,
- 但是你没有收到“我后仰了”这个数据(2.1秒时),这就叫掉帧,所以你会发现突然卡了一下,因为动画要演绎这0.1秒的差异。
动画的数据又是依靠3D图形的触发:
比如说,和小兵对A,就开始执行打击动作:(英雄编号、动作-A、时间戳)
当你的到碰到小兵的身体时,触发扣血:(小兵编号、动作-属性血50
时间戳)
这里“碰到小兵的身体”的触发在图形编程中叫做“碰撞检测”。别看那是一把刀和一个怪,实际上就是一个长方体和另外多个长方体检测触碰,小兵的手、头、脚、身体都有相应的虚拟模型,这是用来计算的,都是长方体,这样计算会很简单。
登录Github,用Github进行回复,回复时注明想关的回复信息(哪个问题什么的)
- 简述德玛的Q的运作方式,影响到哪些数据,什么时候发送什么数据给服务器?
- (可选)技能=>发送数据给服务器,中间都要经过哪些数据处理(比如数据的格式处理(制作弹药)、获取服务器对象(指定目标)、获取发送器(炮筒))?具体的处理流程是什么?