gpt4 book ai didi

actionscript-3 - AS3 角色只停在一个方向的墙上

转载 作者:行者123 更新时间:2023-12-04 06:10:33 25 4
gpt4 key购买 nike

我尝试了几乎所有方法来让我的角色在检测到墙壁时停下来。
它只适用于 UP 和 RIGHT 或 DOWN 和 LEFT 但不是所有 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 = [];
}
}

最佳答案

上面的代码确实不适用于所有其他方向然后离开。

监听器调用的顺序与您添加它们的顺序相同。

所以首先执行detectHit2(),如果有重叠,它会将hit设置为true。

通过 walkLEFT() 检查左下角;如果用户不按左键,则变量 hit 再次设置为 false。

使用附加的 walkXXXX() 方法命中将是假的,如果按下特定键,坐标将始终被调整。

就像之前的答案所说,尝试使用 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 调用)。因此,当用户按下两个方向键时,char 会滑过墙壁,并且其中一个键不断将 char 撞到墙上。

关于actionscript-3 - AS3 角色只停在一个方向的墙上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com