首页 理论教育 Android游戏开发:足球玩家运动控制模块及算法

Android游戏开发:足球玩家运动控制模块及算法

时间:2023-10-22 理论教育 版权反馈
【摘要】:运动控制模块用于控制足球和玩家运动模块的开发,主要涉及了类Ball、PlayerMoveThread、AIThread和Player。控制手机一方球员的运动手机一方球员的运动控制是通过一个算法实现的,算法如下。PlayerMoveThread类前面介绍了玩家和球员的移动,最终目的是实现双方球员位置变化的是PlayerMoveThread线程。后者用于进行碰撞检测,查看是否足球碰到AI或玩家控制的运动员、是否遇到边界、是否遇到外部物体等。

Android游戏开发:足球玩家运动控制模块及算法

运动控制模块用于控制足球和玩家运动模块的开发,主要涉及了类Ball、PlayerMoveThread、AIThread和Player。

(1)球员控制模块

球员控制功能是通过按键上的方向键实现的,这是在文件FootballActivity.java中定义的在里面定义了onKeyDown(int keyCode,KeyEvent event)和onKeyUp(int keyCode,KeyEvent event),分别处理键盘按下事件和键盘抬起事件。对应代码如下。

(2)控制手机一方球员的运动

手机一方球员的运动控制是通过一个算法实现的,算法如下。

在每个固定时间读取足球的运动方向,如果足球偏向左,则将球员运动方向设置为向左如果足球偏向右,则将球员运动方向设置为向右。上述功能是通过AIThread类实现的,此类为AI(计算机人物角色)的后台线程,实现的功能是让AI足球运动员根据足球的运动的参数来确定自己的运动方向(向左还是右)。由于人工智能算法比较复杂,限于本书的篇幅,所以采用了一个比较简单的算法,即如果足球的方向偏左(即可以是左上、左下、正坐等),那么AI的运动方向就是向左,反之则向右。

实现文件AIThread.java的对应代码如下。

(3)PlayerMoveThread类

前面介绍了玩家和球员的移动,最终目的是实现双方球员位置变化的是PlayerMoveThread线程。此线程的实现文件是PlayerMoveThread.java,具体代码如下。

(4)Player类(www.xing528.com)

在本项目中,每个Player对象代表一个球员,在Player中除了成员变量之外,还有一个成员方法。并且还包括一个成员方法levelUp,负责玩家赢得一场比赛的胜利之后的升级操作Player来在文件Player.java中定义,具体代码如下。

(5)Ball类

Ball类是一个继承于Thread类的线程类,是系统中比较重要的类,里面不仅封装了足球对象的必要信息,还提供了用于碰撞检测和处理的一系列相关方法,Ball类是整个项目后台运行的核心。在本项目中,设置了足球的移动方向为16个方向,夹角是22.5度。Ball类是在文件Ball.java中定义的,下面开始介绍其实现流程。

第一步:封装足球有关的信息,如坐标点、方向、移动速度等,定义成员变量,具体代码如下。

第二步:实现游戏碰撞检测处理。此功能主要是通过run方法来实现的,run方法中主要有两个方法move和checkCollision,前者负责根据足球的方向来的移动足球的位置。后者用于进行碰撞检测,查看是否足球碰到AI或玩家控制的运动员、是否遇到边界、是否遇到外部物体等。具体代码如下。

在上述代码中,方法checkForBorders()能够检测足球是否碰到了边界,如果碰到了上下左右中的某一边界,则处理方法为:一定几率沿正确的路线(类似反射定律)改变方向,一定概率随机变向,如以方向1碰到上边界,会以某个较大的概率将小球的方向改为7,而会有相对较小的概率将方向改为5、6、7三个方向中的某一个。

第三步:定义方法handleCollision(),此方法处理足球和运动员之间的碰撞,手机和玩家的处理方式是一样的,首先查看Player对象的movingDirection,再综合Player对象的attackDirection,确定方向范围,类似直角坐标系中的4个象限,然后在方向范围中随机产生一个,这样产生的方向有惯性在里面,这样看来会比较真实。需要注意的是如果足球和运动员碰撞时运动员静止不动,那么可选的方向就是1或15(进攻方向朝上)、7或9(进攻方行朝下)。具体代码如下。

第四步:定义方法checkIfScoreAGoal(),此方法用于检测是否进球,如果是,则相应球队得分加1,然后判断游戏是否结束(游戏规则是谁先进够8个谁就赢)。具体代码如下。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈