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

Actionscript 3 动作脚本3。在gotoAndStop()之后永远循环动画,并且在角色发生碰撞时在动画期间具有滞后,actionscript-3,flash,animation,actionscript,collision-detection,Actionscript 3,Flash,Animation,Actionscript,Collision Detection,我正在制作简单的flash游戏。我有一个问题,在我使用gotoAndStop()之后,动画会一直循环,如果角色与地面或任何舞台发生碰撞(如果在空中飞行的角色没有任何延迟),则在动画期间会出现延迟 以下是冲突列表: var myCollisionList:CollisionList = new CollisionList(Hero); myCollisionList.addItem(ground); myCollisionList.addItem(ground3); myCollisionList

我正在制作简单的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-冲突列表的名称

fonas-背景


您的代码非常神秘,因此在没有实际调试的情况下很难说出发生了什么,但我猜每次发布的代码运行时,您都会多次检查冲突。您应该检查所使用的
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.
    }
}
。。。
var-oResults:Array=pakopos.checkCollisions();
var nCount:int=oResults.length;
如果(n计数>0)
{

对于(var i:int=0;i),如果代码位于类文件(.as)中,则不需要
stop()
call。在我的另一个回答中,它在那里,因为代码在时间线上,并且环绕着。\sp代码会重复。地面有多大?
ground
?它是位图还是矢量图像?是的,我的代码在.as文件中,所以我如何停止它?我只需要一次动画。地面是(640x60)位图。如果替换
如果(地面.命中测试点(英雄.x+28,英雄.y+20,真))
if(真)
?它仍然滞后吗?你发布的代码似乎还可以-它似乎不是你滞后的根源。如果你在舞台上只有几个物体,它不应该滞后,除非背景中有什么东西。你的帧速率是多少?在简单的“走”过程中,这里也有滞后动画。这意味着跳跃可以解决问题。我不知道帧速率。我以前也没有什么延迟,因为碰撞出了问题,正如您之前所说,可能代码检查碰撞次数过多。pasterlink.me/dl/9546d1这里是link.Script.as是我的主代码,但我不知道您是否会使用它站在我的代码后面…我不知道如何正确地使用
checkCollisions()
而不使用
hitTestPoint()
@RimantėBaltiejūtė我更新了我的答案并提供了更多信息。谢谢你的回答,但我还不太明白如何使用它。你能给我写一个例子让我向左移动吗?现在我使用它:
(var i:int=0;如果玩家在地面上不能向左或向右移动,我和现在将出现问题,因为他们与地面发生碰撞。@RimantėBaltiejūtė在代码中查看CDK.as文件-
findCollisions()
函数就是
checkCollisions()
调用的函数。你也可以向制作CDK的人发帖提问。
...
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.
    }
}