2011-01-14 6 views
0

나는 여기에 약간의 목표를두고있다. 비디오 스트림을 캡처하는 Display 클래스가 있습니다. 카메라를 제어하기위한 기본 중지/녹화 단추 세트를 만들려고합니다. 분명히 this에 액세스하는 함수 또는 클립 식별 및 중지를 허용하는 변수를 선언 할 수 없습니다. 컴파일러 (나는 Haxe를 사용하고있다)는 다음과 같은 에러를 throw한다.정적 함수 및 UI 요소에 대한 Actionscript- 문제?

video/Webcam.hx:96: characters 10-14 : Cannot access this from a static function 

내가 잘못 접근하고있을 수있다. 다음은 몇 가지 (약식) 코드입니다.

class Webcam extends Display { 

    var nc : flash.net.NetConnection; 
    ... 

    private function addControls(){ 
    var stopIcon = new StopIcon(); 
    var b = new flash.display.MovieClip();  
    b.addChild(stopIcon); 
    b.useHandCursor = true; 
    b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
     trace(this); 
     this.stopStream() 
    }); 
    b.x = 210; 
    b.y = 20; 
    } 

    ... 
} 

저는 AS3으로 컴파일하기 위해 Haxe를 사용하고 있습니다. 델타 목록이 http://haxe.org/doc/flash/as2_compare인데이 문제는이 문제를 다루지 않는 것 같습니다. 그래서 이것이 내가 가진 문제라고 생각합니다. 컴파일러와 관련이 있을지도 모르지만, 지금까지 Haxe를 정말 좋아했기 때문에 나는 희망하지 않습니다.

actionscript 컴파일러가 이러한 함수를 정적으로 처리하면 객체 인스턴스와 연결된 UI 요소를 어떻게 만듭니 까?

답변

2

이것은 이벤트 자체를 사용하지 않고 MouseEvent.CLICK 처리기에서 익명의 함수를 사용했기 때문입니다. 이벤트 핸들러는 MouseEvent 자체 인 인수를 취합니다. 그래서, 당신은 다음 중 하나를 수행하기 위해이 :

private function addControls(){ 
    ... 
    var self = this; 
    b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
    self.stopStream() 
    }); 
    ... 
} 

장점이 있다는 것입니다 :

b.addEventListener(flash.events.MouseEvent.CLICK, function($evt:MouseEvent) { 
    trace($evt.target.parent); 
    $evt.target.parent.stopStream(); // May require casting, but probably not 
} 

또는

b.addEventListener(flash.events.MouseEvent.CLICK, __handleStopClick); 

private function __handleStopClick($evt:MouseEvent):void { 
    this.stopStream(); 
} 
+0

개체가 함수로 전달된다는 것은 완벽합니다. haxe는 변수 이름에 $를 허용하지 않지만 두 방법 모두 완벽하게 작동합니다 (캐스팅하지 않음). 정말 고마워! – RSG

+0

변수 이름에 $가 없습니다 ... ack !!! 나는 그것 없이는 살 수 없었다 :) – sberry

1

그것을 할 수있는 또 다른 일반적인 방법은 다음과 같다 "self"는 올바르게 입력되었으며 캐스팅 할 필요가 없습니다. 우리는 "자체"트릭을 불필요하게 만들 때 이러한 기본 범위로 "this"를 추가하려고합니다.