2014-01-31 117 views
0

我有這個想法將我的課程分爲具有特定任務的較小課程,所以我可以稍後使用它們。將班級分成更小的班級?

這裏有一個例子類拆分:

package { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.events.KeyboardEvent; 
import flash.ui.Keyboard; 
import flash.display.Stage; 

public class m4w extends MovieClip { 
    public var upPressed:Boolean = false; 
    public var downPressed:Boolean = false; 
    public var leftPressed:Boolean = false; 
    public var rightPressed:Boolean = false; 
    public var lastMove:String; 
    public static var spd:Number=6; 
    public var ttt:MovieClip; 


    public function m4w(stageRef:Stage, dtct:MovieClip) { 
     addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey); 
     stageRef.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed); 
     stageRef.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed); 
     ttt=dtct; 

    } 
    //Movement 
    public function fl_MoveInDirectionOfKey(event:Event){ 
     if (leftPressed){ 
      x -= spd; 
      lastMove="left"; 
      detectPlayer(); 
      if(wlk.currentFrame < 18 || wlk.currentFrame > 24){ 
       wlk.gotoAndPlay(17); 
      } 
     }else 
     if (rightPressed){ 
      x += spd; 
      lastMove="right"; 
      detectPlayer(); 
      if(wlk.currentFrame < 26 || wlk.currentFrame > 31){ 
       wlk.gotoAndPlay(25); 
      } 
     }else 
     if (upPressed){ 
      y -= spd; 
      lastMove="up"; 
      detectPlayer(); 
      if(wlk.currentFrame < 10 || wlk.currentFrame > 16){ 
       wlk.gotoAndPlay(9); 
      } 
     }else 
     if (downPressed){ 
      y += spd; 
      lastMove="down"; 
      detectPlayer(); 
      if(wlk.currentFrame < 2 || wlk.currentFrame > 8){ 
       wlk.gotoAndPlay(1); 
      } 
     } 
    } 
    public function fl_SetKeyPressed(event:KeyboardEvent):void{ 
     switch (event.keyCode){ 
      case 87: 
      case 38:{ 
       upPressed = true; 
       break; 
      } 
      case 83: 
      case 40:{ 
       downPressed = true; 
       break; 
      } 
      case 65: 
      case 37:{ 
       leftPressed = true; 
       break; 
      } 
      case 68: 
      case 39:{ 
       rightPressed = true; 
       break; 
      } 
     } 
    } 
    public function fl_UnsetKeyPressed(event:KeyboardEvent):void{ 
     switch (event.keyCode){ 
      case 87: 
      case 38:{ 
       upPressed = false; 
       break; 
      } 
      case 83: 
      case 40:{ 
       downPressed = false; 
       break; 
      } 
      case 65: 
      case 37:{ 
       leftPressed = false; 
       break; 
      } 
      case 68: 
      case 39:{ 
       rightPressed = false; 
       break; 
      } 
     } 
    } 
    //Movement 
    public function detectPlayer(){ 
     if (ttt.hitTestPoint(x, y, true)){ 
      if(lastMove == "right"){ 
       x -= spd; 
      } 
      if(lastMove == "left"){ 
       x += spd; 
      } 
      if(lastMove == "up"){ 
       y += spd; 
      } 
      if(lastMove == "down"){ 
       y -= spd; 
      } 
     } 
    } 
} 
} 

這是一個棋子類3個任務運動/控制移動圖形/衝突檢測。 現在的問題是如何親會做到這一點?或者它是一個好主意?

和額外的問題是,當我將它們分成不同的類什麼是將他們的功能主義者添加到一個類中的最佳方式?我知道有可能讓這些類彼此延伸,直到最後一類擁有所有的屬性,但我認爲這不是最好的方式。

謝謝^ _^

回答

1

該示例類非常小,直接,並且邏輯上包容。就可重用性而言,您真的正在尋找靈活性,這是通過類設計和結構來處理的。因此,使用示例類m4w,您可以刪除detectPlayer()並將其放在父類中,我將其稱爲Collidables。然後,您可以重命名功能,以便更爲通用,這看起來是這樣的:

class Collidables extends MovieClip { 

    public function hitPointCollision(obj:DisplayObject, p:Point, callback:Function=null):Boolean { 
     if (obj.hitTestPoint(p.x, p.y, true)) { 
      if (callback != null) { 
       callback(); 
      } 
      return true; 
     } 
     return false; 
    } 
} 

這是非常基本的,但提供任何類從Collidables繼承與hitPointCollision()使用。

您也可以將處理控件的偵聽器移動到一個名爲「控制器」的單獨類中,該控制器將決定按下指定鍵時要執行的操作。這也是MVC或模型視圖控制器設計模式的開始,您可以在這裏找到:Design Patterns AS3.0 - MVC

當您在尋找讓您的程序靈活和可擴展的方法時,您將受益於看一看在設計模式以及它們如何用於解決各種問題。前面提到的鏈接有一些關於設計模式的細節,或者看看GOF(四人幫)設計模式,因爲這是一切開始的地方:Gang of Four: Design Patterns

+0

感謝提示我可以看到要點。但你應該學會不要把書放在懶惰的人身上^ _ ^ –