我正在制作简单的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;
}}
答案 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
的额外电话可以轻松解决您的滞后问题。