快速业务通道

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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号