почему этот код не обнаруживает диагональное движение?

«игрок» — это объект, который перемещается вверх, вниз, влево и вправо, когда я нажимаю клавиши со стрелками.

«игрок» не перемещается по диагонали, когда я нажимаю вместе клавиши «вверх» и «влево» или любую другую пару клавиш.

Я использую 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;

            }

person user2824371    schedule 15.03.2015    source источник


Ответы (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;
}
person Dimitris    schedule 15.03.2015
comment
Большое спасибо за ваш ответ, я хотел бы задать вам несколько вопросов, - person user2824371; 16.03.2015
comment
Я внес некоторые изменения в ваш код, потому что: переменные speedX и speedY являются переменными uInt, которые должны иметь только положительные значения, и они равны отрицательным пяти в операторах IF. поэтому я преобразовал их в :Number. onTick в прослушивателе событий не _on Tick в функции. Я также объявил переменную Key перед функцией onKeyDown, потому что она содержит ошибку. затем после функции я написал следующий код: key = event.keyCode; - person user2824371; 16.03.2015
comment
После моего редактирования, когда я нажимаю CTRL + Enter, чтобы проверить это. объект игрока перемещается по диагонали вниз и вправо (без нажатия каких-либо клавиш), когда я нажимаю клавиши со стрелками, он слушает инструкции. но когда я отпускаю все клавиши, он снова перемещается в направлении отпускания (вверх или вниз, вправо или вверх). Не могли бы вы дать мне руку? - person user2824371; 16.03.2015
comment
Есть предупреждение, я не знаю, вызывает ли эта ошибка проблему, упомянутую выше, или нет. В предупреждении говорится: Проблема миграции: обработчик события onKeyDown не запускается автоматически проигрывателем Flash во время выполнения в Action Script 3.0, вы должны сначала зарегистрировать этот обработчик для события с помощью addEventListener('keyup', callback_handler). Заранее спасибо, - person user2824371; 16.03.2015
comment
Автодвижение игрока, о котором вы упоминаете в своем третьем комментарии, вызвано тем, что переменные speedX и speedY равны 5. Я обновил код, чтобы переменные скорости были равны 0. Теперь о последнем комментарии, я не уверен почему предупреждение. попробуйте импортировать класс KeyboardEvent. импортировать flash.events.KeyboardEvent - person Dimitris; 17.03.2015