代码之家  ›  专栏  ›  技术社区  ›  jmacedo

Actionscript 3像素完美碰撞。怎么做(学习目的)

  •  1
  • jmacedo  · 技术社区  · 15 年前

    我知道有人在那里为这个创建类(即 http://coreyoneil.com/portfolio/index.php?project=5 ). 但我想自己学习如何去做,这样我就能以我需要的方式创造我需要的一切。

    我想先做一个hitTestObject,然后如果这是正数,我会研究movieclips矩形之间的交集,以产生像素冲突。 但还有另一个问题(电影嘴唇的旋转)。。。

    ……我需要一些启示来教我怎么做。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Mahir    15 年前

    如果使用具有透明度的BitmapData对象,则可以使用 BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean .

    您将不得不从全局坐标转换为局部位图数据坐标,这将需要一点数学知识,如果它是旋转的。这很容易实现(在wiki上查找仿射变换以获取更多信息):

    var coordTransform:Matrix = new Matrix();
    
    coordTransform.rotate(rotationRadians);
    coordTransform.translate(x, y);
    
    coordTransform.transformPoint(/* your point */);
    
        2
  •  1
  •   Juan Pablo Califano    15 年前

    flash中像素完美碰撞检测的一个经典参考是 Grant Skinner's article . 它是AS2,但是AS3的逻辑是相同的(如果您稍微搜索一下,就有可用的端口)。

    关于位图数据 x y 如果你仔细想一想,与0不同其实没有什么意义。最简单的处理方法可能是存储 (x,y) var globalPoint:Point = source.parent.localToGlobal(new Point(source.x,source.y))

        3
  •  1
  •   Sly_cardinal    15 年前

    我以前使用过Troy Gilbert的像素完美碰撞检测类(改编自Andre Michelle、Grant Skinner和Boulevart),它工作得非常好(处理旋转、不同的父对象等):

    http://troygilbert.com/2007/06/pixel-perfect-collision-detection-in-actionscript3/
    http://troygilbert.com/2009/08/pixel-perfect-collision-detection-revisited/

    从那以后,他还联系到了这个项目(我没用过,但看起来真的令人印象深刻):

    http://www.coreyoneil.com/portfolio/index.php?project=5

        4
  •  0
  •   jmacedo    15 年前

    我终于做到了,而且我已经为碰撞检测、碰撞角度和其他附加功能编写了类。

    最令人困惑的过程可能是正确对齐位图以进行比较。当我们把一个movieclip()绘制成位图数据时,如果我们把child()添加到相应的位图中,我们可以看到它的一部分是不可见的。它似乎是从中心到右和向下只绘制,留下顶部和左侧部分远离beeing绘制。解决方案是在draw方法的第二个参数中给出一个变换矩阵,它对齐位图并使其全部被绘制出来。

    这是我的类中创建位图以进行比较的函数的示例:

        static public function createAlignedBitmap(mc: MovieClip, mc_rect: Rectangle): BitmapData{
                    var mc_offset: Matrix;
                    var mc_bmd: BitmapData;
    
                    mc_offset = mc.transform.matrix;
                    mc_offset.tx = mc.x - mc_rect.x;
                    mc_offset.ty = mc.y - mc_rect.y;
                    mc_bmd = new BitmapData(mc_rect.width, mc_rect.height, true, 0);
                    mc_bmd.draw(mc, mc_offset);
    
                    return mc_bmd;
    }
    

    为了使用它,如果你在时间线上,你需要:

    className.createAlignedBitmap(myMovieClip, myMovieClip.getBounds(this))
    

    此方法与此处显示的非常相似 http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

    顺便说一句,如果你对这件事感兴趣的话,请检查一下我的另一个问题,我一会儿就贴出来。