Actionscript 3 1120:访问未定义的属性playBtn
这是我发布的问题,Cherniv帮我找到了方向。但是,我在尝试初始化/定义按钮以向其添加事件处理程序时遇到了一些困难。这是我的主要观点Actionscript 3 1120:访问未定义的属性playBtn,actionscript-3,flash-cs6,Actionscript 3,Flash Cs6,这是我发布的问题,Cherniv帮我找到了方向。但是,我在尝试初始化/定义按钮以向其添加事件处理程序时遇到了一些困难。这是我的主要观点 package { import flash.display.MovieClip; import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.Event; import flash.events.MouseEv
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;
}
}
}
这是我的菜单
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"))
}
}
在我将菜单转换为movieclip之前,我给了按钮一个实例名playBtn
,但我得到了提到的错误,不太确定如何解决它
所有按钮都在库中,时间线中没有任何内容,因为我的movieclips和其他内容都是通过使用.as文件中的Actionscript动态添加到舞台上的。我基本上需要找到一种方法来动态添加菜单,作为游戏打开时出现的第一件事,单击“播放”按钮删除菜单,显示游戏层并启动计时器
感谢您的帮助。您的类文件不知道playBtn实例,因为它仅在运行时定义(在flashPro中放置在时间线上并给出实例名称时) 您只需在类中定义变量:
public var playBtn:MovieClip; //or if not a movieClip whatever displayobject type it is
flashPro将自动使用该变量存储时间线中的playBtn实例(如果它与该变量具有相同的实例名称)
你也有一个问题,你的菜单。作为类。
以下两行:
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"))
}
}
您的类文件不知道playBtn实例,因为它仅在运行时定义(在flashPro中放置在时间线上并给定实例名称时) 您只需在类中定义变量:
public var playBtn:MovieClip; //or if not a movieClip whatever displayobject type it is
flashPro将自动使用该变量存储时间线中的playBtn实例(如果它与该变量具有相同的实例名称)
你也有一个问题,你的菜单。作为类。
以下两行:
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"))
}
}
您是否检查了actionscript的导出?只需为其添加一个定义:
public var playBtn:MovieClip代码>确保您使用公共密码keyword@LondonDrugs_MediaServices这样做对吗?我基本上把我的四个按钮和其他什么东西放在另一个.fla的舞台上,突出显示了所有的东西,并把它变成了一个叫做myMenu
的movieclip,与Menu
链接。在创建movieclip符号之前,我设置了每个按钮的实例名称。我做错了吗?这应该可以,但是你的.as文件直到运行时才知道它们,所以你必须按照我的回答定义它们。所以playBtn只在你的菜单类/时间线中?不是您的主类?是否检查了actionscript的导出?只需为其添加一个定义:public var playBtn:MovieClip代码>确保您使用公共密码keyword@LondonDrugs_MediaServices这样做对吗?我基本上把我的四个按钮和其他什么东西放在另一个.fla的舞台上,突出显示了所有的东西,并把它变成了一个叫做myMenu
的movieclip,与Menu
链接。在创建movieclip符号之前,我设置了每个按钮的实例名称。我做错了吗?这应该可以,但是你的.as文件直到运行时才知道它们,所以你必须按照我的回答定义它们。所以playBtn只在你的菜单类/时间线中?不是你的主课吗?我明白了,但是我的菜单MovieClip叫做myMenu
。我想我会改变mainMenu=newmenu()
tomyMenu=newmenu()代码>?我的库中的四个按钮是aboutBtn
,hiscoresBtn
,howToPlayBtn
和playBtn
,它们被定义为按钮(按钮被放在舞台上创建菜单,然后我将菜单转换为名为myMenu
的movieclip,其中包含一个名为menu
的类)。我所要做的就是将我的菜单和程序的其他部分分开,这样当打开游戏时,菜单会显示出来,但游戏的计时器只会在点击“播放”按钮后启动。这个类就是你告诉链接的任何内容。因此,如果将链接设置为Menu
,则需要mainMenu:Menu=newmenu()
mainMenu是实例的名称,Menu是我看到的类/类型的名称,但是我的Menu MovieClip被称为myMenu
。我想我会改变mainMenu=newmenu()
tomyMenu=newmenu()代码>?我的库中的四个按钮是aboutBtn
,hiscoresBtn
,howToPlayBtn
和playBtn
,它们被定义为按钮(按钮被放在舞台上创建菜单,然后我将菜单转换为名为myMenu
的movieclip,其中包含一个名为menu
的类)。我所要做的就是将我的菜单和程序的其他部分分开,这样当打开游戏时,菜单会显示出来,但游戏的计时器只会在点击“播放”按钮后启动。这个类就是你告诉链接的任何内容。因此,如果将链接设置为Menu
,则需要mainMenu:Menu=newmenu()
mainMenu是实例的名称,Menu是类/类型的名称