助力冬奥会,一起向未来。冬奥会结束了,但是冬奥的热情还没有完全消散,各类冬奥主题的活动都还在举行。下面是辅导孩子参加省里的一个比赛的作品。
用scratch编写的冰壶游戏的作品网上还是不少,看过源程序,应该是一个韩国人编写的,在游戏设定,音乐配置上都做得很完美,但是一个是语言看不懂,另一个是他的逻辑有点怪,很多的画笔,研究了半天也没有什么有益的收获,只能依据自己的理解尽量实现上面的功能,并在他的基础上进行一些改进。
一、主要模块分析
冰壶游戏主要包括的模块是投掷冰壶球,冰壶运动,出界判断,碰撞判断,得分计算等主要模块。
(1)投掷冰壶
点击鼠标,让冰壶获得一个初始速度和方向,松开鼠标,冰壶便开始向前滑动。
(2)冰壶滑行
当冰壶被投掷或是被碰撞后,冰壶开始滑动,方向为投掷或是碰撞时给定的方向不变,速度不断降低,直至停止。
(3)出界判断
当冰壶球触及冰道边沿或是冰道底部时,判断为出界,这样的冰壶需要被清理出冰道。
(4)碰撞判断
是冰壶游戏中最为复杂的一个物理过程,让我想起了高中的运动学答题。理论上可以认为是在光滑平面上的等质量的完全碰撞,根据速度的分解,能量守恒和动量守恒,可以得到一个和碰撞角度有关的运动学方程,但是这个方程太复杂了,给孩子也讲不太明白,只能做简化为:两个冰壶相撞,运动方向为冰壶中心连线的反方向,速度为原来冰壶的一半。这样的设定大大的简化程序的难度,但是像“打定”的效果就没有办法实现。
(5)得分计算
按照冰壶比赛规则,在大本营里的冰壶,看谁的壶离大本营中心近,近的一方有几个壶比对方更近,得分几分。这里需要计算冰壶离大本营中心点的距离和距离中心的比较。需要用到直角坐标系下两点距离公式,以及两组数比较计算得分。
游戏整体布局。赛道横向处于舞台中央,上面是蓝队(冰墩墩队),以及蓝队的8个蓝色的冰壶;下面是红队(雪容融队),以及红队的8个红色冰壶。
下面是关键模块的实现方法。
(1)冰壶运动
在收到要投球的指令后,将冰壶球移动到赛道上,并且在这个时候鼠标可以拖动冰壶(这个原来的程序没有),按下鼠标开始蓄力,有一个力量条显示蓄力情况。当鼠标松开,冰壶开始移动,并慢慢停下来。在每一步的时候都进行碰撞检查。最后计算停下来的冰壶和中心点的距离。
(2)冰壶碰撞
碰撞是游戏里最为复杂的物理过程,也是游戏的实现的关键。理论上,两个冰壶相互碰撞开可以看作完全弹性碰撞,通过动量守恒和能量守恒联立方程不同角度碰撞前后的两个冰壶的速度。但是,对于一个小学生来说,这个过程实在是太过复杂,因此在实现时进行了再次的简化,将碰撞简化为:两个壶相撞后,两个壶的速度相同,均为原来的,方向为指向被撞球的圆心的反方向。
因为冰壶球会与在球道上任意一个球碰撞,所以要通通监测一遍,而且每运动一次,就要监测一次。
(3)出界判断
在运动后,当球停下来,就要判断球是否出界,包含出底线,出边界,和未过发球线。判断后,将所有出界的球移动到球回收区。
(4)计算得分
当所有的球都投完时,计算得分,通过计算每队各个球离圆心点的距离,然后比较最小的距离,算有几个球比对手球离圆心更近。其中,圆心坐标为(158,8),大本营的半径为74.
计算每个球的距离。
得分的条件是,在大本营,且比对方的球近。
(5)游戏的初始化和结束
初始化包含几个背景的切换,依据双方的出场顺序,以及游戏结束后比赛比分计算和胜负判定。
三、需要改进的地方
首先是碰撞,冰壶碰撞可以看作完全弹性碰撞,原理说简单不简单,说难不难,网上也有比较成熟的案例.。
第二程序的结构要优化。目前对每个小球的碰撞检测是手工一个一个检测,可以对每个冰壶进行编号,写一个循环。
第三是有许多的bug。比如多次碰撞的问题,发球时可以把冰壶移动到大本营等错误。
作为指导孩子参加比赛的作品,在帮助孩子建立最基础的碰撞模型后,其他的基本上的是孩子自己完成的,特别是关于冰壶的一些规则和游戏过程的控制上,孩子也在这次比赛上学到了很多的,也取得了比较满意的比赛结果。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved