2012-03-10 89 views
0

我创建了一个自定义类(.as在下面:)。它存在于我的主要时间线中的三个实例(panel1,panel2和panel3),目前只有一个关键帧。为什么自定义类的构造函数被多次调用?

当我调试我的文件时,在第1帧中为每个实例调用构造函数。凉。然而,稍后的构造函数被称为每个实例AGAIN,消除我所做的任何更改。

将实例从库中拖放到舞台上。还有我的文字中没有“=新Scorepanel()线。

什么触发此,我该如何预防呢?

--Ken(难以置信的沮丧)富兰克林

{

import flash.display.MovieClip; 
import fl.text.TLFTextField; 

public class scoreunit extends MovieClip 
{ 
    private var team:String = "WHOAMI"; 
    private var points:Number = 0; 
    private var scorevalue:String; 
    private var teamname:String; 
    private var inited:Boolean = false; 

    function scoreunit() 
    { 
     if (! inited) 
     { 
      this.teamname = team; 
      this.scorevalue = String(points); 
      var teamnamebox=new TLFTextField(); 
      teamnamebox.x = 2.25; 
      teamnamebox.y = 295.25; 
      teamnamebox.width = 295.25; 
      teamnamebox.height = 70; 
      teamnamebox.text = team; 
      var scorevaluebox=new TLFTextField(); 
      scorevaluebox.x = 2.25; 
      scorevaluebox.y = 95.80; 
      scorevaluebox.width = 295; 
      scorevaluebox.height = 97.5; 
      scorevaluebox.text = scorevalue; 
      trace("I set the starting values"); 
      trace("teamnamebox = ",teamnamebox.text); 
      trace("scorevalue = ",scorevaluebox.text); 
      inited = true; 
     } 
    } 

    public function score():Number 
    { 
     return points; 
    } 

    public function winpoints(n:Number) 
    { 
     points += n; 
     scorevalue = String(points); 
     scorevaluebox.text = scorevalue; 
    } 

    public function losepoints(n:Number) 
    { 
     points -= n; 
     scorevalue = String(points); 
     scorevaluebox.text = scorevalue; 
    } 

    public function setname(s:String) 
    { 
     team = s; 
     teamname = team; 
     teamnamebox.text = s; 
     trace("I changed the name to ",teamnamebox.text); 
    } 

    public function buzzin() 
    { 
     this.gotoAndStop("buzzedin"); 
    } 

    public function makeddselect() 
    { 
     this.gotoAndStop("ddtarget"); 
    } 

    public function makeyay(y:Number) 
    { 
     switch (y) 
     { 
      case 1 : 
       this.gotoAndStop("yay1"); 
       break; 
      case 2 : 
       this.gotoAndStop("yay2"); 
       break; 
      case 3 : 
       this.gotoAndStop("yay3"); 
       break; 
      case 4 : 
       this.gotoAndStop("yay4"); 
       break; 
      case 5 : 
       this.gotoAndStop("yay5"); 
       break; 
      case 6 : 
       this.gotoAndStop("yay6"); 
       break; 
      default : 
       trace("CRASH! "+y+" IS NOT A VALID YAY!"); 
     } 
    } 

    public function makeboo(b:Number) 
    { 
     switch (b) 
     { 
      case 1 : 
       this.gotoAndStop("boo1"); 
       break; 
      case 2 : 
       this.gotoAndStop("boo2"); 
       break; 
      case 3 : 
       this.gotoAndStop("boo3"); 
       break; 
      case 4 : 
       this.gotoAndStop("boo4"); 
       break; 
      case 5 : 
       this.gotoAndStop("boo5"); 
       break; 
      case 6 : 
       this.gotoAndStop("boo6"); 
       break; 
      default : 
       trace("CRASH! "+b+" IS NOT A VALID BOO!"); 
     } 
    } 

    public function makescrewing() 
    { 
     this.gotoAndStop("evilface"); 
    } 

    public function makescrewed() 
    { 
     this.gotoAndStop("screwed"); 
    } 

    public function makesplat() 
    { 
     this.gotoAndStop("eekface"); 
    } 

    public function makefreeze() 
    { 
     this.gotoAndStop("frozen"); 
    } 

    public function makehome() 
    { 
     this.gotoAndStop("inactive"); 
    } 

} 

}

+0

使用它来调试:'var s:String =''; var mc = this;做{s + = mc.toString(); mc = mc.parent; } while(mc!= null);痕迹; ' – scibuff 2012-03-10 16:05:04

+0

我在开始时收到了三次:[object scoreunit] [object MainTimeline]。 20帧之后我收到了三次:[object scoreunit] [对象MainTimeline] [object Stage] – 2012-03-10 16:20:23

+0

那是在我给舞台添加了一个键盘监听器之后。嗯。 – 2012-03-10 16:22:43

回答

0

您在这里遇到的问题不是来自您的代码,而是来自时间线。您班级的代码只能访问当前显示的元素框架和对其他实例,符号以及当前框架之外的任何东西的松散访问。

你的问题是Flash第一次遍历每一帧,在调试中突出显示每个对象都被正确构建,但一旦它到达时间线上的最后一帧,它就回到第一帧,执行因为任何出现在画面上的物体都会再次重新出现。

您需要避免将类实例手动放置在舞台上。

此外,这是个人实践,如果您需要使用框架和代码,更喜欢使用单帧剪辑,并使用代码中的addChild()图标库,资产和gotoAndStop()。你最终会拥有更多的控制权,并且会减少挫折感。但总的来说,如果你正在编码,尽可能避免使用帧;)

希望这有助于!

+0

唉,所有这些都可以在Actionscript 2.0中无缝运行,但是显然Actionscript 3.0希望我们能够取消它。这教给我的是,我刚刚停止在Flash中写作,现在将找到一种方式来产生这种方式。 --- Ken(欣赏反馈)Franklin – 2012-03-10 17:11:57

+0

@KenFranklin我认为你可以通过将你的乐谱数据保存在一个静态类中,并根据静态乐谱数据填充动画片段的值来轻松解决问题。无论您使用什么工具或平台,都会出现这些类型的问题,而且我不知道这种工具与您希望创建的工作类型的Flash具有相同的可视性。你可以寻找一种新的工具,但除非你自己学习处理这些类型的数据管理问题,否则你将受制于你的工具制造者的摆布,随着旧工具的死亡或退出,赞成 – scriptocalypse 2012-03-10 20:21:45

+0

@Scriptocalypse - 我同意,如果这是唯一的问题,但从美丽到破碎的其他问题的数量远远大于这个问题。在我煨下来之后,我将再次尝试使用AS 2.0进行重写...我知道这符合我的需求。谢谢 :) – 2012-03-11 00:10:41

相关问题