我几乎尝试了所有东西,以便在检测到墙壁时让我的角色停下来。 它仅适用于向上和向右或向下和向左但不是所有4个方向,因此只有一个y运动和一个x运动。 所以我决定制作4个功能,每个方向一个。 但是它只有在按下左键并撞到墙壁时才有效。
我的问题是;我需要做些什么来使碰撞检测阻止角色在所有4个方向上移动? 提前致谢
var leftArrow:Boolean;
var upArrow:Boolean;
var rightArrow:Boolean;
var downArrow:Boolean;
var speed:int = 10;
var hitting:Boolean;
var ismoving:Boolean;
var wallsRect:Rectangle = bounds.getBounds(this);
var charRect:Rectangle = char.getBounds(this);
var boundsBmpData = new BitmapData(wallsRect.width, wallsRect.height, true, 0);
var charBmpData = new BitmapData(charRect.width, charRect.height, true, 0);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
stage.addEventListener(Event.ENTER_FRAME, detectHit2);
stage.addEventListener(Event.ENTER_FRAME, walkingLEFT);
stage.addEventListener(Event.ENTER_FRAME, walkingUP);
stage.addEventListener(Event.ENTER_FRAME, walkingDOWN);
stage.addEventListener(Event.ENTER_FRAME, walkingRIGHT);
boundsBmpData.draw(bounds);
charBmpData.draw(char);
function keyPressed(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT)
{
leftArrow = true;
}
if (event.keyCode == Keyboard.UP)
{
upArrow = true;
}
if (event.keyCode == Keyboard.RIGHT)
{
rightArrow = true;
}
if (event.keyCode == Keyboard.DOWN)
{
downArrow = true;
}
}
function keyReleased(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT)
{
leftArrow = false;
}
if (event.keyCode == Keyboard.UP)
{
upArrow = false;
}
if (event.keyCode == Keyboard.RIGHT)
{
rightArrow = false;
}
if (event.keyCode == Keyboard.DOWN)
{
downArrow = false;
}
}
function walkingLEFT(event:Event):void
{
if (leftArrow && ! hitting)
{
char.x -= speed;
}else
{
hitting = false;
ismoving = false;
}
}
function walkingRIGHT(event:Event):void
{
if (rightArrow && ! hitting)
{
char.x += speed;
}else
{
hitting = false;
ismoving = false;
}
}
function walkingUP(event:Event):void
{
if (upArrow && ! hitting)
{
char.y -= speed;
}
else
{
hitting = false;
ismoving = false;
}
}
function walkingDOWN(event:Event):void
{
if (downArrow && ! hitting)
{
char.y += speed;
}
else
{
hitting = false;
ismoving = false;
}
}
function detectHit2(e:Event):void
{
if(boundsBmpData.hitTest(new Point(bounds.x, bounds.y),
255,
charBmpData,
new Point(char.x, char.y),
255))
{
hitting = true;
ismoving = false;
}
else
{
hitting = false;
bounds.filters = [];
}
}
答案 0 :(得分:2)
上述代码确实不适用于所有其他方向。
侦听器调用的顺序与添加它们的顺序相同。
首先执行detectHit2(),如果有重叠,将设置命中为真。
通过walkingLEFT()检查左边的左边;如果用户没有按下左侧,则变量hitting再次设置为false。
使用额外的walkingXXXX()方法命中将为false,如果按下特定键,将始终调整坐标。
与之前的回答一样,尝试使用1个单事件监听器。
这样的事情:
this.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
function handleEnterFrame(anEvent: Event): void
{
var newx: Number = char.x - (leftArrow ? speed : 0) + (rightArrow ? speed : 0);
var newy: Number = char.y - (upArrow ? speed : 0) + (downArrow ? speed : 0);
if(!boundsBmpData.hitTest(new Point(bounds.x, bounds.y),
255,
charBmpData,
new Point(newx, newy),
255))
{
char.x = newx;
char.y = newy;
}
}
如果您允许播放器按下多个方向键,则可能需要先调整X然后调整Y坐标(因此需要两次hitTest调用)来优化上述代码。因此,当用户按下两个方向键时,字符会在墙壁上滑动,其中一个键会使字符碰到墙壁。
答案 1 :(得分:1)
你的代码有点spagetti-y因此很难遵循,但我会尝试将所有的ENTER_FRAME代码移动到一个函数而不是5.这将删除任何可能的函数被调用的顺序你不期望的。