奋斗一个多月终于把坦克大战写出来了,看了韩老师的思路然后自己手打,自己做不出来就看视频然后再写,总结收获和难点突破点如下:
1. 抽象类意识
刚开始没有将 Hero 和 Enemy 抽象出顶级父类 Tank,看了韩老师的视频,我直接把两者所有共同点全部抽了出来,包括发射speed、isLive、shot、和 shots 数组,将发射子弹的操作单独提出来放在 Tank 父类里,方便同一调配。
2. 线程意识
在学习键盘响应事件后学会用 WASD 来控制 Hero 的移动,意识到了要将 EnemyTank 做成线程类,才能让他自己移动,但是不知道在 run 方法中如何编写逻辑让 EnemyTank 的移动有规律,后来看视频才发现要用 sleep 来控制移动的频率,否则移动太快看不清移动轨迹。包括 Shot 类也是,必须做成线程类才能让他动态的改变 x y 轴。
3. 线程同步意识
不管是 EnemyTank 还是 Shot ,都将他们放在 Vector 数值里统一调配,保证了线程同步,同时也方便对象的存取。
4. 类内部属性和外部相互影响
Boom 类中不光存储有 x 和 y 轴相关的信息,还有生命周期属性 life,专门用来控制图片的播放周期,通过操作 life 的值来确定该在什么时候播放那张图片,从而实现视频效果,原来不光可以通过外部来操作类内部的属性,类内部的属性同样也可以相互影响外部操作。
5. 空间图形意识
判断两个坦克是否重叠,8个状态直接烧脑,根据坦克的行进方向和来判断4个边共8个点,将 this 的 x 和 y 分别做出限制,而 enemy 又有上下和左右两种状态,光判断的 if 语句就写了16个,这是最难的部分,我单独写了2天都没写出来,只是模糊的感觉到和方向有关很复杂,不知道什么方向该判断那条边,直到现在都有点蒙的,不过好歹学会了判断两个矩形是否重叠的方法
6. IO 流存储数据意识
有了存储数据的意识,将数据对象打包成 Node 结点放到 Vector 数据里,闲时便存,将对象数据转成 Node ,用时便取,将 Node 又转成新的对象赋值过去。
总结:收获很大,反复刷了有三四遍,几乎把前面学习到的知识全部串联起来了,学不烦看不厌,独此一家了。