Rectangle对象在游戏开发中的应用
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-07
一直知道在Flash.geos包里面有一个Rectangle对象却很少用过,无意中试用了一下发现可用的地方还很广。所以一冲动把现在的项目中的很多地方都改成了Rectangle判断了。 应用一:屏幕滚屏 滚屏是游戏中最常做的一项工作,一般的思路是map.x++ map.y++,然后随时判断map是否走到了头。下面的代码中我用了一张4000*4000的图片来说明两种方式: 一般的做法如下:判断每一步是否超过边界如果超过边界则等于边界。 varmap:Loader=newLoader();//地图容器 varspeed:int=7;//移动速度 map.load(newURLRequest("2.jpg")); map.contentLoaderInfo.addEventListener(Event.COMPLETE,oncomplete); addChild(map); functiononcomplete(evt:Event) { stage.addEventListener(KeyboardEvent.KEY_DOWN,onkeydown); } functiononkeydown2(evt:KeyboardEvent) { switch(evt.keyCode) { caseKeyboard.LEFT: if(map.x+7<0) map.x+=7; elsemap.x=0; break; caseKeyboard.RIGHT: if(map.x-7>stage.stageWidth-map.width)map.x-=7; elsemap.x=stage.stageWidth-map.width break; caseKeyboard.UP: if(map.y+7<0)map.y+=7; elsemap.y=0; break; caseKeyboard.DOWN: if(map.y-7>stage.stageHeight-map.height)map.y-=7; elsemap.y=stage.stageHeight-map.height break; } } 使用Rectangle的方法,见如下代码: varmap:Loader=newLoader();//地图容器 varrec:Rectangle;//当前显示区域的范围 varmaxRec:Rectangle;//地图的矩形范围 varspeed:int=7; map.load(newURLRequest("2.jpg")); map.contentLoaderInfo.addEventListener(Event.COMPLETE,oncomplete); addChild(map); functiononcomplete(evt:Event) { maxRec=map.getBounds(map);//以自己的坐标系返回矩形 rec=newRectangle(0,0,800,600);//显示的范围 map.scrollRect=rec;//确定地图的可显示范围 stage.addEventListener(KeyboardEvent.KEY_DOWN,onkeydown); } functiononkeydown(evt:KeyboardEvent) { rec=map.scrollRect; switch(evt.keyCode) { caseKeyboard.LEFT: rec.x-=7; break; caseKeyboard.RIGHT: rec.x+=7; break; caseKeyboard.UP: rec.y-=7; break; caseKeyboard.DOWN: rec.y+=7; break; } if(rec.x<0)rec.x=0; elseif(rec.x>maxRec.width-rec.width)rec.x=maxRec.width-rec.width; if(rec.y<0)rec.y=0; elseif(rec.y>maxRec.height-rec.height)rec.y=maxRec.height-rec.height; //if(maxRec.containsRect(rec))如果你无需十分精确可以关闭以上4行,把这一句打开 map.scrollRect=rec; } 两种方式的比较:效率上相差不大,不过使用Rectangel的好处是利用显示对象的scrollRect属性可以把区域之外的内容不显示出来。 注意事项:scrollRect的增量方向正好与物体的相反,可以想象为一个是移动物体,一个是移动屏幕。 应用二:找出屏幕外围的显示对象。 基本思路:将Rectangle对象的坐标系设置为屏幕坐标系,利用DisplayObject.getBounds(stage)返回其他物体在屏幕坐标系中的位置,然后利用Rectangle对象的相交测试方法检测(有点类似于碰撞检测) 以下是一个例子: varrec:Rectangle=newRectangle(0,0,ShareData.SCENEWIDTH,ShareData.SCENEHEIGHT); for(vari=0;i<gameContainer.numChildren;i++) { varbuild=gameContainer.getChildAt(i); if(build.getBounds(stage).intersects(rec)) { build.visible=true; ShareData.visualList[build.name]=build; } else { build.visible=false; if(ShareData.visualList[build]!=null) deleteShareData.visualList[build]; } } 总结:虽然并没有测试这样所带来的效率,但是会有很多地方可以为我们的判断带来很大的方便。 关键词:对象 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Rectangle对象在游戏开发中的应用的所有评论