游戏开发:Rectangle应用实战+Array中被你忽略的方法
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-08
来自:hi.baidu.com/mr_ziqiang 上一次发了一篇Rectangle对象在游戏开发中的应用的文章,下面还是围绕Rectangle对象介绍一下在即时战略游戏中的实际应用,同时还将会用到数组对象中平时用的不多的几个方法。 玩过《红警》或者《帝国时代》的朋友应该都知道,这类游戏有一个框选功能。鼠标在屏幕上拉一个框,处在方框之内的都被选中。如图: 我们这个例子的原型是这样的: 1、坦克的选择有框选和点击选择两种方式。 2、坦克被选中后会显示自己被选中。 3、鼠标在屏幕上点击时,如果有坦克被选中,坦克将移动到鼠标点击位置附近(是附近不是鼠标点击位置),同时选择状态自动取消。 4、如果有新的选择,则之前选择的坦克的选择状态将取消。 先看一下完成后的效果: 讲解: 1、坦克的被选择和非选择状态的实现 在我们的坦克类里面设置一个属性select,通过set方法来实现。当select=true时,让坦克的帧跳转到第2帧。当select=false时,让坦克的帧跳转到第1帧。在坦克类Tank中设定一个私有变量_select,然后设置getter/setter: publicfunctiongetselect():Boolean { return_select; } publicfunctionsetselect(s:Boolean) { _select=s; this.gotoAndStop(_select==true?2:1) } 2、坦克点击选择的实现 我们没有必要给每一辆坦克都注册鼠标事件,只要给放置坦克的容器注册一个鼠标事件就能知道用户点击的是哪一辆坦克。 MouseEvent有target和currentTarget两个属性。这两个属性有区别,target返回的是最先接收到点击的交互物体,而currentTarget返回的是你addEventListener注册的这个对象。见下图: 3、坦克框选的实现 基本上我们会需要做这几个步骤: A、通过鼠标的MOUSE_MOVE事件实现拉框效果。 B、通过画的这个框和物体的边界框比较判断那些物体被选择了。 C、让这些物体变为选择的状态。 D、当鼠标再一次被点击时,如果有坦克在选择状态下并且点击的位置是空地,则所有坦克向目标点附近移动,同时取消所有选择状态。 实现思路是——准备两个数组一个记录所有坦克的引用tankList,一个记录任何时候被选择的坦克的引用selectList。这里我们会用到平时使用不多的两个数组里的方法forEach()和filter(),这两个方法将在这里发挥重要的作用。数组对象共有5个你可能没怎么关注的新的方法。如下图: 来看一下我们在这个例子里面是怎么用的: selectList=tankList.filter(selectTank);//找出被框选的坦克 selectList.forEach(moveTank);//让所有被选中的坦克移动 functionselectTank(element:*,index:int,arr:Array) { //如果坦克边界与选框相交,则让坦克显示为选择状态 if(element.getBounds(this).intersects(rec)==true) { element.select=true; returntrue; } returnfalse; } functionmoveTank(element:*,index:int,arr:Array) { element.select=false;//移动时取消坦克的选择状态 varrandomX=targetPoint.x+Math.random()*150-75; varrandomY=targetPoint.y+Math.random()*150-75; element.moveTo(randomX,randomY);//让坦克移动 } 完整代码如下: ================================================================================== 主程序: importTank; varmap:Sprite=newSprite();//定义一个地图容器 vartankList:Array=newArray();//定义一个记录所有坦克的列表 varselectList:Array=newArray();//定义一个记录当前选择的坦克的列表 vartargetPoint:Point;//目标点 varrec:Rectangle;//选择框的矩形对象 varshape:Shape=newShape();//用于显示选择框的Shape对象 varisMove:Boolean;//选择坦克还是移动坦克 addChild(map);//把地图放入 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于游戏开发:Rectangle应用实战+Array中被你忽略的方法的所有评论