AS3。如何在英雄与敌人的动画之间进行良好的碰撞?

时间:2014-01-26 22:15:29

标签: actionscript-3 animation actionscript collision-detection collision

玩家和敌人之间发生碰撞的最佳方法是什么?

在停留动画中,我的玩家的宽度为30px,步行动画为40px,在attack1动画宽度为60px。

现在我使用代码:

if (Enemy.hitTestObject(Hero))
            {
    Enemy.gotoAndStop("attack1");
    }

如果敌人触摸英雄(主角)开始攻击动画。但问题是,如果球员的当前状态处于攻击位置,敌人会留下蚂蚁试图击中。

我需要制作类似敌人的东西,总是检查玩家的“停留”动画宽度,而不是当前的动画。或者你可以建议更好的碰撞技巧?谢谢。

更新 所以如果我有简单的攻击1,我需要在这个函数中调用enterFrameHandler()?这将检查Hero是否与Enemy发生碰撞?或者我需要使用此功能?

if (attack1)
{
            enterFrameHandler();
    Hero.gotoAndStop("attack1");

}

更新2

这是我宣告敌人的方式:

public var Enemy:Priesas = new Priesas; //Priesas is instance name of Enemy

Hero通过点击按钮选择模板:

public function selectHero(what:int):void {
    // this is called with correct "what", design yourself. I use array index
    var whatHero:Class = heroes[what]; // get selected hero symbol
    if (Hero && Hero.parent) Hero.parent.removeChild(Hero);
    // clean up previous hero. Drop listeners here, if any
    Hero = new whatHero(); // get new hero
    // process as usual, don't forget to "addChild(Hero)" somewhere
    create_hero();
}

    function choosePlayer(event:MouseEvent):void {
        selectHero(0);
        start(event);
        }

     function create_hero()
     {
        addChild(Hero);
     }

所以声明的变量是:英雄和敌人

更新3

现在我遇到以下错误:

1120: Access of undefined property enemyClipBmpData.
1180: Call to a possibly undefined method Point.
1120: Access of undefined property heroClipBmpData.
1180: Call to a possibly undefined method GlowFilter.

以下是我的代码现在的样子(我通过创建变量来了解大写字母,但是现在我需要像这样使用)

    public function Script()
    {

        btn_play.addEventListener(MouseEvent.CLICK, start);
        btn_credits.addEventListener(MouseEvent.CLICK, choosePlayer);
        btn_control.addEventListener(MouseEvent.CLICK, start);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
        stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
        addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true); //here added line

    }

    function enterFrameHandler(event:Event):void
    {
        Hero.x = mouseX;
        Hero.y = mouseY;

        if(enemyClipBmpData.hitTest(new Point(Enemy.x, Enemy.y),
                                255,
                                heroClipBmpData,
                                new Point(Hero.x, Hero.y),
                                255

                          ))
        {
            trace("hit");
            Enemy.filters = [new GlowFilter()];
        }
        else
        {
            Enemy.filters = [];
        }
    }

function create_enemy()
        {
            addChild(Enemy);
            var enemyRect:Rectangle = Enemy.getBounds(this);
            var enemyClipBmpData = new BitmapData(enemyRect.width, enemyRect.height, true, 0);
            enemyClipBmpData.draw(Enemy);
            Enemy.x = 10;
            Enemy.y = 420;
        }

     function create_hero()
    {

        addChild(Hero);
        var heroRect:Rectangle = Hero.getBounds(this);
        var heroClipBmpData = new BitmapData(heroRect.width, heroRect.height, true, 0);
        heroClipBmpData.draw(Hero);
        Hero.gotoAndStop("stay");
        Hero.x = stage.stageWidth / 2;
}

1 个答案:

答案 0 :(得分:2)

我相信您可以尝试使用BitmapData.hitTest,例如:

//using your instance name (just using lower case for the instance name)
var enemy:Priesas = new Priesas();
enemy.x = enemy.y = 300;
addChild(enemy);

var enemyRect:Rectangle = enemy.getBounds(this);
var enemyClipBmpData = new BitmapData(enemyRect.width, enemyRect.height, true, 0);
enemyClipBmpData.draw(enemy);

//using your instance name (just using lower case for the instance name)
var hero:Sprite = new Hero();
addChild(hero);

var heroRect:Rectangle = hero.getBounds(this);
var heroClipBmpData = new BitmapData(heroRect.width, heroRect.height, true, 0);
heroClipBmpData.draw(hero);

addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);

function enterFrameHandler(event:Event):void
{
    hero.x = mouseX;
    hero.y = mouseY;

    if(enemyClipBmpData.hitTest(new Point(enemy.x, enemy.y),
                            255,
                            heroClipBmpData,
                            new Point(hero.x, hero.y),
                            255

                      ))
    {
        trace("hit");
        enemy.filters = [new GlowFilter()];
    }
    else
    {
        enemy.filters = [];
    }
}

基于文档:

public function hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean

在一个位图图像与点,矩形或其他位图图像之间执行像素级命中检测。命中被定义为不透明像素上的点或矩形的重叠,或两个重叠的不透明像素。执行命中测试时,不考虑任何对象的拉伸,旋转或其他变换。

如果图像是不透明图像,则此方法被视为完全不透明的矩形。两个图像必须是透明图像才能执行考虑透明度的像素级命中测试。当您测试两个透明图像时,alpha阈值参数控制从0到255的alpha通道值被视为不透明。

<强>参数

  • firstPoint:Point - BitmapData图像左上角在任意坐标空间中的位置。在定义secondBitmapPoint参数时使用相同的坐标空间。

  • firstAlphaThreshold:uint - 此点击测试中被视为不透明的最小Alpha通道值。

  • secondObject:Object - 一个Rectangle,Point,Bitmap或BitmapData对象。

  • secondBitmapDataPoint:Point (default = null) - 定义第二个BitmapData对象中像素位置的点。仅当secondObject的值为BitmapData对象时才使用此参数。

  • secondAlphaThreshold:uint (默认值= 1) - 在第二个BitmapData对象中被视为不透明的最小Alpha通道值。仅当secondObject的值是BitmapData对象且两个BitmapData对象都是透明的时才使用此参数。

<强>返回

Boolean - 如果发生命中,则值为true;否则,错误。

<强>抛出

ArgumentError - secondObject参数不是Point,Rectangle,Bitmap或BitmapData对象。

TypeError - firstPoint为null。