Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с клавиатурой (http://www.flasher.ru/forum/showthread.php?t=107117)

andrey_x 25.01.2008 21:47

Работа с клавиатурой
 
Кто может подсказать... как нормально обрабатывать клавиатуру(для игры)..

если вешать листенер на KeyboardEvent.KEY_DOWN, а потом в функции проверять по принципу
Код:

if (e.keyCode==37) {
this.x-=8;
}
if (e.keyCode==39) {
this.x+=8;
}
if (e.keyCode==32) {
trace(5);
}

то например, если зажать одну кнопку, а потом нажать другую - то действие первой перестает обрабатываться....

это ж стандартный момент для игр.... должно быть какое-то простое решение... (а то я уже придумал сложное :) )


зы: сложное решение:

сдалеть переменные-флаги, по KEY_DOWN флаг в true, по KEY_UP - в false
и уже судя по значениям этих флагов судить о том, какие кнопки нажаты в данный момент...

D12 26.01.2008 02:07

Код:

package {
////////       
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.events.Event;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;
////////
  public class Ship extends Sprite {
    private var player:Sprite;
        private var rightArrow:Boolean;
    private var leftArrow:Boolean;
    private var upArrow:Boolean;
    private var downArrow:Boolean;
        private var Go:Number = 5;
        private var Go_di:Number = 0.5*(Math.sqrt(Go*Go+Go*Go));//скорость движения для преодоления гипотенузы равной по длинне Go
////////
    public function Ship() {
      player = createAvatar(0xFFFF00)
      player.x = 200;
      player.y = 100;
      addChild(player);
      stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
          stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);
          stage.addEventListener(Event.ENTER_FRAME, moveClip);
}
////////
    private function keyPressedDown(event:KeyboardEvent) {
            if(event.keyCode == Keyboard.RIGHT) {
                rightArrow = true;
            }
            if(event.keyCode == Keyboard.LEFT) {
                leftArrow = true;
            }
            if(event.keyCode == Keyboard.UP) {
                upArrow = true;
            }
            if(event.keyCode == Keyboard.DOWN) {
                downArrow = true;
            }
                }
        private function keyPressedUp(event:KeyboardEvent) {
            if(event.keyCode == Keyboard.RIGHT) {
                rightArrow = false;
            }
            if(event.keyCode == Keyboard.LEFT) {
                leftArrow = false;
            }
            if(event.keyCode == Keyboard.UP) {
                upArrow = false;
            }
            if(event.keyCode == Keyboard.DOWN) {
                downArrow = false;
            }
                }
////////
            private function moveClip(event:Event) {
            if (rightArrow) {
                player.x += Go;
            }
            if (leftArrow) {
                player.x -= Go;
            }
            if (upArrow) {
                player.y -= Go;
            }
            if (downArrow) {
                player.y += Go;
                }
                if (downArrow&&leftArrow) {
                player.y += Go_di-Go;
                        player.x -= Go_di-Go;
                }
                if (upArrow&&leftArrow) {
                player.y -= Go_di-Go;
                        player.x -= Go_di-Go;
                }
                if (downArrow&&rightArrow) {
                player.y += Go_di-Go;
                        player.x += Go_di-Go;
                }
                if (upArrow&&rightArrow) {
                player.y -= Go_di-Go;
                        player.x += Go_di-Go;
                }
        }
////////
    private function createAvatar(bgColor:uint):Sprite {
      var s:Sprite = new Sprite();
      s.graphics.beginFill(bgColor);
      s.graphics.drawCircle(0, 0, 40);
      s.graphics.endFill();
      s.graphics.beginFill(0x000000);
      s.graphics.drawCircle(-15, -10, 5);
      s.graphics.drawCircle(+15, -10, 5);
      s.graphics.endFill();
      s.graphics.lineStyle(2, 0x000000, 100);
      s.graphics.moveTo(-20,15);
      s.graphics.curveTo(0,35, 20,15);
      return s;
    }
  }
////////
}

Где то так :)

А вы уверены что не ошиблись разделом ?

andrey_x 26.01.2008 02:31

ну собственно я тоже так сделал, на флагах...
разделом не ошибся - я привел только необходимый код:)
а в AS3 - потому, что в AS2 , была такая штука как isDown - позволяла проверить состояние любой кнопки... я думал может в AS3 какой-то аналог есть...

D12 26.01.2008 23:52

AS3 бюракратический язык, то что не написано существовать не может, а так всё так же:)

Ajshma 28.01.2008 09:39

Андрей, не вижу разницы между проверкой состоянием определенных клавиш в Ас2 и проверкой KeyboardEvent в Ас3, которая ничем не хуже.


Часовой пояс GMT +4, время: 18:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.