2015-01-03 3 views
0

Я пытаюсь создать виртуальную игру домашнего животного/базового типа. Я должен использовать файлы независимых классов и вызывать их в главном файле игры. Я пытаюсь написать класс для управления моим персонажем, и я могу добавить его на сцену, но не могу, чтобы жизнь меня заставила его двигаться. Я только что потратил 4 часа на просмотр учебников, чтение книг и просто не вижу, чего не хватает. Может ли кто-нибудь предложить мне несколько советов, как заставить это работать? Вот мой код ...Использование нескольких классов для управления символом

Это мой основной класс ...

package { 

    import flash.display.MovieClip; 
    import MainCharacter; 
    import flash.events.KeyboardEvent; 

    public class Tamagotchi extends MovieClip { 

     public function Tamagotchi() { 
      var item:MainCharacter = new MainCharacter(); 
      addChild(item); 
      item.addEventListener(KeyboardEvent.KEY_DOWN, item.KeyPressListener); 
     } 

    } 
} 

Это классовый характер ...

package { 

    import flash.display.MovieClip; 
    import flash.events.KeyboardEvent; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    public class MainCharacter extends MovieClip { 

     var soph: MovieClip = new SophRun; 

     public function MainCharacter() { 
      addChild(soph); 
      soph.x = 200; 
      soph.y = 300;  
      soph.addEventListener(KeyboardEvent.KEY_DOWN, KeyPressListener); 
     } 

     public function KeyPressListener(e:KeyboardEvent):void { 
      if (e.keyCode == 65) 
      { 
       soph.x -= 2; 
      } 
      if (e.keyCode == 68) 
      { 
       soph.x += 2; 
      } 
      if (e.keyCode == 87) 
      { 
       soph.y -= 2; 
      } 
      if (e.keyCode == 83) 
      { 
       soph.y += 2; 
      } 
     } 

    } 
} 

Я переместил EventListener в нескольких местах и все еще не может заставить его работать. Я предполагаю, что у меня что-то не хватает, но не могу понять, что!

+0

Fun проекта TextField и т.д. - в дополнение к ответ ниже, вы создаете экземпляр «Tamagotchi» и добавляете его на сцену? Одна из привычек заключается в том, чтобы использовать инструкции 'trace()' как диагностику, когда вы хотите проверить, что-то происходит - ключевые события и т. Д. Запускаются и т. Д. Также, создавайте быстрые тестовые фильмы, если есть методы и функции, которые вы ранее не использовали, - изучите их, а затем примените к своему проекту. –

+0

Да, я могу получить персонажа на сцене, но все равно не могу заставить его двигаться! Я в тупике. Я попытался использовать имя экземпляра, используя '.this' в начале и даже используя' stage.' в начале. Ничего. Ничего. Я просто этого не понимаю. – ZombieDude

+0

И да, я добавил инструкцию trace к функции keyPressListener и все еще ничего. Это сводит меня с ума! – ZombieDude

ответ

2

Вам необходимо добавить слушателя KeyboardEvent на сцену - в настоящее время он будет работать только в том случае, если ваш персонаж имеет текстовый фокус, чего у него никогда не будет.

Простая настройка, которая мне нравится, она имеет класс Input, который добавляет необходимые прослушиватели событий, и затем вы можете использовать, чтобы проверить, нажаты ли клавиши. Что-то вроде:

public class Input 
{ 
    // handy constants for common keys 
    public static const A:int = 65; 
    public static const B:int = 66; 
    ... 
    public static const LEFT:int = 37; 
    public static const UP:int = 38; 
    public static const RIGHT:int = 39; 
    public static const DOWN:int = 40; 

    private var m_keysPressed:Vector.<Boolean> = null; // the keys currently pressed 

    public function Input(stage:Stage) 
    { 
     // we create our vector for the max number of keys that we're going to support (standard keyboard) 
     this.m_keysPressed = new Vector.<Boolean>(225, true); 

     // add our listeners 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, this._onKeyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, this._onKeyUp); 
    } 

    public function isKeyPressed(key:int):Boolean 
    { 
     if(key < 0 || key >= this.m_keysPressed.length) 
      return false; 
     return this.m_keysPressed[key]; 
    } 

    private function _onKeyDown(e:KeyboardEvent):void 

     this.m_keysPressed[e.keyCode] = true; 
    } 

    private function _onKeyUp(e:KeyboardEvent):void 
    { 
     this.m_keysPressed[e.keyCode] = false; 
    } 
} 

Таким образом, весь ваш код ввода является центральным. Вы можете назвать это с помощью:

if(myInput.isKeyPressed(Input.UP)) 
    // move up 

Польза:

  • Ваш код центральный - легко изменить
  • Легко отключить или включить (функциональность паузы)
  • Вы можете добавить простой обратные вызовы (Dictionary с int ключ и Function значение)
  • Вы можете добавить такие методы, как justPressed(key) или justReleased(key) легко
  • Вы не получает проблему повторяющихся ключей (при удержании клавиши, Flash будет повторять KEY_DOWN события)

Вам может понадобиться добавить ограничивающую проверку для функций _onKeyDown() и _onKeyUp(), если это вы планируете использовать это на мобильных устройствах, так как клавиши Android Home и Back имеют тупо высокие значения keyCode.

Примечание: если она по-прежнему не работает, убедитесь, что вы дали фокус стадии (т.е. нажал на нее), и вы не в (stage.focus = null)

+0

Честно говоря, это меня смутило! Я действительно новичок в этом, и это было много кода, который я еще не изучил и не понял полностью. Я хочу понять, а затем использовать код, я бы хотел, чтобы чит просто копировал то, что вы показали мне, но я действительно ценю это. Я буду держать его в значении для будущей справки, когда я его полностью пойму. :) – ZombieDude

+0

В основном это делает то, что вы делаете, за исключением того, что это в специальном классе, который упрощает жизнь для вас. Вместо того, чтобы добавлять прослушиватели событий повсюду, вам просто нужно вызвать 'isKeyPressed (key)'. В общем, один прослушиватель событий в центральном месте лучше, чем несколько прослушивателей событий (вы можете следовать тому же принципу для своих событий ввода с классом «Обновление») – divillysausages

+1

Эти удобные константы можно найти в классе клавиатуры. – null

Смежные вопросы