稍微数了一下,要完整完成一个游戏其实要做的有很多。这篇依然是补完一个游戏

项目 体验地址项目地址

TL;DR

  • 启动页面、得分牌
  • 加入简单的 AI

完成情况

这把已经像一个游戏了。所以,可以一起玩吧

以下是记录本次更新一部分内容

UI

目前是加了一个标题场景,但是过于没东西讲。老前端熟悉的 flex 布局思路一通搞完事

切换场景

游戏是按场景(scene)来区分页面(非常前端的描述),比如关卡类游戏一般会做很多 level 的场景。不同的是这可没有所谓的路由,而是直接切换(change)

这里使用的是:获取场景树,得到实例,切换场景(change_scene)

1
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 是固定的,直接去接球点等球多没意思啊
  • 随机首发球:第一球现在都发给左方,或许应该随机
  • 胜利规则:现在这游戏一开就没边了…
  • 暂停与结束界面
  • 声音

游戏补完之后,往后的更新就越来越慢了,因为想法越骚,实现也会越来越难


  1. 现代游戏AI的鼻祖——聊聊你所不知道的《吃豆人》 ↩︎