所以我在玩家触摸物体时进行碰撞检测。当它碰到物体时,你会在碰撞时移动和停止,但是,例如,如果我按下D键向右移动,然后我按下A键放开,然后玩家开始在物体中移动。
这是我的播放器移动代码。
public function onKeyDown(event: KeyboardEvent): void
{
if (event.keyCode == Keyboard.D)
{
isRight = true;
}
if (event.keyCode == Keyboard.A)
{
isLeft = true;
}
if (event.keyCode == Keyboard.W)
{
isUp = true;
}
if (event.keyCode == Keyboard.S)
{
isDown = true;
}
}
private function onKeyUp(event: KeyboardEvent): void
{
if (event.keyCode == Keyboard.A || event.keyCode == Keyboard.D)
{
vx = 0;
}
else if (event.keyCode == Keyboard.S || event.keyCode == Keyboard.W)
{
vy = 0;
}
}
public function onEnterFrame(event: Event): void
{
if (isRight)
{
vx = 5;
x += vx;
}
if (isLeft)
{
vx = 5;
x -= vy;
}
if (isUp)
{
vx = 5;
y -= vy;
}
if (isDown)
{
vx = 5;
y += vy;
}
//collision detection
if (player.collisionArea.hitTestObject(wall0))
{
player.x -= vx;
player.y -= vy;
}
}
答案 0 :(得分:0)
您的问题是,vx
始终是5
。因此,您从5
中减去x
的一个方向,即添加它的另一个方向。
然而,在你的碰撞if语句中,你总是从玩家的x
中减去它(如果向左移动,将继续向左移动玩家,直到它超过它碰撞的对象)。
此外,在isLeft
检查中,您正在减去vy
值,但我想您实际上要减去vx
值。同样,在isUp
/ isDown
项检查中,您将vx
var设置为5
,但您似乎应该设置vy
由于不清楚x
和y
在播放器的上下文中会有什么影响,因此很难给出一个确切的代码示例。
最有可能的是,你只需要将玩家移动到墙边缘,然后根据玩家的方向选择侧面:
//collision detection
if (player.collisionArea.hitTestObject(wall0))
{
//if the player x is colliding
if(player.x + player.width > wall0.x && player.x < wall0.x + wall0.width){
player.x = isRight ? wall0.x - player.width : wall0.x + wall0.width;
}else if(player.y + player.height > wall0.y && player.y < wall0.y + wall0.height){
player.y = isDown ? wall0.y - player.height : wall0.y + wall0.height;
}
}