문제

안녕하세요 다시 동료 플래시 :)

StackoverFlow에서 여기에 위치한 첫 번째 질문은이 문제를 다루었 고, 몇 가지 다른 버튼을 만든 배열이있었습니다. 그러나 나는 그들에게 행동을 할당하는 방법을 몰랐다.동적으로 생성 된 버튼을 제공하는 방법 각각에 대한 동작 조치 - 1 부

감사합니다 Joel Hooks, 나는 내 코드를 작동시킬 수 있었다. 그러나 이번에는 가져 오기 그래픽을 내 라이브러리에서 클래스로 사용하는 대신 그라디언트*(JPG를 가져올 필요가 없음)을 그려서 MovieClip을 만들었습니다. 이제 나는 또 다른 두려움을 느끼고 있습니다 "시간 상수를 컴파일하지 않음" 다시 오류. 나는 그것이 클릭하거나 롤링되는 버튼 인스턴스를 결정하려는 방식과 관련이 있다고 생각합니다.

이전 버튼 생성 (일하고 있는) 암호:

for (var i : number = 0; i <myxmlarray.length; i ++) {navbutton = new Navbutton; navbutton.name = "button" + i; navbutton.x = i * navsize; navbutton.y = avbtny; Navbutton.buttonmode = true; Thumbsmov.addchild (Navbutton);

buttons.push (Navbutton); 버튼 [i] .adeventListener (mouseevent.mouse_up, handleButtonClick); 버튼 [i] .adeventListener (mouseevent.roll_over, handleButtonover); 버튼 [i] .adeventListener (mouseevent.roll_out, handleButtonoff); }

이전 청취자 (일하고 있는) 암호:

function handleButtonOver(event:MouseEvent):void {

var 버튼 : navbutton = event.target as navbutton; var id : number = number (button.name.split ( "버튼")1); if (button) tweenlite.to (buttonRolls [id], .4, {alpha : 1, eason : strong.easout}); Catatext [id] .defaultTextFormat = a12green; Catatext [id] .text = myxmlarray [id] .id; }

현재 버튼 생성 코드 :

for (var i:Number = 0; i < num; i++) {
trace("loop number = "+i);

var blueGradient:MovieClip = new MovieClip();
 blueGradient.name = "button" +i;
 blueGradient.graphics.beginGradientFill(bGrad, bColors, bAlphas, bRatios ,bMatrix)
 blueGradient.graphics.drawRect(0, 0, 266, 40);
 blueGradient.x = i * navSIZE;
 blueGradient.y = navBtnY;
 blueGradient.buttonMode = true;
addChild(blueGradient);

buttons.push(blueGradient)

buttons[i].addEventListener(MouseEvent.MOUSE_UP, handleButtonClick);
buttons[i].addEventListener(MouseEvent.ROLL_OVER, handleButtonOver);
buttons[i].addEventListener(MouseEvent.ROLL_OUT, handleButtonOff);

}

현재 버튼 리스너 코드 :

function handleButtonOver(event:MouseEvent):void {
var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)
 cataText[id].defaultTextFormat = navFontRoll;
 cataText[id].text = myArray[id].id;

}

현재 영화는 다음 줄에 댓글을 달면 오류 없이만 실행됩니다.

var button:blueGradient = event.target as blueGradient;

그것이 Compile Time Constant Error가 나타나게하는 원인이기 때문입니다. 그러나 해당 라인을 제거하면 모든 버튼은 Button0과 Button1이라는 2 개의 버튼 대신 Button1입니다.

여기서 도움이나 포인터는 대단히 감사 할 것입니다! 내 코드를 살펴 보셔서 미리 감사드립니다.

도움이 되었습니까?

해결책

나는 이후로 as 키워드는 캐스팅을위한 것입니다. 대신이 라인을 원합니다.

var button:MovieClip = event.target as MovieClip;

blueGradient 클래스 이름이 아닌 변수 이름 인 것 같습니다.

다른 팁

문제는 Bluegradient 클래스를 버튼 객체와 혼동하고 있다는 것입니다. 원래 핸들러에서 코드는 다음과 같습니다.

var button:NavButton = event.target as NavButton;
var id:Number = Number(button.name.split("button")[1]);
if(button)....

그러나 새 코드에서

var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)

차이가 보이나요? 두 경우 모두 버튼 객체를 "var button"이라고 말하지만 새 버전에서는 "button.name.split ..."대신 "bluegradient.name.split ..."을 작성합니다. if () 문의.

VAR 키워드는 객체의 이름을 정의합니다. 구문은 var [ObjectName] : [ObjectType]이며, 해당 객체로 작업 할 때는 항상 유형이 아닌 이름으로 이름으로 참조하고 싶습니다. 정적 메소드가있는 정적 클래스가 없다면 조금 더 발전합니다.

간단히 말해서 : 새 핸들러의 두 곳에서 "Bluegradient"를 "버튼"으로 바꾸면 문제가 해결되어야합니다. 도움이 되었기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top