Scratch也能玩体感游戏
上一次我们利用图像分类技术,让机器学会了识别石头剪刀布(如果没明白说啥请看上一帖)等三种手势,如果大家有试验的话,可能会发现识别率并不是太高,会有误判,问题主要在于我们给机器训练的数据量还是太少,不能完全覆盖三种手势的所有类型,如果数据量足够大,识别率会有明显提高的,机器也需要一场“题海战”啊。
在上周笔者参加了杭州市青少年科技节的闭幕式,看到小学生们用Switch玩体感游戏,玩的不亦乐乎。我就想能用人工智能插件实现体感玩法么?人工智能插件中有一个类型叫姿态分析似乎可以识别面部的关键点及人体的关键点,那么利用这个姿态分析插件中的关键点位置坐标,可以帮助我们实现用身体的某个部分控制游戏角色移动么?
带着以上问题,笔者开始了改造之旅,因为是初试身手,所以笔者希望选择动作相对简单的游戏。最后笔者敲定了打砖块这款游戏,说起打砖块这个游戏,它是雅达利公司开发,乔布斯及沃兹尼克参与设计的Breakout的改编版,当年也算是风靡一时的作品了。
那么打砖块这个游戏用Scratch如何实现呢?下面笔者就通过五个不同的角色来完成一个极简版的打砖块。其中分别用到挡板、球、砖块、gameover及youwin五个角色、其中挡板、球和砖块都是用的系统默认角色库里的内容,仅仅调节了大小,后两个角色为绘制角色,相信大家也可以轻松搞定。
下一步我们就一起来看看每个角色的程序如何编写:
1、弹球角色:
弹球角色的程序主要有三个部分:一个用来控制弹球的运动轨迹,一个用来控制弹球的反弹方向,一个用来判断弹球是否落地(游戏结束)。
程序分别为:
(1)控制弹球的运动轨迹
重复执行之外的部分为弹球的初始位置和初始面向方向,重复执行之内的移动积木控制弹球的移动速度,剩下三个判断反弹情况,为了程序可读性,我将碰到挡板的反弹程序写成了广播的形式。
(2)控制弹球碰到挡板后的反弹方向
用来控制反弹方向及弹球的运行速度。
(3)判断弹球是否落地
用挡板所在的Y坐标来判断弹球是否落地。
2、砖块角色
砖块角色的程序一共包含两个部分,第一部分砖块阵列的生成,第二部分砖块部分被击中的消失及得分反弹。
分别为:
(1)砖块阵列生成
设置好砖块的起始位置及大小之后,隐藏本体并让克隆体通过循环排布为7*4的一个阵列,作为我们的弹球攻击目标。
(2)砖块击中消失及得分反弹
当克隆体砖块显示在屏幕最上方之后,凡被弹球击中则加分并删除。
3、GameOver角色
程序如下:
4、YouWin角色
程序如下:
5、挡板角色
终于来到了我们的重头戏,挡板角色,我们之前传统的打砖块玩法一般会采用鼠标来控制挡板,这时候的程序如下:
这时候只要我们鼠标左右移动,就可以控制挡板去拦截弹球了。
至此,整个打砖块游戏就算是完成了,但是我们说这次要做的是一个体感的打砖块,所以之前的部分是不合格的,我们需要再对控制挡板的程序进行一些修改,使它具备我们需要的能力。
那么如何利用姿态分析积木去控制我们的挡板呢?只需要对挡板角色的程序进行如下的改进即可。
由于姿态分析还是基于摄像头传送的图像来分析的,所以第一步还是要打开摄像头,设置好挡板的初始位置之后就是如何控制挡板的问题了,首先我们要重复执行姿态检测来判断你目前的姿态,因为姿态检测会同时检测多个点位,所以我们以鼻子这个点位作为我们的检测目标,同时也让挡板跟着鼻子的X坐标来移动,这里有一个叫置信度的名词,顾名思义就是可以相信为真的程度,最高为1,最低为0,以小数来表示,我们选择了0.5作为我们的判断依据,如果机器判断该点位为鼻子的可信度为0.5以上,则让挡板跟随我们的鼻子来进行移动。
那么今天我们的整个游戏就改编完成了,由于软硬件性能的局限,可能在姿态识别时会有一点延迟,大家可以通过改变弹球的速度来调整游戏的难度,同时如果大家觉得鼻子控制起来很累,也可以试试左右手腕等其他点位,毕竟姿态分析积木中可以使用的关键点位有17个之多。
大家也可以根据官方提供的模板把整个游戏做的更美观一些,这里只是实现了最基本的功能而已,同时大家也可以到平台使用其他各类AI插件,并用姿态分析插件做出自己心仪的游戏。
也可添加我的微信号13772884134,注明进群交流。