我有这个想法将我的课程分成具有特定任务的小课程,以便我以后可以更轻松地使用它们。
这是一个要拆分的示例类:
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个任务运动/控制运动图形/碰撞检测的典当类。 现在的问题是专业人士将如何做到这一点?或者它是一个好主意?
另外一个问题是,当我将它们分成不同的类时,最好的方法是将它们的功能主义者添加到一个类中吗?我知道可以让课程相互延伸,直到最后一堂课具有所有属性,但我不认为这是最好的方式。
谢谢^ _ ^
答案 0 :(得分: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()
的类。
您也可以将处理控件的侦听器移动到一个名为“Controller”的单独类中,该类将决定在按下指定键时要执行的操作。这也是所谓的MVC或模型视图控制器设计模式的开始,您可以在此处找到它:Design Patterns AS3.0 - MVC
当您正在寻找方案的灵活性和可扩展性时,您将从设计模式及其如何用于解决各种问题中受益。上面提到的链接有一些关于设计模式的细节,或者看看GOF(Gang of Four)设计模式,因为它就是这样开始的:Gang of Four: Design Patterns