【问题标题】:splitting a class into smaller classes?把一个班级分成更小的班级?
【发布时间】:2014-01-31 13:28:41
【问题描述】:

我有这个想法,将我的班级分成具有特定任务的小班,这样我以后可以更轻松地使用它们。

这是一个要拆分的示例类:

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;
            }
        }
    }
}
}

这是一个 pawn 类,具有 3 个任务移动/控制移动图形/碰撞检测。 现在的问题是专业人士将如何做到这一点?或者这是一个好主意?

另外一个问题是,当我将它们分成不同的类时,将它们的功能主义者添加到一个类中的最佳方法是什么?我知道可以使类相互扩展,直到最终类具有所有属性,但我认为这不是最好的方法。

谢谢^_^

【问题讨论】:

    标签: actionscript-3 flash class adobe


    【解决方案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

    【讨论】:

    • 感谢您的提示,我可以看到要点。但你应该学会不要向懒惰的人扔书^_^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多