动作脚本3.动画在gotoAndStop()之后永远循环,并且在角色发生碰撞时在动画期间滞后

时间:2013-09-18 22:43:54

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

我正在制作简单的Flash游戏。我有问题,动画循环永远我用户gotoAndStop()后我在动画期间滞后,如果角色与地面或任何阶段发生碰撞(如果角色在空中飞行没有任何滞后)

这是碰撞清单:

var myCollisionList:CollisionList = new CollisionList(Hero);
myCollisionList.addItem(ground);
myCollisionList.addItem(ground3);
myCollisionList.addItem(ground5);
myCollisionList.addItem(ground4);

这是我用动画跳转的代码部分。

if(Hero.y_speed>0 && myCollisionList.checkCollisions().length > 0 )
{
    Hero.y_speed=0;
    Hero.x_speed=0;

    if(space)
    {
        if (ground.hitTestPoint(Hero.x + 28, Hero.y+20, true))
        {
            Hero.gotoAndStop("attack");
            stop();
            Hero.y_speed = -20;
        }
    }
}

更新 地图截图:

map

更新2:

以下是移动角色左侧(右侧相同)侧面的代码的一部分,我知道它很可怕,但我不知道如何让它变得更好。

pakopos - CollisionList的名称

fonas - 背景

    var pakopos:CollisionList = new CollisionList(Hero);
    pakopos.addItem(ground);
    pakopos.addItem(ground3);
    pakopos.addItem(ground5);
    pakopos.addItem(ground4);

if(left){

    Hero.x_speed = -walkspeed;

    setDirection(1);

    if(pakopos.checkCollisions().length > 0) {

    if (ground5.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {                  
        trace("Touching left side - ground5");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
        }
    else if (Enemy.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {
        trace("Touching Enemy");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
        }
    else if (ground3.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {
        trace("Touching left side - ground3");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
        }
    else if (ground4.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {
        trace("Touching left side - ground4");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
    }else
    {
        Hero.x_speed = 0; 
        ground5.x += 4;
        ground4.x += 4;
        ground3.x += 4;
        fonas.x += 4;
        Enemy.x += 4;

    }}
    else {
        ground5.x += 4;
        ground4.x += 4;
        ground3.x += 4;
        fonas.x += 4;
        Enemy.x += 4;

    }}

1 个答案:

答案 0 :(得分:0)

你的代码非常神秘,所以很难说没有实际调试它会发生什么,但我的猜测是你每次发布代码时都会多次检查冲突。您应该检查您使用的checkCollisions()函数的文档,因为它似乎返回了一系列结果。它可能会为您提供在碰撞列表中的对象中发现的所有碰撞,因此您不必在之后直接调用hitTestPoint()

修改

我不熟悉您在代码中使用的CDK,但它会返回一个碰撞结果数组,其中每个结果都有碰撞对象,它们的角度以及它们是否重叠。对于你想要做的事情,它似乎是一种矫枉过正,但正如我所说,我不熟悉它 - 它可能比hitTestPoint()快得多。

我建议只使用一种命中测试方法 - 使用CDK或使用hitTestPoint()但不能同时使用两者。两者都会给你像素完美的检测结果。如果您使用CDK,请阅读有关checkCollisions()工作原理的文档。你必须做这样的事情:

...
var oResults:Array = pakopos.checkCollisions();
var nCount:int = oResults.length;

if (nCount > 0)
{
    for ( var i:int = 0; i <nCount; i++ )
    {
        var oHit:Object = oResults[i];

        // TODO check `oHit.object1` and `oHit.object2` to see which objects
        // collided and do something based on that
        // You may have multiple results since your hero may collide with
        // 'ground' and 'ground4' at the same time.
    }
}

CDK的碰撞组(pakopos)设置似乎已关闭 - 您无需确定组中所有对象之间是否存在冲突 - 我假设您不关心{{ 1}}与ground发生碰撞,但您已将两者都添加到碰撞列表中。

我认为(不确定)ground4尝试检查组中的所有对象与所有其他对象。你需要的是检查一个对象(checkCollisions())对象列表(各种地面对象)。这是支票数量之间的巨大差异。这个和Hero的额外电话可以轻松解决您的滞后问题。