我一直试图找出如何阻止玩家移动正确的方式。然而,我现在一直在做的方式,阻止玩家移动。 我希望玩家在接触到区块碰撞区域的一侧时停止水平移动,如果它接触到区块的碰撞区域的顶部或底部,我希望它仅停止垂直移动。因此,当您触摸侧面时,您仍然可以上下移动,当您触摸顶部或底部时,您可以左右移动。感谢。
if (player.collisionArea.hitTestObject(block.collisionArea))
{
player.y -= vy;
player.x -= vx;
}
答案 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
/ x
和y
将其值围绕到&#34; twips&#34;,以便vx
添加和减去vy
并且var s:Sprite = new Sprite();
s.x = 1.1925;
trace(s.x); // 1.15
不一定会导致对象完全回到原始位置。这可能会导致物体卡在墙壁等问题。声音奇怪?试试这个:
DisplayObject
因此,为了避免这种情况,您可以单独存储位置,而不是依赖x
y
和var 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()
。基于纯数学的碰撞检测是更多的设置工作,但更灵活,在我的经验更可预测。或许只是对未来的想法!