动作脚本 3. 在 gotoAndStop() 之后动画永远循环,并且在动画过程中当角色发生碰撞时会有延迟

Posted

技术标签:

【中文标题】动作脚本 3. 在 gotoAndStop() 之后动画永远循环,并且在动画过程中当角色发生碰撞时会有延迟【英文标题】:Action Script 3. Animation loop forever after gotoAndStop() and have lag during animation when character have collisions 【发布时间】:2013-09-23 21:06:51 【问题描述】:

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

    

【问题讨论】:

如果您的代码位于类文件 (.as) 中,则不需要调用 stop()。在我的另一个答案中,它在那里是因为代码在时间线上并且环绕。\ sp代码会重复。 ground 有多大?是位图还是矢量图? 是的,我的代码在 .as 文件中,我该如何阻止它?我只需要一次动画。地面是(640x60)位图。 如果将if (ground.hitTestPoint(Hero.x + 28, Hero.y+20, true)) 替换为if(true) 会发生什么?还落后吗?您发布的代码似乎没问题 - 它似乎不是您滞后的根源。如果舞台上只有几个物体,它不应该滞后,除非背景中有东西。你的帧速率是多少? 在简单的“行进”动画中也会出现延迟。那就是说这个和跳跃没关系,问题在其他地方。我不知道帧率。我之前也有一点延迟,因为碰撞有问题,正如你之前所说,可能代码检查碰撞的次数太多了。 【参考方案1】:

您的代码非常神秘,因此如果不实际调试它就很难说出发生了什么,但我猜您每次发布的代码运行时都会多次检查冲突。您应该查看您使用的 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() 的额外调用可以轻松解决您的延迟问题。

【讨论】:

pastelink.me/dl/9546d1 这是链接。 Script.as 是我的主要代码,但我不知道你是否会理解我的代码......而且我不知道如何在没有hitTestPoint() 的情况下正确使用checkCollisions() @RimantėBaltiejūtė 我用更多信息更新了我的答案。 谢谢你的回答,但我不太明白如何使用它?你能给我写个左移的样本吗?现在我使用它:for ( var i:int = 0; i &lt;nCount; i++ ) var oHit:Object = oResults[i]; trace(oResults[i]); ,每次点击“左箭头”时它都会返回[object Object] [object Object] 现在如果玩家停留在地面上不能向左或向右移动会出现问题,因为与地面发生碰撞。 @RimantėBaltiejūtė 查看代码中的 CDK.as 文件 - findCollisions() 函数是由 checkCollisions() 调用的函数。您还可以向制作 CDK 的人发布问题。

以上是关于动作脚本 3. 在 gotoAndStop() 之后动画永远循环,并且在动画过程中当角色发生碰撞时会有延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何在不运行 ActionScript 的情况下直观地切换到框架?

当传统补间在第一秒没有使用stop()时如何解决?

动画未在 actionscript 3.0 (flash cc) 中启动

ActionScript 3 AS3 gotoAndStop下一帧有循环

ActionScript 3 Oman3D - 简单的gotoAndStop按钮功能

我如何使用Movieclip名称数组控制as3中的这些剪辑?