为啥这段代码不检测对角线运动?

Posted

技术标签:

【中文标题】为啥这段代码不检测对角线运动?【英文标题】:why doesn't this code detect diagonal motion?为什么这段代码不检测对角线运动? 【发布时间】:2015-05-17 22:36:36 【问题描述】:

“玩家”是一个对象,当我按下箭头键时,它会向上、向下、向左和向右移动。

当我同时按下向上和向左键或任何其他几个键时,“播放器”不会沿对角线移动。

我正在使用 Adob​​e 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

以上是关于为啥这段代码不检测对角线运动?的主要内容,如果未能解决你的问题,请参考以下文章

从平移手势切割对角线运动

python控制窗口对角线运动

pygame中奇怪的矢量运动

Unity 2D Top Down Shooter 运动问题 C#

Unity FPS 运动

为啥这个运动检测代码不起作用?