如何使用vx和vy碰撞检测对象?

时间:2015-02-15 06:48:02

标签: actionscript-3

我一直试图找出如何阻止玩家移动正确的方式。然而,我现在一直在做的方式,阻止玩家移动。 我希望玩家在接触到区块碰撞区域的一侧时停止水平移动,如果它接触到区块的碰撞区域的顶部或底部,我希望它仅停止垂直移动。因此,当您触摸侧面时,您仍然可以上下移动,当您触摸顶部或底部时,您可以左右移动。感谢。

if (player.collisionArea.hitTestObject(block.collisionArea))
{
    player.y -= vy;
    player.x -= vx;
}

2 个答案:

答案 0 :(得分:0)

首先,这个问题非常真实 - 只是为了下一次,请确保澄清问题的背景(即我正在制作带有动作脚本2d图形的游戏,等等等等等等。

无论如何,我会复制你在我开发javascript游戏当天写回的代码的一部分。由于我不知道你的对象是如何排列的,我将以一种只引入通用算法的方式对其进行修改。

// player: a class that holds an array of moves, and other relevant information. Varys on your program.
var optimizePosition = function (player) {
    //after each time the player attempts to move, i check if he touches of the blocks. if he does, i move him back. 
   foreach(Block block in blocks)// replace this with an iterator for all the blocks
   {
   if (player.x-block.x < 32 ||  player.y-block.y < 32 ) // if player is touching a block:
        undoLastMove(getLastMove(player),player);

    }
     // a little extra: always good to check if he's going out of the screen in the same function:

    if(player.x > canvas.width - 64 || player.y > canvas.height - 64)
       undoLastMove(getLastMove(player),player);
}

每次玩家移动时,我都会调用该函数:

optimizePosition(player);

undoLastMove(player)的内容将包含您在上面编写的代码。

答案 1 :(得分:0)

您的基本方法是移动物体,测试当前位置是否击中障碍物,然后将其移回障碍物。这可以适用于非常容易地分离出x和y轴(为了清晰起见,减少了代码):

player.x += vx;
if(player.hitTestObject(block)){
    player.x -= vx;
}

player.y += vy;
if(player.hitTestObject(block)){
    player.y -= vy;
}

然而,这可能存在问题。首先,DisplayObject / xy将其值围绕到&#34; twips&#34;,以便vx添加和减去vy并且var s:Sprite = new Sprite(); s.x = 1.1925; trace(s.x); // 1.15 不一定会导致对象完全回到原始位置。这可能会导致物体卡在墙壁等问题。声音奇怪?试试这个:

DisplayObject

因此,为了避免这种情况,您可以单独存储位置,而不是依赖x yvar oldPosition:Point = new Point(player.x, player.y); player.x += vx; if(player.hitTestObject(block)){ player.x = oldPosition.x; } player.y += vy; if(player.hitTestObject(block)){ player.y = oldPosition.y; } 属性。

hitTestObject()

其次,我想我会提到虽然hitTestObject()是一个方便的API来检查两个显示对象边界矩形的交集,但根据我的经验,当你将它与运动和碰撞响应混合时,它开始崩溃,因为它依赖于显示器的状态,这种状态受到歪斜四舍五入的影响,并且时间不灵活(例如,您可以投射所有动作,然后检查碰撞,因为您需要移动您的显示对象从hitTestObject()获得有效结果。 IMO更好的方法是使碰撞检测纯粹基于数学,例如圆形交叉/距离检查。 {{1}}真正做的就是基于显示对象边界Rectangle/intersects()。基于纯数学的碰撞检测是更多的设置工作,但更灵活,在我的经验更可预测。或许只是对未来的想法!