2014-01-31 115 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

感谢提示我可以看到要点。但你应该学会不要把书放在懒惰的人身上^ _ ^ –