从舞台访问文档类

时间:2013-12-16 18:02:12

标签: actionscript-3 flash

我无法找到解决问题的具体方法。我开始我的文档类“Main.as”。从那里我玩Frame 1,这是我的GUI。在我的GUI上按下“开始”按钮后,我希望它在我的Main.as中调用“Start()”函数。

但它不起作用。我发现我不能从我的文档类创建对象,也不能有超过1个文档类。那我该怎么办?

Main.as

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



public class Main extends MovieClip 
{
trace("Im the Main Class");
public var BG:MovieClip;
public var char:Char_Control;
public var enemy:Enemy;
var blockSlide:Boolean = true;
var coin_array:Array = new Array();
var char_array:Array = new Array();
var coin:item_collider;
var posx;
var posy;
var oCollider;
var main:Main = new Main();


    //Konstruktor
    public function Main() 
    {
    trace("Im the Main Class(Constructor)");
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    this.stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
    this.addEventListener(Event.ENTER_FRAME, Gravity);
    this.addEventListener(Event.ENTER_FRAME,update);
    gotoAndPlay(1); // Starts GUI
    Start(); // Starts Everything else => The Game itself
    }



public function update(_event:Event)
{
    //Execute Base_Class
    //char.Move();

    //Execute Base_Class+Sub_Class
    enemy.Chase(char,enemy);
    //enemy.Move(true, "walk");
}




public function Start()
{
    // Adds Character to Stage
     char = new Char_Control(875,350);
     stage.addChild(char);

     enemy = new Enemy(500,450);
     stage.addChild(enemy);

     char_array[1]=char;
     char_array[0]=enemy;

    // Adds Objects to Stage
    for (var i2:int=1; i2<30; i2++)
     {
     posx = Math.round(Math.random()*(1400)+1);
     posy = Math.round(Math.random()*(800)+1);
     coin = new item_collider(posx,posy);// Öffnet Konstruktor
     stage.addChild(coin);
     trace("Add Coin (foreach)");
     coin_array.push(coin);
     }
}

阶段:

button.addEventListener(MouseEvent.CLICK,buttonClick);

var tform:TextFormat = new TextFormat();
tform.size = 20;
tform.font = "Arial";
tform.align = TextFormatAlign.CENTER;
tform.color = 0x000000;
tform.bold = true;

var tfield:TextField = new TextField();
tfield.width = checkbox.width;
tfield.width = button.width;
tfield.width = coin_number.width;
tfield.width = stepper_label.width;
tfield.x = 0;
tfield.y = 30;

var coin_amount:int = 0;
var create_enemy:Boolean = false;

tfield.setTextFormat(tform);
addChild(tfield);

checkbox.setStyle("textFormat",tform);
button.setStyle("textFormat",tform);
coin_number.setStyle("textFormat",tform);
stepper_label.setStyle("textFormat",tform);





stop();
function buttonClick(e:MouseEvent) 
        { 
        coin_amount = coin_number.value;
        create_enemy = checkbox.selected;
        nextFrame(); //Next Frame => the Level itself
    }

1 个答案:

答案 0 :(得分:0)

下载代码后,我注意到您设置时间轴代码和代码的方式存在一些兼容性问题。

虽然您在AS3.0设置中有“自动声明阶段实例”未选中,但您似乎在舞台上混合了隐式声明和显式声明的实例。要解决此问题,我建议不要选中此属性,并在文档类中声明所有舞台实例(这包括您在第1帧中的所有舞台实例:coin_numbercheckbox等)。

执行此操作还需要您导入正在使用的任何课程(例如NumericStepperTextFieldTextFormat等。

完成此操作后,您将需要移动游戏控件事件侦听器(您在Document Class构造函数中拥有的侦听器)。您可以将它们放在单独的方法中,也可以将它们添加到Start方法的末尾。如果将它们保留在构造函数中,那么您将尝试访问尚存在的内容,因为update上调用的ENTER_FRAME方法依赖于在Start中实例化的对象方法

下一步是从构造函数中调用Start。而是在第二帧上拨打Start

这应该使用时间轴代码和文档类混合使您的应用程序进入可运行状态。

我想知道为什么这是一个好成绩的要求,因为这非常不正统,而且 - 在大多数情况下 - 在ActionScript社区中被瞧不起。