`
wgcode
  • 浏览: 577132 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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];
     }
    }

 

应用三:对两个并不存在的对象进行碰撞检测

有的时候你想进行碰撞的两个物体并不存在,那么我们就无法通过正常的hitTest手段检测两个物体是否发生了碰撞。这个时候通过Rectangle对象无疑是最方便的。

下面举出两个例子来说明一下这种应用:



 

 

 

首先说明上图的假设并不多见,但我只是想通过这个不怎么恰当的例子说明Rectangle的一种应用。
上图如果我们只想知道“葡萄MM“是否走到了矩形A的区域,而不管其他的。这个时候我们的Rectangle又一次发挥了作用。

因为这个建筑和mm的位置都是针对与地图坐标系的,所以我们可以针对于建筑左顶点的偏移量来确定矩形A的坐标和宽度高度

同样我们可以通过葡萄mm的左顶点和矩形B相对于这一点的偏移量来矩形B的坐标和大小。

假设建筑的左顶点坐标为:2000,1200, 矩形相对于左顶点的偏移量为50,50,大小为80,30
那么我们可以很快得到矩形A初始值:recA=new (2000+50,1200+30,80,30)

同理我们可以得到矩形B的区域了,有了这两个矩形那么我们只要调用一下任意一个矩形的相交判断方法就行了recA.intersects(recB)

总结:虽然并没有测试这样所带来的效率,但是会有很多地方可以为我们的判断带来很大的方便

  • 大小: 156.1 KB
分享到:
评论

相关推荐

    面向对象设计模式应用+绘制类图+Java语言实现任务中的模式设计。

    )一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle)、线对象(Line)都支持Draw()函数,即可以通过Draw()函数绘制图形。为了加快项目进度,将角度对象(Angle)绘制功能交给了合作团队...

    ActionScript开发人员指南中文版

    使用Rectangle对象 使用Matrix对象 几何形状示例:对显示对象应用矩阵转换 第章:使用绘图API 绘制API的基础 Graphics类 绘制线条和曲线 使用内置方法绘制形状 创建渐变线条和填充 将Math类与绘制方法配合使用 使用...

    ActionScript开发技术大全

    15.2.1创建Rectangle对象 321 15.2.2确定矩形位置 321 15.2.3调整矩形 322 15.2.4位置关系判定 324 15.3矩阵对象 325 15.3.1初始化Matrix对象 326 15.3.2矩阵应用 327 15.4小结 328 第16章ActionScript3.0图形绘制 ...

    Qt5开发及实例-CH1902.rar,Qt5在窗口中绘制矩形的代码

    Qt5开发及实例,实例CH1902,在窗口中绘制矩形,运行效果如图19.7所示。 实现步骤如下。 (1)新建QML应用程序,项目名称为“Rectangle”。 (2)双击项目视图打开MainForm.ui.qml文件,修改代码如下: (3)双击打开...

    用Delphi实现Word文件的预览

    要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中。它还支持各种存储像素数据的方法:使用或不使用 alpha 通道、不同种类的颜色...

    java编程基础,应用与实例

    18.5.2 Rectangle2D类 324 18.5.3 Ellipse2D类 325 18.5.4 GeneralPath类 326 18.6 渲染属性 327 18.6.1 Stroke属性 327 18.6.2 Paint属性 329 18.6.3 Composite属性 332 18.6.4 Transform属性 333 ...

    GDI+图像程序设计(PDF & 源码 -电子工业出版社)

    本书是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面。 本书适合于开发GDI+图形应用程序的初、中级程序员...

    设计模式实验报告.doc

    2 实验内容和要求 一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对 象(Line)都支持Draw()函数,即可以通过Draw()函数绘制图形。为了加快项目进度,将 角度对象(Angle)绘制功能交给了...

    C#GDI+图形程序设计源码

    ——在GDI+ Painter应用程序中添加颜色、钢笔和画笔 总结 第5章 颜色、字体和文本 5.1 访问Graphics对象 5.2 使用颜色 5.3 使用字体 5.4 使用文本和字符串 5.5 渲染文本的质量和性能 5.6 高级版式 5.7 一个...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在面向对象的程序设计中,你可以用软件对象表示现实世界的对象,而这些软件对象和 现实世界对象是相对应的。例如:如果你正在建立一个帐户管理系统,那么你的对象就是帐 户、欠款、信用卡、月收入、贷款、交易等等。...

    PT80-NEAT开发指南v1.1

    第二章 PT80 开发入门 .................................................................................................................................. 2 开发环境搭建 ....................................

    java课程实验

    (3)完成该软件包后的编码后,在另一个包的含有main方法的类中编写代码,分别使用图形软件包中的三个类,生成三个对象,并打印出其周长和面积。 2、编写类Factorial,为其添加两个静态方法(方法名自定义)。其中一...

    Thinking_in_C++_中文版【高清+可搜索+可编辑/复制/粘贴+无密码】

    在开发商制定的RT T I中一般的方法 是:创建一个函数来试着将s h a p e *指派为一个c i r c l e * (在本例中),检查执行过程中的数据类型。 如果这个函数返回一个地址,则成功;如果返回n u l l,说明我们并没有一个...

    C++MFC教程

    更重要的是理解并能运用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C++一定要能熟练运用。 2、理解Windows的消息机制,窗口句柄和其他GUI句柄的含义和用途。了解和MFC各个...

Global site tag (gtag.js) - Google Analytics