2013-05-05 108 views
0

我将一个大文件分隔成多个文件以清除它,现在我遇到了问题。使用另一个类的变量as3

我有我的main.as,character.as,camera.as。

我想要做的是从另一个类中访问一个变量,然后在该类上设置一个变量。我会告诉你我的意思。

从我的main.as im加载每个类,并将它们添加为孩子,以便它显示在屏幕上。

public function buildGame() 
    { 
     var loadMap:Sprite = new nf_MapBuilder(); 
     var xChar:Sprite = new nf_Character(); 
     var xCam:Sprite = new nf_Camera(); 
     var UserControl:nf_UserControl = new nf_UserControl(); 

     addChild(loadMap); 
     addChild(xChar); 
     addChild(xCam); 
     addChild(UserControl); 
    } 

一切都显示在屏幕上,就像它需要的一样。然后它转到我的角色上。:

package as3 
{ 
import flash.display.Sprite; 
import flash.events.Event; 

public class nf_Character extends Sprite 
{ 
    public var character_pos:Array = new Array(); 
    public var character_is_moving:Boolean = false; 
    public var character_x_dir:int = 0; 
    public var character_y_dir:int = 0; 
    public var character:hero = new hero(); 

    public function nf_Character() 
    { 
     addEventListener(Event.ADDED_TO_STAGE,xCharLoad); 
    } 

    public function xCharLoad(e:Event) 
    { 
     character_pos = [2,2]; 
     character.x=64*(character_pos[1]); 
     character.y=64*(character_pos[0]); 
     addChild(character); 
    } 
} 
} 

存在问题。我需要使用这些变量i设置有在我的character.as在我camera.as使用它:

package as3 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.geom.Rectangle; 
import flash.display.StageScaleMode; 

import as3.nf_Character; 

public class nf_Camera extends Sprite 
{ 
    private var xChar:nf_Character = new nf_Character(); 

    //Camera variables 
    var stageW2:Number; 
    var stageH2:Number; 
    var view:Rectangle; 

    public function nf_Camera() 
    { 
     addEventListener(Event.ADDED_TO_STAGE,xCamGo); 
    } 

    public function xCamGo(e:Event):void 
    { 
     trace("Camera pos - " + xChar.x + " " + xChar.character.y); 

     view = new Rectangle(0,0,stage.stageWidth,stage.stageHeight) 
     stageW2 = stage.stageWidth/2 - 32; 
     stageH2 = stage.stageHeight/2 - 32; 

     addEventListener(Event.ENTER_FRAME,CamView); 
    } 
    public function CamView(e:Event):void 
    { 
     view.x = xChar.character.x - stageW2; 
     view.y = xChar.character.y - stageH2; 
     scrollRect = view; 
    } 
} 
} 

当这一切都在一个大文件也没关系,我只是必须设置在变并通过每个功能来处理它,但现在我有点困惑。任何人都看到我可以做到这一点?

回答

0

您可以将您的角色类实例作为构造函数的参数传递给您的相机类实例。然后,您将有相机类中的字符的引用,你可以访问它的变量

// Inside buildGame() in main. 
var xChar:nf_Character = new nf_Character(); 
var xCam:nf_Camera = new nf_Camera(xChar); 

// Inside nf_Camera 
public function nf_Camera(char:nf_Character) { 
    xChar = char; 
} 
+0

哇,工作!我现在可以移动,所有的东西都会从我的main中调用,比如net.uk建议的。我也用你的方法bwroga来传递我的变量。这是我认为看起来更清晰的好方法。我仍然不能移动相机,但生病让它现在工作,现在我可以走动:P – Aenil 2013-05-05 01:40:37

+0

它也修复了很多事实上,我有一个跟踪在我的相机发生,并看到跟踪4时间行走可能导致它是用所有这种意大利面实例化了许多时间。有了这个,我只能看到它一次,就像它被认为是一样!无论如何,我很开心! :P – Aenil 2013-05-05 01:45:20

1

总之,我想你应该订阅事件从你的性格你的主类,这是发射时的字符移动。在该事件的处理程序中,您可以调用摄像头上的方法根据角色的当前位置设置其位置。

main.as

private var xChar:Sprite = new nf_Character(); 
private var xCam:Sprite = new nf_Camera(); 

public function buildGame() 
{ 
    var loadMap:Sprite = new nf_MapBuilder(); 
    var UserControl:nf_UserControl = new nf_UserControl(); 

    // listen for when the character has moved 
    xChar.addEventListener(MoveEvent.MOVED, characterMovedHandler); 

    addChild(loadMap); 
    addChild(xChar); 
    addChild(xCam); 
    addChild(UserControl); 
} 

private function characterMovedHandler(event:MoveEvent):void 
{ 
    xCam.setPosition(xChar.x, xChar.y); 
} 

nf_Character.as

public class nf_Character extends Sprite 
{ 
    public var character_pos:Array = new Array(); 
    public var character_is_moving:Boolean = false; 
    public var character_x_dir:int = 0; 
    public var character_y_dir:int = 0; 
    public var character:hero = new hero(); 

    public function nf_Character() 
    { 
     addEventListener(Event.ADDED_TO_STAGE,xCharLoad); 
    } 

    public function xCharLoad(e:Event) 
    { 
     character_pos = [2,2]; 
     character.x=64*(character_pos[1]); 
     character.y=64*(character_pos[0]); 
     addChild(character); 
    } 

    public function xCharMoved() 
    { 
     // Dispatch a custom event when the character moves 
     dispatchEvent(new MovedEvent(MovedEvent.MOVED)); 
    } 
} 

nf_Camera.as

public class nf_Camera extends Sprite 
{ 
    private var xChar:nf_Character = new nf_Character(); 

    //Camera variables 
    var stageW2:Number; 
    var stageH2:Number; 
    var view:Rectangle; 

    public function nf_Camera() 
    { 
     addEventListener(Event.ADDED_TO_STAGE,xCamGo); 
    } 

    public function xCamGo(e:Event):void 
    { 
     trace("Camera pos - " + xChar.x + " " + xChar.character.y); 

     view = new Rectangle(0,0,stage.stageWidth,stage.stageHeight) 
     stageW2 = stage.stageWidth/2 - 32; 
     stageH2 = stage.stageHeight/2 - 32; 

     // Probably only need one enterframe either in your character class or main 
     //addEventListener(Event.ENTER_FRAME,CamView); 
    } 
    public function setPosition(x:Number, y:Number):void 
    { 
     view.x = xChar.character.x - stageW2; 
     view.y = xChar.character.y - stageH2; 
     scrollRect = view; 
    } 
} 

出于兴趣,如何你是否移动角色?

+0

以及即时通讯与我的角色运动有同样的问题,除非我直接在我的“用户控件”addChild。奇怪的原因是因为我可以检索我的MapBuilder.as,它可以构建地图并使用一些也可以从usercontrol和这些工作中使用的变量。只是不是字符 – Aenil 2013-05-05 01:04:22

+0

无论如何生病检查这个明天我太困惑了去大声笑,但谢谢你的东西生病了看看它。 – Aenil 2013-05-05 01:06:28

+0

这听起来像你真的需要分离所有这些实体(即。他们不应该需要引用其他实体的实例),并让他们通过事件与某些控制器类(可能是主)通信。 – 2013-05-05 01:15:20