0

我正在创建简单的 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;
        }
    }
}

更新: 地图截图:

地图

更新 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;

    }}
4

1 回答 1

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) 设置似乎已关闭 - 您不必确定组中的所有对象之间是否存在碰撞 - 我假设您不在乎是否发生ground碰撞,ground4但您将两者都添加到了碰撞列表中.

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

于 2013-09-18T23:24:50.357 回答