2012-03-10 2 views
0

사용자 지정 클래스를 만들었습니다 (.as는 아래 :). 내 메인 타임 라인에서 세 개의 인스턴스 (panel1, panel2 및 panel3)에 존재하며 현재 하나의 키 프레임 만 있습니다.커스텀 클래스의 생성자 함수가 여러 번 호출되는 이유는 무엇입니까?

파일을 디버깅 할 때 프레임 1에서 각 인스턴스에 대해 생성자 함수가 호출됩니다. 시원한. 그러나 조금 후에 생성자 함수를 각 인스턴스에 대해 다시 호출하여 변경 한 내용을 지 웁니다.

인스턴스는 모두 라이브러리에서 스테이지를 드래그하여 스테이지에 배치됩니다. 내 스크립트에는 "= 새 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; do {s + = mc.toString(); mc = mc.parent; } while (mc! = null); 추적 (들); ' – scibuff

+0

처음 세 번이나 받았습니다 : [object scoreunit] [object MainTimeline]. 내가 20 번 프레임 세 번 받았다 : [object scoreunit] [object MainTimeline] [object Stage] –

+0

키보드 청취자를 무대에 추가 한 직후였습니다. 흠. –

답변

0

문제는 코드에서 나오지 않고 타임 라인에서 발생합니다. 클래스의 코드는 현재 표시된 요소에만 액세스 할 수 있습니다. 프레임 및 다른 인스턴스, 심볼, 현재 프레임 외부의 모든 것에 대한 느슨한 액세스.

문제는 플래시가 각 프레임을 처음으로 통과하여 각 객체가 올바르게 빌드되었음을 디버그에서 강조 표시하지만 일단 타임 라인의 마지막 프레임에 도달하면 맨 처음 프레임으로 돌아가서 거기에있는 모든 물체가 다시 재구성됩니다.

무대에 손으로 클래스 인스턴스를 배치하지 않아야합니다.

또한 프레임과 코드로 작업해야하는 경우 단일 프레임 클립으로 작업하고 코드에서 addChild() 아이콘 라이브러리, 에셋 및 gotoAndStop()을 사용하는 것이 좋습니다. 당신은 결국 더 많은 통제력과 덜 좌절감을 느낄 것입니다. 하지만 전반적으로, 코딩하는 경우 가능하면 프레임을 사용하지 마십시오.)

희망이 있습니다.

+0

아아,이 모든 것은 Actionscript 2.0에서 원활하게 작동하지만 명확하게 ActionScript 3.0은 우리가 그걸 없애기를 바라고 있습니다. 이것이 저에게 가르쳐 준 것은 제가 플래시로 글쓰기를 그만 두었고, 이제는 이것을 다른 방식으로 만들어 낼 수있는 방법을 발견 할 것입니다. --- Ken (피드백에 감사드립니다.) Franklin –

+0

@KenFranklin 나는 정적 인 클래스에서 스코어 데이터를 유지하고 정적 스코어 데이터를 기반으로 무비 클립의 값을 채우는 것으로 쉽게이 문제를 해결할 수 있다고 생각합니다. 이러한 종류의 문제는 사용하는 도구 나 플랫폼에 관계없이 존재하게 될 것이며, 내가 찾고있는 작업 유형에 대해 Flash와 같이 시각적으로 지향적 인 도구를 알지 못합니다. 새로운 도구를 찾을 수는 있지만, 이러한 종류의 데이터 관리 문제를 스스로 해결하지 않으면 도구 제작자가 자비를 베푸는 데, 오래된 도구가 죽거나 빠져 나올 때 도구가 빠져 나옵니다. 찬성 – scriptocalypse

+0

@Scriptocalypse - 유일한 문제인 경우 동의하지만, 아름다운 것에서 깨어진 것 이외의 다른 문제는 이보다 훨씬 많습니다.내가 뒤죽박죽을 쓴 다음 AS 2.0을 사용하여 다시 작성하여 다시 시도 할 것입니다. 내 필요를 충족시키는 것을 알고 있습니다. 감사 :) –

관련 문제