Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > Движение объекта на стрелки клавиатуры


Автор: PPie 8.12.2010, 00:39
Написал код для движения объекта на стрелки клавиатуры(в коде по стрелке влево), пересмотрел стопитсот раз,  не пойму почему не работает. Подскажите пожалуйста)Здесь это объект _player2, изначально был типа Sprite, потом MovieClip, никак не работает. Работаю в adobe flash bulider 4, пробовал в adobe flash cs3(по урокам easyflash) - тоже ничего не выходит. Может это быть из за работы с ноутбука?
Код

package
{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.text.TextField;
    import flash.ui.Keyboard;
    
    
    public class arkanoid extends Sprite
    {
        private var _player1:Sprite = new Sprite();
        private var _player2: MovieClip = new MovieClip();
        private var _ball:Sprite = new Sprite();
        private var _stage:Sprite = new Sprite();
        public function arkanoid()
        {
            _stage.graphics.beginFill(0x000000);
            _stage.graphics.drawRect(40, 5, 400, 370);
            _stage.graphics.endFill();
            addChild(_stage);
            _player1.graphics.beginFill(0xff0000);
            _player1.graphics.drawRect(200, 10, 80, 5);
            _player1.graphics.endFill();
            addChild(_player1);
            _player2.graphics.beginFill(0xff0000);
            _player2.graphics.drawRect(200, 350, 80, 5);
            _player2.graphics.endFill();
            addChild(_player2);
            _ball.graphics.beginFill(0xff0000);
            _ball.graphics.drawCircle(240,180,5);
            _ball.graphics.endFill();
            addChild(_ball);
                                          stage.focus =  this;
            addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        }
        public function onKeyDown(e:KeyboardEvent):void
        {
            if (e.keyCode == 37)
            {
                _player2.x --;
                
            }
        }
    }
}

Автор: SoWa 8.12.2010, 08:24
Вот у тебя реакция на событие клавиатуры. Доведи её до такого вида:
Код

public function onKeyDown(e:KeyboardEvent):void
{
   trace("key down event!");
   if (...)...
}

И посмотри, а будет ли событие вызываться ;)
Потому что слушатель ты непонятно куда навешиваешь : addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
Может он на stage повесился, может на arkanoid, может ваще никуда не повесился.

Автор: PPie 8.12.2010, 11:20
В консоль ничего не выводится ) Куда же нужно повесить слушатель? Делал элементарный пример из книги, тоже ничего в консоль не выводилось

Автор: SoWa 8.12.2010, 18:03
А щас и посмотрим... Хоть я флеш только для рисования использую, не могу в нем кодить
Вот так работает: 
Код

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

function onKeyDown(e:KeyboardEvent):void
        {
            if (e.keyCode == 37)
            {
                trace("koo");
            }
        }

В консоль выводятся сообщения, что правда, ивент случился, и даже опознает, какую кнопочку нажали.
Так как я флеш использую как рисовалку, то возникает закономерный вопрос: а если в фокусе окажется ченить другое, например кнопка - как будет вести себя этот обработчик события?
Кидаем на сцену кнопку, даем ей имя button1(Дельфийская привычка детства), и немного модифицируем обработчик события:
Код

function onKeyDown(e:KeyboardEvent):void
        {
            if (e.keyCode == 37)
            {
                button1.label=Math.random().toString();
            }
        }

Теперь в любом случае - что кнопка в фокусе, что нет - реакция на событие есть, и мы это можем наблюдать воочию smile

Удачных экспериментов!

Автор: zodiac 8.12.2010, 18:15
Не работало потому, что слушатель вешался не на глобальный объект, а на объект выше по цепочке видимости и как только этот объект терял фокус событие, само-собой, не выполнялось. 
Как уже сказал SoWa,
Код

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownListener);


PS Я бы советовал использовать для имени листенера не onKeyDown, a более "политкорректное", так скажем) например, onKeyDownListener.

Автор: PPie 8.12.2010, 22:51
Всем спасибо)))на некоторый период времени забыл что консоль в фб только через дебаггер пашет)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)