2012-03-14 2 views
2

So. 엄청난 양의 코드를 게시하지 않고. 기본적으로 ActionScript3를 사용하여 플래시 CS5에서 FLA 파일로 가져온 사운드를 몇 개 가져오고 있습니다.movieclip이 removeChild를 통해 제거 된 후에 Flash AS3 사운드가 재생됩니다.

나는 사운드 채널을 만들고 메인 클래스에서 생성 된 사운드의 인스턴스를 가지고 있습니다.

생성자 함수에서 addChild로 만든 첫 번째 장면이 있습니다. 또한 사운드 채널을 통해 배경 음악 사운드를 초기화합니다.

문제는 사운드 효과가 첫 번째 장면의 프레임 40에서 재생되기를 원합니다. 방금 사운드를 타임 라인에 넣으면 장면 2를 삽입하기 위해 장면을 제거한 후에도 해당 사운드 효과가 계속 재생됩니다. 또한 사운드를 재생하기 위해 프레임 40에 actionscript를 사용하려고 시도했지만 removeChild 후에도 반복됩니다.

어떻게해야할까요? 메인 클래스에 모든 코드를 유지하는 것을 선호하지만 개별 장면에 스크립트를 추가해야만합니다. 그냥 나는 소리를 멈추게 할 수 있었으면 좋겠다 !!!

답변

0

removeChild는 소리를 중지 할 책임이 없으며 시각적으로 제거하여 자식 목록에서 displayObject 만 제거합니다.

시작한 사운드를 중단하려면 removeChild를 호출 할 때 해당 SoundChannel에 대한 참조가 필요합니다. 그런 다음 SoundChannel.stop()을 사용하십시오. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundChannel.html#stop()

보다 정확한 답변을 제공하기 위해 더 많은 정보가 필요합니다.

시도한 옵션 중 하나가 프레임 40에서 타임 라인 내부에서 사운드를 재생하는 중입니다. 그런 다음 문제는 displayObject가 이미 제거되었지만 여전히 재생되는 것입니다. 내가 좋아하는 솔루션은 아니지만 작동합니다이 경우에, 당신이 할 수 있습니다 :

// on frame 40 
if (this.stage != null) { 
    // play sound here 
} 

이의 DisplayObject의 무대가 무대에 아직 있다면, (존재하는이, 자식으로 추가되었다되고있는 경우 의미합니다 아직 제거되지 않았다면) 내부의 코드가 실행됩니다. 갑자기 사라지더라도 사운드는 계속 재생됩니다. 사운드 채널을 중지하려면 여전히 SoundChannel에 대한 참조가 필요합니다. 객체 내부에서 addEventListener(Event.REMOVED_FROM_STAGE, func)을 사용하면 객체가 제거 된시기를 알 수 있으며 참조 된 함수 내에서 SoundChannel.stop 코드를 실행할 수 있습니다.

- 편집 : 사실이 작업을 수행 할 수있는 적절한 방법이 실제 타임 라인 내에서 개체를 만들 때

, 여기에 이벤트를 추가 할 수 있습니다 : 다음

myObjectWithSoundInside.addEventListener(Event.REMOVED_FROM_STAGE, objRemoved) 

function objRemoved (event:Event):void { 
    // This is where you SoundChannel.stop() 
} 

당신이 removeChild(myObjectWithSoundInside)을 실행할 때를, objRemoved의 내부 코드가 정확하고 잘 참조되었다고 가정하면 사운드가 멈춰야합니다.

+0

답장을 보내 주셔서 감사합니다! 그래서 object (scene1) 내에서 REMOVED_FROM_STAGE 이벤트를 사용하기로 결정했다면 프레임 40 내부에서도 함수를 빌드 할 수 있습니까? 또한 프레임 40에 채널과 사운드 객체를 만들겠습니까? 무비 클립 내부에서 채널에 액세스하려고하면 오류가 발생하므로 채널 및 사운드 인스턴스를 객체 내부에 넣어야합니다.이 객체는 끔찍한 방법으로 보입니다. – nobi

+0

타임 라인에 포함 시키면 나쁜 결과를 초래할 수 있습니다. 나는 당신의 프로젝트 구조를 이해하고 있는지 확신 할 수 없다. 어쨌든, 똑같은 일 - 외부에서 REMOVED_FROM_STAGE 이벤트를 가져올 수 있습니다. 여기에서 SoundChannel을 중지 할 수있는 적절한 참조가 있습니다. 업데이트 된 답변을 확인하십시오. 도움이되기를 바랍니다. – ido

1

SoundChannel이 문제의 사운드를 담당하는 모든 경우에 SoundChannel.stop()을 사용해야합니다.

사운드를 타임 라인에 삽입하는 대신 this example에 따라 사운드를로드하고 재생하면 사용자에게 필요한 SoundChannel 인스턴스에 액세스 할 수 있습니다.

1

동일한 문제가 생겼습니다. 부모 클립이 클립에 일부 프레임 인 사운드가있는 자식을로드하고있었습니다 (지연되었습니다). 아이를 제거하면 보 기 단계 만 제거되었지만 사운드는 계속 반복됩니다.나는 소리가 자식 무비 클립에서 재생 된 프레임으로이 코드를 삽입하고는 모두 수정되었습니다 : 아이가 루프를 제거 지금 때마다

if (this.stage == null) { 
    SoundMixer.stopAll(); 
} 

가 중지됩니다. 나는 아이가 연주 한 사운드 클립이있는 모든 키 프레임에 대해이 작업을 수행해야했습니다.

+0

좋아, 멋진 아이디어 덕분에, 나는 이런 식으로 뭔가를 사용했다고 생각한다. 또한 이것을 키 프레임 대신 클래스 정의에 넣는 것이 더 좋을 수도 있습니다. 즉, 모든 코드를 동일한 장소에서 타임 라인에서 지울 수 있습니다. – nobi

관련 문제