动作脚本 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 <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 的情况下直观地切换到框架?
动画未在 actionscript 3.0 (flash cc) 中启动
ActionScript 3 AS3 gotoAndStop下一帧有循环