2 小时开发《点球射门游戏》,动画演示思路(下),代码已开源
前沿
首选感谢各位对我这边文章(2小时开发《点球射门游戏》,动画演示思路(上),代码已开源)的点赞、收藏与支持,今天在这里主要是接上一篇文章,讲一讲游戏界面中的一些动画与逻辑的实现,希望大家一如既往的点赞、收藏+关注,鼓励一下勇哥。对于游戏怎么怎么画,请看上那篇文章。
本篇内容有那些值得大家学习【重点】
使用二次曲线实现球的瞄准轨迹线【见下】。这个在 QQ 桌球、王者荣耀、愤怒的小鸟等游戏中都用到了!
使用多线程实现守门员移动、飞球、蓄力区、时间轴等动画。
有那些逻辑需要实现【必看】
如下图,整个游戏的实现逻辑,按照对象来分,则为以下:
球对象逻辑:
拖动鼠标:调整球射出的轨迹逻辑,支持上下左右的拖动调整★★★
Ctrl+拖动鼠标:摆放球逻辑
点击球:球按照轨迹飞出运动的逻辑★★★
星星对象逻辑:
球在飞行轨迹与星星重合则消除星星的逻辑★★★
守门员对象逻辑:
在球门区左右来回移动的逻辑
石头对象逻辑:
禁止遮挡部分球门,球不能从此射进的逻辑
球门对象逻辑:
进球逻辑★★★
积分区对象逻辑:
记时逻辑
进球积分逻辑
游戏逻辑实现思路 &代码
调整射门轨迹的逻辑实现
轨迹实现的思路看起来难,实际还是挺难的,思路如下:
假设有两点,黄色点为足球的中心点,红色点是球门的中心点
在黄点和红点之间就存在一条红色线段
在红色线段上随机取 N 个点,用白色表示,这样就形成了一个直线的轨迹点
接着再说一下拖动鼠标,轨迹跟着鼠标移动的实现思路:
鼠标向上拖动,黄点和红点同步向上平移,这样线段上的轨迹点也同步平移
鼠标向下拖动,黄点和红点同步向下平移,这样线段上的轨迹点也同步平移
鼠标向右拖动,黄点和红点同步向右平移,这样线段上的轨迹点也同步平移
鼠标向左拖动,黄点和红点同步向左平移,这样线段上的轨迹点也同步平移
最后注意,黄点和红点之间如果是曲线,效果更贴近自然,所以最后还需要把黄点和红点之间使用二次曲线进行实现。
轨迹线,参考实现代码:
鼠标拖动参考实现代码:
拖动球,摆放球的逻辑实现
拖动球,可以摆放球的位置,相关实现思路是:
拖动开始时(按下鼠标时)设置一个其实点,黄点
拖动过程中(按下鼠标,并同时移动位置)换点跟随鼠标点
拖动结束时(松开鼠标)球平移到最后的位置
参考实现代码:
射门,球按照轨迹飞行实现
鼠标点击球,球就按照之前的轨迹点飞行,实现的思路如下:
获取到从二次曲线上的随机轨迹点,如下图中的白色小圆
点击球是,开启一个线程
在线程中,把球平移到轨迹点的第一个点,并休眠 100 毫秒
100 毫秒后,又把球平移到轨迹点的下一个点,再次休眠 100 毫秒
....重复上一步动作,知道球平移到最后一个轨迹点
参考实现代码:
消除轨迹点重合的星星逻辑实现
消除星星,实际就是判断球的坐标点是否与星星重合,如果是则消除,具体实现思路如下:
星星当作是一个正方形,有 4 个点
球也当作是一个正方形,有 4 个点
球在飞行过程中,每移动到一个轨迹点时,检查星星和球的四个点是否有重合的区域
如果有重合的区域则,消除星星,从游戏界面中删除星星
参考实现代码:
守门员来回移动的逻辑实现
守门员在球门前,左右移动,干扰射球的飞行过程,实现思路:
开启一个线程
向右平移守门员位置+30 像素,并判断是否超出了最右边球门边缘,如果是则设置向左移动,然后休眠 100 毫秒
向左平移守门员位置-30 像素,并判断是否超出了最左边球门边缘,如果是则设置向右移动,然后休眠 100 毫秒
石头的逻辑实现
石头就是一张图片,把其摆放到对应位置即可。其遮挡射门的逻辑,主要在球门逻辑中去判断。
参考代码:
进球逻辑实现
进球逻辑看起难,实际还是一个对象边框重合检查的过程,其实现思路如下:
球门、守门员、石头、球都有自己的边界,都是平行四边形
当前射出的球移动到轨迹最后一个点时,开始判断以上元素的边界是否重合,依此来判断是否进球
进球依据:球的四个点都在球门四个点内部
守住依据:球与守门员、石头有任意一个点的重合即为守住
出界依据:球任意一个点不在球门范围内,则为球出界
参考代码:
记时逻辑实现
记时实现的思路如下:
进入游戏时初始一个数字变量
开启一个线程,把数字变量增加 1,然后休眠 1 秒
循环增加 1、循环休眠 1 秒
参考代码:
进球积分逻辑实现
在本游戏中积分的规则有以下两点:
进球得 1 分
进球的同时,消除一颗星星得 1 分
举个例子,如下图,射门进球同时消除了一颗星星,则得 2 分。
相关实现逻辑思路如下:
在球飞行过程中进来消除星星的数量
在进球时,把星星的数量当作分数累计
参考代码:
版权声明: 本文为 InfoQ 作者【非喵鱼】的原创文章。
原文链接:【http://xie.infoq.cn/article/27b0a839ccaac77dbe67f498c】。文章转载请联系作者。
评论