为啥这段代码不检测对角线运动?
Posted
技术标签:
【中文标题】为啥这段代码不检测对角线运动?【英文标题】:why doesn't this code detect diagonal motion?为什么这段代码不检测对角线运动? 【发布时间】:2015-05-17 22:36:36 【问题描述】:“玩家”是一个对象,当我按下箭头键时,它会向上、向下、向左和向右移动。
当我同时按下向上和向左键或任何其他几个键时,“播放器”不会沿对角线移动。
我正在使用 Adobe flash CS5 和动作脚本 3 ( As3 ),你能告诉我解决方案是什么吗?
stage.addEventListener(KeyboardEvent.KEY_DOWN, detectText);
function detectText(myevent:KeyboardEvent):void
var up:Boolean = false;
var down:Boolean = false;
var left:Boolean = false;
var right:Boolean = false;
var speedOfplayer:Number = 5 ;
if (myevent.keyCode==39)
right = true ;
if (myevent.keyCode==37)
left = true ;
if (myevent.keyCode==38)
up = true ;
if (myevent.keyCode==40)
down = true ;
// if(right is true and left is not true)
if( right && !left )
player.x = player.x + speedOfplayer;
// if(up is true and down is not true)
if( up && !down )
player.y = player.y - speedOfplayer;
// if(down is true and up is not true)
if( down && !up )
player.y = player.y + speedOfplayer;
// if(down is true and up is not true)
if( left && !right )
player.x = player.x - speedOfplayer;
// Move diagonally
if( left && up && !right && !down )
player.y = player.y - speedOfplayer;
player.x = player.x - speedOfplayer;
if( right && up && !left && !down )
player.x = player.x + speedOfplayer;
player.y = player.y - speedOfplayer;
if( left && down && !right && !up )
player.x = player.x - speedOfplayer;
player.y = player.y - speedOfplayer;
if( right && down && !left && !up )
player.x = player.x + speedOfplayer;
player.y = player.y + speedOfplayer;
【问题讨论】:
【参考方案1】:你可能把事情复杂化了。这可以通过以下方式完成。 KEY_DOWN 监听器发生的事情是它将报告最后按下的键。所以你需要一个 ENTER_FRAME 监听器来移动对象。并且因为 ENTER_FRAME 将继续调用该函数,前提是您需要捕获是否释放键以将播放器的速度重置为 0。
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
stage.addEventListener(Event.ENTER_FRAME, onTick);
var speedX:uint = 0;
var speedY:uint = 0;
function onKeyDown(event:KeyboardEvent):void
var key:uint= event.keyCode;
if (key == Keyboard.UP)
speedY = -5;
if (key == Keyboard.DOWN)
speedY = 5;
if (key == Keyboard.LEFT)
speedX = -5;
if (key == Keyboard.RIGHT)
speedX = 5;
function onKeyUp(event:KeyboardEvent):void
var key:uint= event.keyCode;
if (key == Keyboard.UP || key == Keyboard.DOWN)
speedY = 0;
if (key == Keyboard.LEFT || key == Keyboard.RIGHT)
speedX = 0;
function onTick(event:Event):void
player.x += speedX;
player.y += speedY;
【讨论】:
非常感谢您的回答,我想请教您一些问题, 我在您的代码中进行了一些编辑,因为:speedX 和 speedY 变量是 uInt,必须只有正值,它们在 IF 语句中等于负五。所以,我将它们转换为:Number。事件监听器中的“onTick”不是函数中的“_on Tick”。我还在函数“onKeyDown”之前声明了变量“Key”,因为它有一个错误。然后,在函数之后我写了以下代码:key = event.keyCode; 编辑后,当我按“CTRL + Enter”进行测试时。当我按箭头键时,“玩家”对象沿对角线向下和向右移动(不按任何键),它会听指令。但是当我释放所有键时,它会再次向释放方向移动(向上或向下或向右或抬起)。请帮帮我好吗? 有一个警告,不知道是不是这个错误导致了上面提到的问题。警告说:“迁移问题:在 Action Script 3.0 中运行时 Flash 播放器不会自动触发 onKeyDown 事件处理程序,您必须首先使用 addEventListener('keyup', callback_handler) 为事件注册此处理程序。提前致谢, 您在第三条评论中提到的玩家的自动移动是因为变量 speedX 和 speedY 等于 5。我已经更新了代码,使速度变量等于 0。现在关于最后的评论,我不确定为什么会有警告。尝试导入键盘事件的类。导入 flash.events.KeyboardEvent以上是关于为啥这段代码不检测对角线运动?的主要内容,如果未能解决你的问题,请参考以下文章