稍微数了一下,要完整完成一个游戏其实要做的有很多。这篇依然是补完一个游戏
TL;DR
- 启动页面、得分牌
- 加入简单的 AI
完成情况
这把已经像一个游戏了。所以,可以一起玩吧
以下是记录本次更新一部分内容
UI
目前是加了一个标题场景,但是过于没东西讲。老前端熟悉的 flex
布局思路一通搞完事
切换场景
游戏是按场景(scene)来区分页面(非常前端的描述),比如关卡类游戏一般会做很多 level 的场景。不同的是这可没有所谓的路由,而是直接切换(change)
这里使用的是:获取场景树,得到实例,切换场景(change_scene)
get_tree()->change_scene(path);
这个项目里的实现是:把这种按钮直接做成「组件」,暴露场景接口。在标题场景 connect
所有这个类型的事件,用统一事件处理跳转。这样就封装了跳转场景,方便以后处理设置界面啥的
记分牌动画
有一个控件 AnimationPlayer
,用来控制能访问到的节点的动画,例如运动、变形。如果使用过 flash
那是相当熟悉 —— 关键帧打起来
加入 AI
周伯通虽然也行,但是自己玩还是得有个「对手」
现在看到 AI 人就不知觉紧张起来,感觉是个非常难的东西。其实 AI 就只是「人工智能」,其目的就是「假装是个人」,那游戏 AI 就是「假装有个陪你打游戏的人」。只不过现在的「机器学习」确实给游戏 AI 也带来了不少想象力 —— 他们的操作越来越像人的思维方式了
多智能还得看开发者。例如中小学机器人编程比赛中的经典项目足球项目和灭火项目,
足球项目:最简单的逻辑就是通过传感器(指南针)判断两边方向,超声波测距,忘记什么传感器用来找球。摸到球之后直接把球往对方门里「撞」,完事。
灭火项目:都带着指南针和热力传感,主要还是看谁的寻路比较nb
游戏 AI 很早就有,最经典的游戏 AI 还属南梦宫的吃豆人(pacman)[1](对于我来说一样属于游戏设计必修课,甚至机器学习也可以)。
一共四个干扰怪物,逻辑都不相同
红色 blinky:追着豆子,通过寻路算法找距离最近的路线
粉色 pinky:追豆子前方第四个格子,通过寻路算法找距离最近的路线。如果向上移动,则是左上方四个格子
青色 lnky:blinky 与豆子各自前方射线的交点,并两倍延长的点
橙色 clyde:追豆子到方圆 8 格内就会散开(纯气氛组)四个单个逻辑不复杂且工作量很小的 AI,组合成一个看似一直在围堵玩家的敌方小队。这就是最经典的地方
这篇文章再开个坑:我要写一篇我对游戏 AI 的理解。例如游戏设计中,一些非常难的 gameplay 可能会设计出让 AI 「放水」,让玩家以为 AI 真的翻车了,以此来鼓励玩家
好了,这一部分的重点本应该是这个游戏的 AI,目前的设计是: 在自己的 y 与球的 y 距离大于 25 时,追球。25 差不多是板子的 1/4。 逻辑就这,没了
但别小看这简单的逻辑,在目前没有什么骚东西的环境下,只要没有什么花里胡哨的操作(例如拿板边去敲球)几乎没有胜利的机会。而现在这个环境玩骚的只会把自己的分骚没(比如我)
冷却与重置
当球落某方门后,球会重置到游戏中点,没有操作,直接关闭了惯性和直接 set position
不过有一个小设计:败方接球。如果某方上一回合输了,这一回合由该方接首发球
所以,虽然是可以玩了,但是还是缺东西,比如很多关于游戏规则的完善
下一步
- 发球 y 随机:目前发球的 y 是固定的,直接去接球点等球多没意思啊
- 随机首发球:第一球现在都发给左方,或许应该随机
- 胜利规则:现在这游戏一开就没边了…
- 暂停与结束界面
- 声音
游戏补完之后,往后的更新就越来越慢了,因为想法越骚,实现也会越来越难