Rectangle对象在游戏开发中的应用

     一直知道在flash .geos包里面有一个Rectangle对象却很少用过。无意中试用了一下发现可用的地方还很广。所以一冲动把现在的项目中的很多地方都改成了Rectangle判断了。

应用 一:屏幕滚屏


滚屏是
游戏 中最常做的一项工作,一般的思路是map.x++ map.y++,然后随时判断map是否走到了头。

下面的
代码 中我用了一张4000*4000的图片来说明两种方式:

一般的做法如下:判断每一步是否超过边界如果超过边界则等于边界。


var map:Loader=new
Loader (); //地图 容器
var speed:int=7; //移动速度

map.load (new URLRequest("2.jpg"));

map.contentLoaderInfo.addEventListener (Event.COMPLETE,oncomplete);
addChild (map);

function oncomplete (evt:Event)

{
  stage.addEventListener (KeyboardEvent.KEY_DOWN,onkeydown);
}
function onkeydown2(evt:KeyboardEvent)
{
switch (evt.keyCode)
{
  case Keyboard.LEFT :
    if (map.x+7<0) map.x+=7;
      else map.x=0;
     break;
    case Keyboard.RIGHT :
     if (map.x-7>stage.stageWidth-map.width)   map.x-=7;
      else map.x=stage.stageWidth-map.width
     break;
  case Keyboard.UP :
     if (map.y+7<0) map.y+=7;
      else map.y=0;
     break;
  case Keyboard.DOWN :
     if (map.y-7>stage.stageHeight-map.height) map.y-=7;
      else map.y=stage.stageHeight-map.height
     break;
}
}

使用Rectangle的方法,见如下代码


var map:Loader=new Loader(); //地图容器

var rec:Rectangle; //当前显示区域的范围
var maxRec:Rectangle; //地图的矩形范围
var speed:int=7;

map.load (new URLRequest("2.jpg"));

map.contentLoaderInfo.addEventListener (Event.COMPLETE,oncomplete);
addChild (map);

function oncomplete (evt:Event)

{
maxRec=map.getBounds(map);//以自己的坐标系返回矩形
rec=new Rectangle(0,0,800,600);//显示的范围
map.scrollRect=rec;//确定地图的可显示范围
stage.addEventListener (KeyboardEvent.KEY_DOWN,onkeydown);
}
function onkeydown (evt:KeyboardEvent)
{
rec=map.scrollRect;
switch (evt.keyCode)
{
   case Keyboard.LEFT :
    rec.x-=7;
    break;
   case Keyboard.RIGHT :
    rec.x+=7;
    break;
   case Keyboard.UP :
    rec.y-=7;
    break;
   case Keyboard.DOWN :
    rec.y+=7;
    break;
}
if(rec.x<0) rec.x=0;
else if(rec.x>maxRec.width-rec.width) rec.x=maxRec.width-rec.width;
if(rec.y<0) rec.y=0;
else if(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对象的相交测试方法检测(有点类似于碰撞检测)

以下是一个例子


var rec:Rectangle = new Rectangle(0, 0, ShareData.SCENEWIDTH, ShareData.SCENEHEIGHT);

    for (var i = 0; i < gameContainer.numChildren; i++)
    {
     var build = 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)
      delete ShareData.visualList[build];
     }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值