《贪吃蛇》作为一款经典小游戏,是手机内置单机游戏的首选。后来,“蛇大战”在网络上流行起来。从《贪吃蛇》到《贪吃蛇大战》的演变,不仅仅是操控灵活性的拓展,更重要的是交互方式和游戏思路的改变。
在游戏制作过程中,《贪吃蛇》游戏使用数组网格作为容器,而《贪吃蛇》则使用图像对象容器。下面详细介绍后者的设计过程:
项目名称:《蛇大战》游戏设计
考核内容:画圆函数、极坐标系、鼠标事件、自定义事件、局部变量等。
项目要求:
①用位置圆法表示“蛇”的身体;
② 允许游戏对象跟随鼠标引导或键盘操作;
③实现生成随机食物、吃食物、拉长身体等操作;
④ 实现与物体、边界、墙壁、障碍物碰撞的结局游戏机制;
⑤ 优化游戏界面,达到最终游戏界面效果如图2-1所示。
(1)制定设计方案
贪吃蛇游戏设计的核心部分是:运动和方向控制、食物吃或碰撞检测机制。他们的基本解决方案和实现方法是:
☆ 练习通过加头去尾解决;
☆ 使用极坐标计算方向;
☆ 吃食物或者检测碰撞都是以头部位置与目标位置的相对距离为标准。
蛇始终处于运动状态,不断检测遇到的物体,执行相应的规则贪吃蛇游戏设计,然后鼠标中断方向改变功能。所以运行模式是事件驱动的:
☆ 事件超时:负责蛇的移动和碰撞检测;
☆ 鼠标按下:负责求解运动的角度方向;
☆ 用户事件:执行游戏规则或操作。
有了解决游戏核心和运行方式问题的想法后,下一步就是通过编程将想法一步步转化为实际代码,让游戏成为现实。
(2)画出贪吃蛇的形状并移动它
贪吃蛇由许多身体节段组成。每个段都是一个位置元素,整个体是一个一维数组。第一个索引是头部游戏动态,最后一个索引是尾部。
如图2-2所示,使用for循环自动索引身体位置数组,并叠加移位寄存器图片。为了实现颜色效果,使用一维数字组装不同的颜色,然后将颜色循环相加,最后使用mod(x,2)确定奇数和偶数,实现填充颜色间隔的控制。注意,因为蛇的长度是不断变化的,所以不可能专门配置颜色数组,所以使用了一个自动循环来扩展颜色。具体代码含义是通过将snake的长度索引的余数除以颜色数组的大小来添加颜色。
画好游戏物体的形状后,最重要的就是运动。分析身体运动规律,就是加头去尾的方法。添加头意味着在位置数组前面插入一个新位置。因为插入新元素时数组的大小会增加,所以最后会删除旧元素位置以保持长度。图2-3 代码控制蛇的运动。新位置是根据鼠标引导的角度和移动单位确定的。通过将直角坐标与之前的位置相加极坐标转换,得到新的头部绝对位置。
注:使用极坐标转换直角坐标模块转换半径和角度的xy坐标分量,使用直角坐标转换极坐标功能通过xy分量求解到原点的距离和角度。
为了更好地调用功能,通常将相对独立的功能模块化。图2-6所示为功能模块化后的功能块,分别为运动、碰撞检测、形状绘制三个功能模块。
在《Snake》的制作中,应用了三维坐标转换功能。主要目的是获取位置、距离或角度。以下是转换函数的应用总结:
☆控制贪吃蛇的运动,将极坐标变为直角坐标,找到新运动的实际位置;
☆获取鼠标的引导,将直角坐标转换为极坐标,求出蛇的引导角度;
☆定位碰撞检测,将直角坐标转换为极坐标并求出两点之间的距离来判断是否发生碰撞。
(四)落实游戏运行机制
介绍完贪吃蛇的基本运动原理后,下一步就是将原理与游戏运行机制有机结合起来进行设计。
如图2-7所示,左图所示:运行方式为事件驱动,创建了3个事件(超时、鼠标点击图片、用户动态事件)。右图显示了负责这三个事件的函数执行分布。游戏中,蛇不断移动,需要不断执行运动模块;游戏显示与动作同步,因此显示模块也是循环执行的;运动需要确定它遇到了什么,并且碰撞检测也必须同步。事件分为触发事件和动态事件。触发事件只有在用户操作时才会触发。程序后台无权触发事件。动态事件是灵活的事件,可以随时调用、触发。当满足某些条件时,它们可以在程序内自行触发或由用户触发。
检测食物奖励的原理是:将蛇头坐标和食物奖励坐标加载到检测模块中,计算直线距离,判断是否接近极限。实现方法如图2-8(上)所示。检测边界的原理是:比较水平位置和垂直位置。如果两个参数都在该区域内,
或者在设置操作后,判断输出是否在范围内,对其求反得到是否超出边界的布尔值。
检测蛇的头部是否与身体碰撞的方法是将shape数组中的头部位置和身体位置参数分开。然后通过头部位置和身体各个节点的位置来判断是否碰撞到自己。
注意屏蔽身体靠近头部的节点。如果忽略,总是会与自身发生碰撞,因为头部距离附近的身体非常近。因此,在分离head和body参数时,head取位置数组的第一个元素,body取位置数组的第10个元素之后的位置,这样运行时就不会出现body碰撞异常的情况。如图2-8(下)所示,屏蔽靠近身体的节点,进行碰撞体检测。
讨论问题:
问题1:蛇在转弯时,稍微转弯就会碰到自己的身体。这是怎么回事?
答:身体碰撞检测机制是比较头部位置与身体各个关节的位置。如果相邻值设置太小,转弯时会与车身发生碰撞。这可以通过增加删除关节的数量来解决,因为它是头部。检测与其他部件相邻的接头。如果关节内的关节距离太近材质材料,转动时关节就会发生碰撞。
问题2:如何吃多种食物?并生产多种食物?
答:多种食物共存的问题,实际上就是一个位置变成多个位置贪吃蛇游戏设计,一次检测变成多次检测。将食物位置元素改为食物位置元素数组,可以一次存储多个食物的位置。头部与每个食物位置进行比较。如果头部检测到与食物发生碰撞,则立即进入游戏机制判断阶段。
一定要注意生成多种食物的条件。并不是每次吃一种食物都会产生 3 种食物。这会导致你吃得越来越多,所以你必须控制食物的外观。当界面上只剩下1个食物时,吃完后会生成多个食物。如果界面上的数量超过1个,则不会触发添加食物。
问题三:如何实现解体,成为别人的食物?
答:分解成食物的基本实现思路:位置属性转换,当HP小于等于0时,触发后置事件,向位置数组中注入一组随机数,实现离散化和崩解位置阵列的分散度。然后将这些位置加载到食物位置数组中。
问题4:如何多人在一个空间一起玩?
答:因为游戏中蛇的身体是以位置数组的形式呈现的,所以完全可以实现联合游戏。有很多地方需要改变。总体思路是:食物和角色位置在公共平台(LAN)上共享,可以访问和绘制。还需要绘制多个角色,还需要添加与其他角色的碰撞,还需要学习如何架设服务器。