2015-01-03 14 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

有趣的項目 - 除了回答如下,你是否創建了一個「Tamagotchi」的實例並將其添加到舞臺上?養成習慣的一件事就是當你想檢查是否發生了某些事情時,使用'trace()'語句作爲診斷 - 關鍵事件等被觸發等。另外,如果有方法和你以前沒有用過的功能 - 學習,然後應用到你的項目中。 –

+0

是的,我可以在舞臺上看到角色,但仍然無法讓它移動!我很難過。 我嘗試過使用實例名稱,在開始時使用'.this',甚至在開始時使用'stage.'。沒有。不是件事。 我只是不明白它。 – ZombieDude

+0

是的,我向keyPressListener函數添加了一條trace語句,但仍然沒有任何結果。這讓我瘋狂! – 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 

好處:那麼您可以通過調用它

  • 你的代碼是核心 - 容易改變
  • 輕鬆禁用或啓用(暫停功能)
  • 您可以添加簡單回調(Dictionaryint密鑰和Function值)
  • 您可以添加如justPressed(key)justReleased(key)容易
  • 你沒有得到重複鍵的問題(當一個鍵被按下時,Flash將重複KEY_DOWN事件)

您可能需要添加邊界檢查,如果和_onKeyUp()功能您計劃在手機上使用此值,因爲Android Home和Back鍵具有較高的keyCode值。

注意:如果它仍無法正常工作,請確保你給舞臺焦點(即點擊它),你不是在TextField等(stage.focus = null

+0

說實話,那讓我困惑!對於這個我真的很陌生,那是很多我還沒有學習並且不完全理解的代碼。 我想了解並使用代碼,我覺得自己像一個騙子,只是複製你給我看的東西,但我真的很欣賞它。當我完全理解它時,我會將其標記爲將來參考。 :) – ZombieDude

+0

基本上它正在做你在做什麼,除了它是在一個專門的課程,爲你簡化生活。而不是隨處添加事件偵聽器,只需調用'isKeyPressed(key)'。一般來說,在一箇中心位置的一個事件監聽器比多個事件監聽器要好(你可以使用'Update'類爲你的輸入框事件遵循相同的原理) – divillysausages

+1

這些方便的常量可以在Keyboard類中找到。 – null

相關問題