2013-05-10 137 views
1

Showing main menu over objects/movieclips?1120:未定义的属性playBtn

这的访问是我贴和Cherniv帮我走出去哪里的问题。不过,当尝试初始化/定义一个按钮来添加事件处理程序时,我遇到了一些困难。这是我的Main.as:

package { 
    import flash.display.MovieClip; 
    import flash.display.Sprite; 
    import flash.display.DisplayObject; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 
    import flash.ui.Mouse; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.text.TextFormat; 
    import flash.text.TextField; 
    import flash.display.Loader; 
    import flash.net.URLRequest; 
    import flash.net.URLLoader; 
    import flash.system.LoaderContext; 
    import flash.display.Sprite; 
    import flash.net.Socket; 


    public class Main extends MovieClip { 

    public static var gameLayer:Sprite = new Sprite; 
    public static var endGameLayer:Sprite = new Sprite; 
    public static var menuLayer:Sprite = new Sprite; 

    public var gameTime:int; 
    public var levelDuration:int; 

    public var crosshair:crosshair_mc; 
    static var score:Number; 

    var enemyShipTimer:Timer; 
    var enemyShipTimerMed:Timer; 
    var enemyShipTimerSmall:Timer; 

    static var scoreHeader:TextField = new TextField(); 
    static var scoreText:TextField = new TextField(); 
    static var timeHeader:TextField = new TextField(); 
    static var timeText:TextField = new TextField(); 

    public function Main() 
    { 
     var mainMenu:myMenu = new myMenu; 
     addChild(gameLayer); 
     addChild(endGameLayer); 
     addChild(menuLayer); 

     playBtn.addEventListener(MouseEvent.CLICK, startButtonPressed); 
    } 

    function startButtonPressed(e:Event) 
    { 
     levelDuration = 30; 
     gameTime = levelDuration; 
     var gameTimer:Timer = new Timer(1000,levelDuration); 
     gameTimer.addEventListener(TimerEvent.TIMER, updateTime); 
     gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired) 
     gameTimer.start(); 

     scoreHeader = new TextField(); 
     scoreHeader.x = 5; 
     scoreHeader.text = String("Score: "); 
     gameLayer.addChild(scoreHeader); 

     scoreText = new TextField(); 
     scoreText.x = 75; 
     scoreText.y = 0; 
     scoreText.text = String(0); 
     gameLayer.addChild(scoreText); 

     timeHeader = new TextField(); 
     timeHeader.x = 490; 
     timeHeader.y = 0; 
     timeHeader.text = String("Time: "); 
     gameLayer.addChild(timeHeader); 

     timeText = new TextField(); 
     timeText.x = 550; 
     timeText.y = 0; 
     timeText.text = gameTime.toString(); 
     gameLayer.addChild(timeText); 

     var scoreFormat = new TextFormat("Arial Rounded MT Bold", 20, 0xFFFFFF); 
     scoreHeader.setTextFormat(scoreFormat); 
     scoreText.setTextFormat(scoreFormat); 
     timeHeader.setTextFormat(scoreFormat); 
     timeText.setTextFormat(scoreFormat); 

     enemyShipTimer = new Timer(2000); 
     enemyShipTimer.addEventListener("timer", sendEnemy); 
     enemyShipTimer.start(); 

     enemyShipTimerMed = new Timer(2500); 
     enemyShipTimerMed.addEventListener("timer", sendEnemyMed); 
     enemyShipTimerMed.start(); 

     enemyShipTimerSmall = new Timer(2750); 
     enemyShipTimerSmall.addEventListener("timer", sendEnemySmall); 
     enemyShipTimerSmall.start(); 

     crosshair = new crosshair_mc(); 
     gameLayer.addChild(crosshair); 

     crosshair.mouseEnabled = crosshair.mouseChildren = false; 

     Mouse.hide(); 

     gameLayer.addEventListener(Event.ENTER_FRAME, moveCursor); 
     resetScore(); 
    } 

    function sendEnemy(e:Event) 
    { 
     var enemy = new EnemyShip(); 
     gameLayer.addChild(enemy); 
     gameLayer.addChild(crosshair); 
    } 

    function sendEnemyMed(e:Event) 
    { 
     var enemymed = new EnemyShipMed(); 
     gameLayer.addChild(enemymed); 
     gameLayer.addChild(crosshair); 
    } 

    function sendEnemySmall(e:Event) 
    { 
     var enemysmall = new EnemyShipSmall(); 
     gameLayer.addChild(enemysmall); 
     gameLayer.addChild(crosshair); 
    } 

    static function updateScore(points) 
    { 
     score += points; 
     scoreText.text = String(score); 
     var scoreFormat = new TextFormat("Arial Rounded MT Bold", 20, 0xFFFFFF); 
     scoreHeader.setTextFormat(scoreFormat); 
     scoreText.setTextFormat(scoreFormat); 
    } 

    static function resetScore() 
    { 
     score = 0; 
     scoreText.text = String(score); 
    } 

    function updateTime(e:TimerEvent):void 
    { 
     trace(gameTime); 
     // your class variable tracking each second, 
     gameTime--; 
     //update your user interface as needed 
     var scoreFormat = new TextFormat("Arial Rounded MT Bold", 20, 0xFFFFFF); 
     timeText.defaultTextFormat = scoreFormat; 
     timeText.text = String(gameTime); 
    } 

    function timeExpired(e:TimerEvent):void 
    { 
     var gameTimer:Timer = e.target as Timer; 
     gameTimer.removeEventListener(TimerEvent.TIMER, updateTime) 
     gameTimer.removeEventListener(TimerEvent.TIMER, timeExpired) 
     // do whatever you need to do for game over 
    } 

    function moveCursor(event:Event) 
    { 
     crosshair.x=mouseX; 
     crosshair.y=mouseY; 
    } 
    } 
} 

这是我Menu.as:

package { 
    import flash.display.MovieClip; 
    import flash.display.Sprite; 
    import flash.display.DisplayObject; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 
    import flash.ui.Mouse; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.text.TextFormat; 
    import flash.text.TextField; 
    import flash.display.Loader; 
    import flash.net.URLRequest; 
    import flash.net.URLLoader; 
    import flash.system.LoaderContext; 
    import flash.display.Sprite; 
    import flash.net.Socket; 

    public class Menu extends MovieClip 
    { 

    var mainMenu:Menu = new Menu(); 

    Main.menuLayer.addChild(myMenu); 

    playBtn.addEventListener(MouseEvent.CLICK, playBtnPressed); 

    function playBtnPressed() 
    { 
     Main.menuLayer.removeChild(myMenu); 
     dispatchEvent(new Event("playButtonPressed")) 
    } 
    } 

我给了按钮的playBtn之前,我转换的菜单,将影片剪辑实例的名字,但我得到的错误提到,不太清楚如何解决它。

所有的按钮都在库中,没有什么是时间轴上的,因为我的动画片段和什么都没有通过在.as文件中使用Actionscript动态添加到舞台上。我基本上需要找到一种方法来动态添加菜单,作为游戏打开时出现的第一件事,然后单击“播放”按钮将删除菜单,显示游戏层并启动定时器。

谢谢你的帮助。

+0

你检查为ActionScript导出? – 2013-05-10 19:28:00

+0

只需为它添加一个定义:'public var playBtn:MovieClip;'确保使用public关键字 – BadFeelingAboutThis 2013-05-10 19:28:35

+0

@LondonDrugs_MediaServices这是正确的做法吗?我基本上把我的四个按钮放在另一个.fla的舞台上,突出显示所有内容,并将它变成一个名为myMenu的动画片段,其AS AS Linkage为'Menu'。在创建动画片段符号之前,我设置了每个按钮实例名称。我做错了吗? – Liam 2013-05-10 19:32:58

回答

1

类文件并不了解playBtn实例,因为它在运行时(当下降在的FlashPro一个时间表,并给出一个实例名称)只定义了

所有你需要做的是在定义VAR你类:

public var playBtn:MovieClip; //or if not a movieClip whatever displayobject type it is 

的FlashPro将自动使用该变种的playBtn实例从时间轴储存,如果有相同的实例名称的变种。

您的Menu.as类也存在问题。 以下两行:

Main.menuLayer.addChild(myMenu); 
playBtn.addEventListener(MouseEvent.CLICK, playBtnPressed); 

需要被包含在一个函数(可能希望它的构造函数),所以它应该是这样的:

public class Menu extends MovieClip { 

    public var mainMenu:Menu; //I don't think you want this at all in this class 

    //creating a function with same name as your class creates a constructor, which is called when you instantiate an object: eg new Menu(); 
    public function Menu():void { 
     mainMenu = new Menu();  //this seems very strange, and would create an endless overflow of new menu objects, I don't think this is what you want 

     Main.menuLayer.addChild(myMenu); 

     //again, you need to either define this var, not sure if it's supposed to be a passed in var from your other class or a separate instance 
     playBtn.addEventListener(MouseEvent.CLICK, playBtnPressed); 
    } 

    function playBtnPressed() 
    { 
     Main.menuLayer.removeChild(myMenu); 
     dispatchEvent(new Event("playButtonPressed")) 
    } 
} 
+0

我明白了,但我的菜单MovieClip被称为“myMenu”。我把它改成'mainMenu = new Menu();'到'myMenu = new Menu();'?我的库中的四个按钮是'aboutBtn','hiscoresBtn','howToPlayBtn'和'playBtn',它们被定义为Buttons(按钮放在舞台上以创建菜单,然后我将菜单转换为名为'myMenu的movieclip '带一个名为'Menu'的类)。我所要做的只是将我的菜单和程序的其余部分分开,以便在打开游戏时,菜单将显示,但游戏的计时器只有在点击“Play”按钮后才会启动。 – Liam 2013-05-10 19:40:15

+0

这个班级就是你所说的联系。因此,如果链接设置为“菜单”,那么你需要'mainMenu:Menu = new Menu();'mainMenu是实例的名称,Menu是类/类型的名称 – BadFeelingAboutThis 2013-05-10 19:45:06