- 浏览: 1095706 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (695)
- 心情日记 (14)
- AS开发工具 (12)
- 文章转载 (99)
- AIR (5)
- 问题总结 (46)
- SWF格式 (7)
- 测试总结 (10)
- 外文资料 (9)
- 算法技术 (33)
- AS3常用开源库 (43)
- 源码范例 (102)
- FLEX (72)
- FLASH 优化 (33)
- 游戏开发 (49)
- 开发技术 (11)
- 工作应用 (34)
- AS3收集 (140)
- WebBase (0)
- 开发构想 (4)
- 设计模式 (2)
- 框架和框架范例 (19)
- RED5 (3)
- java开发 (3)
- JAVA (1)
- FLASH-3D (23)
- 3D (6)
- 书籍 (10)
- 业界信息资料 (3)
- C# (1)
- JavaScript (12)
- HTML5 (6)
- Flixel (1)
- D5Power RPG网页游戏引擎 (0)
- ColorMatrixFilter - 获得相应颜色的色调 函数 (0)
- Starling (0)
最新评论
-
老顽童203:
字体
水果忍者鼠标跟随特效制作[转载] -
hairball00:
[转] 放出超多的Flash组件源代码 -
he74552775:
flash AS3 RegExp简单功能用法(转) -
hanshuai1232000:
第四点,有利也有弊,等你做了大型的aprg,你就知道了
[转]位图数据内存优化 -
yangfantao:
太感谢
[转] 放出超多的Flash组件源代码
http://wgcode.iteye.com/blog/815024
package { //像素级精确碰撞算法优化 //代码:Aone //2009-10-30 import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.DisplayObject; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; public class BitmapHitTestPlus { public static var tileSize:int=20 public static function complexHitTestObject(target1:DisplayObject, target2:DisplayObject):Boolean { //横向缩小到tileSize尺寸需要的倍数,也就是期望检测的时候缩小到的尺寸。 var scaleX:Number = (target1.width < target2.width ? target1.width : target2.width) / BitmapHitTestPlus.tileSize //纵向缩小到tileSize尺寸需要的倍 var scaleY:Number = (target1.height < target2.height ? target1.height : target2.height) / BitmapHitTestPlus.tileSize // //如果倍数小于1则按原始倍率也就是原始尺寸 scaleX = scaleX < 1 ? 1 : scaleX scaleY = scaleY < 1 ? 1 : scaleY //draw用point var pt:Point=new Point() //做2次draw时使用的颜色 var ct:ColorTransform=new ColorTransform() ct.color=0xFF00000F //原始尺寸下的重叠矩形 var oldHitRectangle:Rectangle=intersectionRectangle(target1, target2) //用于存放缩放的重叠矩形 var hitRectangle:Rectangle= new Rectangle() return complexIntersectionRectangle(target1, target2 , scaleX , scaleY , pt , ct , oldHitRectangle,hitRectangle,BitmapHitTestPlus.tileSize,BitmapHitTestPlus.tileSize).width != 0; } public static function intersectionRectangle(target1:DisplayObject, target2:DisplayObject):Rectangle { // If either of the items don't have a reference to stage, then they are not in a display list // or if a simple hitTestObject is false, they cannot be intersecting. if (!target1.root || !target2.root || !target1.hitTestObject(target2)) return new Rectangle(); // Get the bounds of each DisplayObject. var bounds1:Rectangle=target1.getBounds(target1.root); var bounds2:Rectangle=target2.getBounds(target2.root); // Determine test area boundaries. var intersection:Rectangle=new Rectangle(); intersection.x=Math.max(bounds1.x, bounds2.x); intersection.y=Math.max(bounds1.y, bounds2.y); intersection.width=Math.min((bounds1.x + bounds1.width) - intersection.x, (bounds2.x + bounds2.width) - intersection.x); intersection.height=Math.min((bounds1.y + bounds1.height) - intersection.y, (bounds2.y + bounds2.height) - intersection.y); return intersection; } public static function complexIntersectionRectangle(target1:DisplayObject, target2:DisplayObject, scaleX:Number , scaleY:Number , pt:Point , ct:ColorTransform ,oldhitRectangle:Rectangle,hitRectangle:Rectangle,nowW:int,nowH:int):Rectangle { if (!target1.hitTestObject(target2)) return new Rectangle(); //根据纵横的缩小倍数来计算缩小的重叠矩形尺寸 hitRectangle.x = oldhitRectangle.x hitRectangle.y = oldhitRectangle.y hitRectangle.width = oldhitRectangle.width / scaleX hitRectangle.height = oldhitRectangle.height / scaleY //建立一个用来draw的临时BitmapData对象,尺寸为期望宽nowW,期望高nowH var bitmapData:BitmapData=new BitmapData(nowW,nowH, true, 0); //绘制对象1其缩放比例和位移量由getDrawMatrix()函数计算,并且把不透明处绘制为ct的颜色 bitmapData.draw(target1, BitmapHitTestPlus.getDrawMatrix(target1, hitRectangle , scaleX , scaleY ),ct); //当纵横缩小比例不为1的时候把任何有色像素重新替换成ct的颜色0xFF00000F,原因为缩小的对象在进行纯色绘制的时候会有半透明像素产生,如果不加以重新替换会影响后面对象2的滤镜效果。 if(scaleX!=1&&scaleY!=1){ bitmapData.threshold(bitmapData,bitmapData.rect,pt,">",0,0xFF00000F) } //绘制对象2其缩放比例和位移量由getDrawMatrix()函数计算,并且把不透明处绘制为ct的颜色,并且模式为叠加。如此一来两个对象重叠的部分颜色值必定大于0xFF00000F。 bitmapData.draw(target2, BitmapHitTestPlus.getDrawMatrix(target2, hitRectangle , scaleX , scaleY ),ct, BlendMode.ADD); //把所有颜色值大于0xFF00000F的部分(也就是重叠部分)重新替换为不透明红色方便后面getColorBoundsRect()方法计算尺寸。这里替换的原因是getColorBoundsRect()不支持范围取色而只支持单色计算。 //对象1缩放后可以重新替换掉透明色,但是对象2则无法使用同一方法,但是对象2由于也是经过缩放绘制也会有半透明像素,那么重叠部分虽然全部大于0xFF00000F,但未必是统一的。 var hits:int=bitmapData.threshold(bitmapData,bitmapData.rect,pt,">",0xFF00000F,0xFFFF0000) //判断红色区域尺寸 var intersection:Rectangle=bitmapData.getColorBoundsRect(0xFFFFFFFF, 0xFFFF0000); // bitmapData = null //如果红色区域宽度不为0,即bitmapData中含有红色像素。此时说明对象1和对象2在此次判定中有重叠有碰撞 if(intersection.width!=0){ //如果纵横缩放比例有任意一个不是原始尺寸 if(scaleX>1||scaleY>1){ //并且红色像素的数量比较少,对象1和对象2的碰撞面积比较小的话 if(hits<=(scaleX+scaleY)*1.5){ //由于bitmapData的宽高坐标都是以整数表示,那么经过缩放后取整的区域势必回又可能在取整的时候把真正可能产生碰撞的区域忽略。 //所以要进行下一次检测时候适当的把检测区域扩大xadd和yadd就是这个扩大的系数 var xadd:int=.5 var yadd:int=.5 //下次检测时候bitmapData的期望大小 var nextW:int=BitmapHitTestPlus.tileSize var nextH:int=BitmapHitTestPlus.tileSize //如果此次判定发现碰撞区域和bitmapData尺寸相同,那么在计算下次需要判断区域时候会和此次的区域相同,那么判断结果可能会和此次结果相同。这样则会引起堆栈上溢的情况,为了避免该情况发生,将缩小判断的尺寸扩大一倍进行再次检测。 if(intersection.width!=nowW){ nextW=BitmapHitTestPlus.tileSize }else{ nextW=nowW*2 } if(intersection.height!=nowH){ nextH=BitmapHitTestPlus.tileSize }else{ nextH=nowH*2 } //根据检测出来的缩的碰撞区域来计算未缩小的碰撞区域大小以方便下一次计算的时候缩小检测范围。 oldhitRectangle.x += (intersection.x - xadd) * scaleX oldhitRectangle.y += (intersection.y - yadd) * scaleY oldhitRectangle.width = (intersection.width + xadd*2) * scaleX oldhitRectangle.height = (intersection.height + yadd*2) * scaleY //根据检测期望缩小到的尺寸重新计算缩小倍率 scaleX = (oldhitRectangle.width / nextW) scaleY = (oldhitRectangle.height / nextH) //如果倍率小于2则直接按原始尺寸 scaleX = scaleX < 2 ? 1 : scaleX scaleY = scaleY < 2 ? 1 : scaleY //进行下一次判定 intersection=complexIntersectionRectangle(target1,target2, scaleX , scaleY ,pt,ct,oldhitRectangle,hitRectangle,nextW,nextH) } } } return intersection; } protected static function getDrawMatrix(target:DisplayObject, hitRectangle:Rectangle , scaleX:Number , scaleY:Number ):Matrix { var localToGlobal:Point; var matrix:Matrix; var rootConcatenatedMatrix:Matrix=target.root.transform.concatenatedMatrix; localToGlobal=target.localToGlobal(new Point()); matrix=target.transform.concatenatedMatrix; matrix.tx=(localToGlobal.x - hitRectangle.x) / scaleX; matrix.ty=(localToGlobal.y - hitRectangle.y) / scaleY; matrix.a=matrix.a / rootConcatenatedMatrix.a / scaleX ; matrix.d=matrix.d / rootConcatenatedMatrix.d / scaleY; return matrix; } } }
发表评论
-
greenSock新老库
2012-08-07 13:25 0老库-做项目的时候比新库完全不抖啊 -
Starling开发的游戏源码
2012-07-26 17:13 0Starling开发的游戏源码 -
一个基于STARLING的TOWER塔防游戏
2012-07-24 15:27 0一个基于STARLING的TOWER塔防游戏 -
HttpStatusConfig --一个HTTP 协议返回的 解析说明类
2012-04-18 16:40 0package guwanyuan.qicool.game ... -
[转] [Flash/Flex] 加载SWF性能VS影片剪辑性能
2012-03-15 22:29 0http://bbs.9ria.com/viewthread. ... -
水果忍者鼠标跟随特效制作[转载]
2012-03-01 16:06 2481实现这效果其实比较简单,主要是思路~! package ... -
greensock-as3
2012-02-23 21:26 0greensock-as3 -
禁止输入文本可以粘贴
2012-02-10 13:15 2341//禁止输入文本粘贴动作 private static ... -
江湖情缘游戏里的跳的类
2012-02-08 23:55 0package com.app.role.montions ... -
ColorMatrixFilter - 获得相应颜色的色调 函数
2012-02-08 23:03 0/**获得相应颜色的色调的滤镜**/ public sta ... -
[教程] 路点导航(Waypoint Navigation)
2011-12-31 00:51 0前言:这个不难,所以知道的童鞋不要喷,不知道的童鞋也不要怕,要 ... -
ARPG游戏引擎设计思路
2011-12-31 00:48 00.整体结构 下载 (32.92 KB ... -
Flash_Rich_Text_Editor(完美的富文本编辑器)
2011-12-27 17:55 0Flash_Rich_Text_Editor(完美的富文 ... -
弹弹堂测试
2011-12-08 04:21 0弹弹堂测试弹弹堂测试 -
一些DEMO
2011-11-28 17:42 0一些DEMO一些DEMO -
[转]三次贝尔曲线
2011-11-10 01:09 1954http://bbs.9ria.com/viewt ... -
[心得] 完美解决as3在ie中初始化时stageWidth和stageHeight为0的问题
2011-11-03 00:46 2963先看下面的一段脚本,这是比较经典的初始化脚本: pa ... -
五子棋算法详解
2011-10-31 04:14 0五子棋算法详解五子棋算法详解五子棋算法详解 -
[转]服务器端ActionScript语言参考
2011-10-31 00:29 0服务器端ActionScript语言参考 -
Flash Player和Adobe AIR内部的垃圾回收机制
2011-10-29 22:37 0资讯类型: 翻译 来源页面: http://www.ad ...
相关推荐
通过对这些源码的学习和理解,开发者可以掌握在Cocos2d-x环境中实现像素级碰撞检测的方法,这对于开发需要精确碰撞检测的游戏至关重要。同时,这也有助于提升开发者对游戏物理引擎和图像处理的理解。
基于距离的碰撞算法是一种优化过的碰撞检测方法,尤其适合于地图区域相对较小的游戏场景。这类算法通常比传统的矩形或圆形碰撞检测更为精确,能够处理更复杂的形状,并且计算效率相对较高。 **基于距离的算法基础**...
1. **应用范围**:矩阵碰撞算法适用于2D场景,如像素艺术游戏、物理引擎等。对于3D环境,通常需要使用更加复杂的碰撞检测技术,如包围盒(AABB)、OBB(轴对齐包围盒)或球体碰撞。 2. **优化**:为了进一步提高...
在ActionScript 3.0(AS3.0)中,像素级别的精确碰撞检测是一种高级技术,用于游戏开发或任何需要精确交互的项目。通常,AS3.0中的基本碰撞检测基于对象的边界框,但这种方法可能无法处理非矩形形状或具有透明度的...
2. **封装好的类**:描述中提到的"封装好的类"通常指的是已经编写好并优化过的像素碰撞检测类库,开发者可以直接引入并使用,无需从零开始编写代码。这类类库通常包含高效的数据结构和算法,可以快速地进行像素比较...
对于大多数游戏场景来说,可能更加适合使用基于矩形包围盒的检测算法,而对于需要精确碰撞的游戏元素(如复杂多边形或不规则形状),像素检测算法则成为了必要的选择。 总结来说,像素检测算法以其精确性在某些特定...
位图的碰撞检测是Flash开发中的一个重要技术,尤其在游戏制作和交互式应用程序中不可或缺。...然而,要注意的是,高效的碰撞检测往往需要对算法和数据结构有深入的理解,以便在保证精度的同时,尽可能减少计算开销。
此外,这些方法可能只报告潜在碰撞集,精确碰撞检测还需CPU介入。 本文提出了一种基于GPU的碰撞检测算法,它利用几何图像(Geometry Image)表示几何模型,实现实时生成GPU优化的包围体四叉树层次结构。几何图像的...
在Flash中,常见的碰撞检测方法包括矩形碰撞检测(Rectangular collision)、精确形状碰撞检测(Exact shape collision)以及像素级碰撞检测(Pixel-perfect collision)。 2. **矩形碰撞检测**: 这是最简单也最...
通过采用高效的碰撞检测技术和算法优化策略,可以显著提升游戏的用户体验,使游戏更加逼真、流畅。未来的研究还可以进一步探索更高级的碰撞检测方法,如物理引擎集成、机器学习辅助等,以应对越来越复杂的游戏环境。
像素碰撞检测是最精确但也是最耗时的方法,它需要遍历两个图形的每个像素来确定是否有重叠。这种方法适用于复杂形状的游戏对象,如带有透明部分的图像。由于需要检查的像素数量庞大,通常只在必要时使用,例如对于...
在DirectDraw中,可以利用GDI函数或者自定义的像素级扫描算法实现这种检测。 2. **近似碰撞检测**:对于更复杂的形状,如多边形,可能需要使用更高级的技术,如分离轴定理(Separating Axis Theorem,SAT)。该定理...
- `碰撞检测2.fla`:可能进一步展示了如何处理复杂形状的碰撞检测,可能涉及分离轴定理或其他多边形碰撞算法。 - `碰撞检测3.fla`:可能是对前两个示例的拓展,例如增加了动态物体的碰撞响应或者优化了检测性能。 ...
`vc+gdi没用directx.txt`可能包含了项目的整体结构和GDI相关的函数调用,而"场景移动+像素碰撞"可能是具体的实现细节,比如移动函数和碰撞检测算法。 六、实际应用 尽管DirectX在游戏开发中更为常见,因为它提供了...
6. **性能优化**:在处理大量物体时,可以使用包围盒(如AABB - Axis Aligned Bounding Box)进行初步筛选,减少不必要的精确碰撞检测。 这个项目中的代码可能包含这些概念的具体实现,通过阅读和理解代码,你可以...
这可以提高效率,避免对每个像素进行精确的碰撞检测。 6. **最近点对问题**:在一组点集中找到最近点对的算法,是数据结构和算法设计的经典问题,它有多种高效的解决方案,如平面扫描算法、kd树等。 7. **向量和...
这可以通过边界框检测、距离计算或者像素级别的精确碰撞检测实现。 - 消除策略:消除策略是祖玛游戏的关键,通常使用贪心算法或深度优先搜索(DFS)等方法寻找最佳消除路径。对于更复杂的局面,可能还需要结合动态...
在实际开发过程中,开发者会遇到各种挑战,如优化帧率、提高游戏性能、调试碰撞检测算法等。这要求开发者不仅要有扎实的JAVA编程基础,还要具备良好的问题解决能力。 FlappyBird_shh4这个文件可能是项目源码的一...
具体到“qipao.fla”,我们可以假设它可能包含了自定义的碰撞检测算法,以提供更加精确和有趣的碰撞效果。 总的来说,这个“FLASH 经典碰撞 类似屏保”的项目展示了Flash和AS3在创建互动内容方面的潜力,尤其是对于...