调整影片剪辑AS3的大小

时间:2013-03-31 13:25:51

标签: actionscript-3 resize movie clip

好吧,所以我有一个Flash游戏,一个平台游戏。在这个游戏中你必须跳过尖峰。所以我创建了尖峰并将其转换为符号,电影剪辑。当它注册为电影剪辑时,它不是一个三角形(比如尖刺)而是一个矩形。这意味着当玩家去避开尖刺和跳跃时,如果他太近了他就死了,但他没有击中尖刺,他击中了看不见的尖刺周围的矩形。无论如何都要改变影片剪辑的形状,使其适合长钉和尖钉。

4 个答案:

答案 0 :(得分:1)

你可以使用hittest,这是一个使用示例

http://www.foundation-flash.com/tutorials/as3hittesting/

答案 1 :(得分:0)

根据我处理相同类型问题的经验,您无法真正使用AS3 hitTestObject(如果您遇到此问题,我会想象您正在使用) MC的具体形状。它总是默认为占用动画片段本身空间的盒子。

所以要回答你的问题,不,你不能改变MC的形状以使其仅为尖峰,默认情况下hitTestObject使用MC周围的边界框。

有很多方法可以解决这个问题(很多人建议不要使用hitTestOjbect,因为它不是非常有效,而是编写自己的命中测试代码。我建议在线寻找这个例子,有很多)。

如果你不想处理它,你的另一个选择就是创建一个独立的盒形mc系列作为你的边界框,可以排列成阵列然后运行循环查看你的角色是否正在击中其中任何一个。这样,您可以根据需要调整边界框大小。

但是如果你想使用hitTestObject,遗憾的是你必须使用整个对象边界框。由于我不完全确定你如何处理这个细节,我最好的建议是上网并阅读AS3中点击检测的基础知识。

您的问题在于点击检测,不一定是影片剪辑。

答案 2 :(得分:0)

对象之间的内部命中测试将检查对象的边界框,这样对你不起作用。

如果你能以某种方式使用玩家代理作为一个点(最低点,如他的中间脚或类似的东西),你可以使用spike.hitTestPoint(globalFootX, globalFootY, true);

如果这不起作用,您必须手动创建项目的hittest-representation并执行您自己的hittest逻辑。

另一个解决方案是将项目绘制为单独的精灵,然后查看像素是否重叠。我知道我是在一个旧的AS2项目中做到这一点的,不规则形状的AI机器人在不规则形状的世界中移动。

我将提供该代码供参考,它可能可以转换为AS3,或者至少您可以将其用作谷歌搜索的灵感,以便在AS3中找到该解决方案。

class messer_studios.utils.CollisionDetection {
    static public function checkForCollision(p_clip1:MovieClip, p_clip2:MovieClip, p_alphaTolerance:Number):Rectangle {     
        // set up default params:
        if (p_alphaTolerance == undefined) {
            p_alphaTolerance = 255;
        }

        // get bounds:   
        var bounds1:Object = p_clip1.getBounds(_root);
        var bounds2:Object = p_clip2.getBounds(_root);

        // rule out anything that we know can't collide:
        if (((bounds1.xMax < bounds2.xMin) || (bounds2.xMax < bounds1.xMin)) || ((bounds1.yMax < bounds2.yMin) || (bounds2.yMax < bounds1.yMin))) {
            return null;
        }
        //Debug.log("might collide");

        // determine test area boundaries:   
        var bounds:Object = {};
        bounds.xMin = Math.max(bounds1.xMin, bounds2.xMin);
        bounds.xMax = Math.min(bounds1.xMax, bounds2.xMax);
        bounds.yMin = Math.max(bounds1.yMin, bounds2.yMin);
        bounds.yMax = Math.min(bounds1.yMax, bounds2.yMax);

        // set up the image to use:
        var img:BitmapData = new BitmapData(bounds.xMax-bounds.xMin, bounds.yMax-bounds.yMin, false);

        // draw in the first image:
        var mat:Matrix = p_clip1.transform.concatenatedMatrix;
        mat.tx -= bounds.xMin;
        mat.ty -= bounds.yMin;
        img.draw(p_clip1, mat, new ColorTransform(1, 1, 1, 1, 255, -255, -255, p_alphaTolerance));

        // overlay the second image:
        mat = p_clip2.transform.concatenatedMatrix;
        mat.tx -= bounds.xMin;
        mat.ty -= bounds.yMin;
        img.draw(p_clip2, mat, new ColorTransform(1, 1, 1, 1, 255, 255, 255, p_alphaTolerance), "difference");

        // find the intersection:
        var intersection:Rectangle = img.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF);
        // if there is no intersection, return null:
        if (intersection.width == 0) {
            return null;
        }

        // adjust the intersection to account for the bounds:   
        intersection.x += bounds.xMin;
        intersection.y += bounds.yMin;
        return intersection;
    };

    public static function hitTestShape(mc1:MovieClip, mc2:MovieClip, alphaTolerence:Number):Boolean {
        return checkForCollision(mc1, mc2, alphaTolerence) != null ? true : false;
    }
}

答案 3 :(得分:0)

您可以使用BitmapDatahitTest来检查像素级别的碰撞。

(为了测试代码,在Flash舞台上放置两个符号,“rectClip”和“spike”。还要先测试它,然后再将它们移开,然后再触摸它们进行测试。)

(无论哪种方式,您都可以设置MouseMovestartDrag()并进行检查。)

var rect:Rectangle = rectClip.getBounds(this);
var rectClipBmpData = new BitmapData(rect.width, rect.height, true, 0);
rectClipBmpData.draw(rectClip);

var spikeRect:Rectangle = spike.getBounds(this);
var spikeBmpData = new BitmapData(spikeRect.width, spikeRect.height, true, 0);
spikeBmpData.draw(spike);

if(rectClipBmpData.hitTest(new Point(rectClip.x, rectClip.y),
                                 255,
                                 spikeBmpData,
                                 new Point(spike.x,spike.y),
                                 255 ))
{
     trace("hit");
}else
{
     trace("No hit");
}

祝你好运。