资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章,游戏的运行机制,(2),物体运动与碰撞检测,内容提要,游戏世界中的物体运动,碰撞检测,实例:打砖块游戏,1.,游戏世界中的物体运动,物体运动分类(直线运动):,匀速运动:,s=t*v,加速运动:,s=t*(,v+t,*,cv,),如何在游戏中模拟?,对于匀速运动,在每一帧中对物体的,x,与,y,坐标值赋予一个,恒定的增量,,形如:,x=,x+dx,;,y=,y+dy,;,对于变速运动,每一帧在实现匀速运动的基础上再赋予额外的一个恒定增量作为,速度的增量,(加速度),形如,dx,=,dx+dcx,;,x=,x+dx,;,dy,=,dy+dcy,;,y=,y+dy,;,(参见例,4_5,),2.,碰撞检测,游戏世界中物体之间如何交互?,碰撞,各个物体的显示区域相互重叠,如何进行碰撞检测?,边界检测法(俄罗斯方块),中心检测法,(,贪食蛇),3.,制作打砖块游戏,基本元素:,小球、挡板、砖块,基本规则:,小球在屏幕四周弹跳,碰到挡板或砖块后改变方向,而且被碰到的砖块消失,应该为此游戏程序设计几个主要的类?,5,个,设计挡板类,如何设计挡板的移动控制?,移动范围:窗口,下边缘,,左右移动,控制方式:玩家按下左或右键时挡板向左或右移动,,松开按键时停止,移动(和贪食蛇的移动比较),如何绘制挡板?,g.fillRect(location.x,location.y,size.x,size.y,);,(参见例,4_6,),设计砖块类,如何表示多个砖块?,Array or,ArrayList,如何为每个砖块设定显示坐标?(,难点,),双重循环,如何绘制砖块?,逐一绘制所有砖块,(参见例,4_7,),碰撞检测及处理,(,1,)小球与墙壁(程序窗口的边界)碰撞,反弹,效果:碰到墙壁后改变方向,如何实现?,碰到左右两边墙壁,,dx,设为,-,dx,碰到上下两侧墙壁,,dy,设为,-,dy,(,2,)小球与砖块碰撞(,重点,),当小球碰撞到砖块后,要求:,a,砖块消失,b,小球反弹,问题一:如何检测,小球与砖块的碰撞?,边界检测法,(小球左上角的坐标,进入图中的,红色矩形框,即判定为碰撞。,Why,?),砖块,问题二:如何让砖块消失,a,设置一个,boolean,数组,exist,,其中的每个,boolean,变量用来,标记砖块是否被碰撞,,,b,初始时讲,exist,数组中的所有变量赋值为,true,,表示砖块都没被撞到,c,当小球与某块砖块碰撞,则将,exist,数组中相应砖块的,boolean,变量设置为,false,d,在砖块绘制时加入条件判断,如果某个砖块的,exist,变量为,true,才将其显示出来,问题三:如何设定小球的反弹规则(,难点,),当碰撞发生在,R2,区域:,dy,变为相反数,,dx,不变,当碰撞发生在,R1,区域:,若来球方向为左,(,dx,0),,,dx,变为相反数,,dy,不变;,否则,,dy,变为相反数,,dx,不变,当碰撞发生在,R3,区域:,若来球方向为右,(,dx,0),,,dx,变为相反数,,dy,不变;,否则,,dy,变为相反数,,dx,不变,(参见例,4_8,),R2,R1,R3,(,3,)小球与挡板碰撞,可以采用与砖块碰撞检测同样的算法,但是,会出现,BUG,!,why,?,挡板,挡板,挡板,第一帧,第二帧,第三帧,bug1,:小球飞出下边界后,被挡板,“救”,回来,Bug1,解决:缩小碰撞检测区域,挡板,出界,反弹,Bug2,及其解决,设置布尔变量,padCanBounce,,当挡板碰到小球后该变量设置为,false,,以免连续地和小球发生碰撞,bug2,:挡板内的,反复碰撞,挡板,R1,R3,完善游戏规则,(,1,)平滑移动挡板,按键松开时让挡板停止移动,(,2,)小球从窗口下边沿飞出后回到挡板上,(,3,)所有砖块打完后游戏结束,按,R,键重新开始,(参见例,4_9,),继续改进,1,增加生命,如初始时设小球,3,条命,掉下挡板三次游戏结束,2,增加难度,每个砖块要敲击两次才能消失,3,分数显示,设计积分规则,并在游戏结束时显示出来,4,设置宝物,让宝物隐藏砖块后,打中相应的砖块后改变属性,如小球减速,挡板增长,小球穿越砖块,小球停在挡板上等等,5,增加新的关卡,
展开阅读全文