본문 바로가기

TechLog

C# 어플리케이션에서 플래시 사용하기 - 2 : Using Flash Object In C# Application

C# 어플리케이션에서 플래시 사용하기 - 2 : Using Flash Object In C# Application

C# 어플리케이션 코드에서 플래시 무비의 코드를 호출하는 방법을 설명합니다.

 

 

안녕하세요 Kenial입니다 : )

 

지난 아티클의 연장입니다. 이번에도 vs.net 2003, Flash MX 2004 버전 기준으로 작성되었으며, 가급적 텍스트 분량을 줄이기 위해 본문에서는 존대말을 생략하도록 하겠습니다.

 

 

C# 어플리케이션 코드에서 플래시 무비의 코드 호출하기

 

지난 강좌는 두 가지의 내용을 담고 있었다 :

 

- 플래시 무비를 포함하는 어플리케이션 만들기

- 플래시 무비에서 어플리케이션 코드 호출하기

 

하 지만 일반 어플리케이션에서 이것만으로는 충분하지 않은 것이, 때에 따라서는 Flash 무비만으로 제어할 수 없는 상황이 있을 수도 있다. 예를 들자면 어플리케이션에서 Flash 뿐만 아니라 별도의 ActiveX 컴퍼넌트를 사용하고, 그 컴퍼넌트로부터 이벤트를 받아 어떤 작업을 해야 할 경우에는 어플리케이션 -> Flash 무비로 호출이 이루어져야 하는데, 호출할 때 parameter 값도 전달해야 하는 상황이 되었다면.. 정말 좋다가도 좋지 않을 수 있다.

 

사 실 아래에서 소개하는 내용은 엄연하게 말하자면 '호출'은 아니고, '호출' 비슷한 기능을 제공하는 방법에 대한 꽁수에 가깝다고 할 수 있겠다. 필자의 내공이 짧아 아직 Flash MX 2004에서 제공하는 다른 기능을 찾지 못한 것일 수도 있으므로, 관련된 정보를 아시는 분은 가열차게 소개해 주시기 바란다 :)

 


 

아 주 간단한 방법으로는, Flash Object에서 기본으로 사용하는 기능을 사용할 수 있다. Flash Object에서 제공하는 메서드를 미리 살펴보신 여러분들은 모두 눈치를 채셨겠지만, 이 컨트롤에서는 프레임 단위의 이동을 돕는 몇 가지 메서드가 제공된다

 

 

 

 

GotoFrame(frameNum);
TGotoFrame(strTarget, frameNum);

TGotoLabel(strTarget, strLabel);

TCallFrame(strTarget, frameNum);

TCallLabel(strTarget, strLabel);

 

 

 

 

 

플 래시의 Timeline 개념을 이해하고 있는가? (아직 모르고 계신 분들은 잠시 주위의 플래셔를 붙잡아 5분 강의를 들으시기 바란다. 필자는 화면 캡처하기가 부담스러워서; 여기선 잠시 넘어가겠다) 저 메서드들은 Timeline 위에서의 특정 프레임으로 이동하거나, 그 프레임에 할당되어 있는 Actionscript를 호출하는 메서드이다.

 

'SetVariable 을 호출, _root Variable 값을 할당한다. -> TCallLabel을 호출, 할당된 Variable 값을 처리하는 스크립트 코드가 있는 프레임의 코드를 호출한다.' 의 순서대로 처리할 수 있다. 다만 이 경우에는, Timeline의 작업 특성상 코드가 분산되어 찾아보는 것 자체가 어렵다는 것도 문제고, 각 프레임의 레이블에 아무리 쉬운 이름을 주더라도 각 함수 단위로 처리하기가 쉽지 않은데다가, 인수를 전달하기 위해서는 인수에 해당하는 Variable을 잘 정리한 상태에서 작업해야 한다는 등등의 단점이 있어서 수많은 플래셔와 프로그래머들에게 노가다의 짐을 안겨주었다.

 

이런 문제가 있어서, 필자의 경우에는 특정 무비클립에서 Variable의 값을 계속 검사하는 형태로 만들어서 사용해 왔었고 이 아티클에서도 그 내용을 소개하려고 했으나, 얼마 전에 발견한 Mindfire Solutions(www.mindfiresolutions.com)의 아티클이 있어 그 내용을 대신 소개하도록 하겠다. (코드 내용은 Flash MX 2004에 맞춰 약간 수정되었다)

 

. 시작하자.

먼저 다음과 같은 형태의 애플리케이션을 만들어 보자 :

 

 

 

 

할 일은 간단하다 : 어플리케이션의 '플래시호출' 버튼을 누르면, 플래시 무비의 Variable 'Message' 'CallFunction1'값을 할당하고, 플래시 무비에서는 이 할당된 값을 인식해서 다시 FSCommand로 어플리케이션에 'CallFunction1'이 처리되었다는 것을 알린다.

 

1. '플래시호출' 버튼(btnCall) Click 메서드를 작성한다 : 

 

 

 

 

 

private void btnCall_Click(object sender, System.EventArgs e)
{
    axShockwaveFlash1.SetVariable("Message", "CallFunction1"); 
}

 

 

 

 

 

2. 플래시 무비에서 Variable 값의 변화를 인식하고, 텍스트박스(TextBox) function의 이름을 넣고, fscommand 호출을 처리하는 코드를 작성한다 :

 

 

위 화면처럼 레이어의 프레임을 선택한 상태에서 스크립트를 넣어주면 된다. 코드는 다음과 같다 :

 

 

 

 

// 플래시 무비의 로드가 끝나면 스크립트 시작
_root.onLoad = function()
{
    //
기다리는 함수 호출
    keepWaitingForResponse();
}
 
// Message Variable
에 값이 할당되기를 기다림
function keepWaitingForResponse()
{
    // 100ms
마다 계속 호출
    // intervalID
clear되면 작동을 멈춘다
    intervalID = setInterval(
        function () {
            if (_root.Message != undefined) {
                VariableReturned(_root.Message);
            }
        }, 100);
}
 
// Variable
이 할당되면 처리하는 코드
function VariableReturned(callMessage) {
    //
호출을 멈추는 코드. 여기서는 주석처리
    //clearInterval(intervalID);
   
    //
여기서부터 실제 message에 대한 처리를 한다.
    switch(callMessage)
    {
        case 'CallFunction1':
            _root.TextBox.text = "Proc:CallMessage1";
            fscommand("Result:CallMessage1", "");
            break;
        default:
            _root.TextBox.text = callMessage;
            fscommand("-_-", "");
            break;
    }
    //
처리 후 undefined 상태로 만들어 처리를 계속할 수 있게 함
    _root.Message = undefined;
}

 

 

 

 

 

 3. 어플리케이션에서 FSCommand를 처리하는 코드를 넣는다 :

 

 

 

 

 

private void axShockwaveFlash1_FSCommand(object sender,
AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
{
    System.Windows.Forms.MessageBox.Show(e.command);
}

 

 

 

 

 

 

결과 화면은 다음과 같다 :

 

 

여기에서는 'CallFunction1'이란 이름의 Message 하나를 처리하고 있으나, 응용하기에 따라서 여러 함수를 처리하는 형태로 만들 수도 있고, 별도의 Variable을 정해 함수의 인수로서 사용할 수도 있다.

 

 

정리

 

지 난 번 아티클에 비해서는 그림이 적어지고 텍스트가 많아졌습니다. 설명해야 될 내용이 많아졌다기보다는 제가 요즘 바빠서 시달리다보니 세세하게 캡처할 상황이 안되네요. 약간 미안한 마음도 들긴 하지만, 이전 아티클에서의 내용을 따라하실 수 있을 정도가 되셨다면 이 아티클을 테스트해보는데 별 어려움은 없으실 듯 합니다.

 

이 아티클이 수많은 이종개발자(?)를 양산하는데에 조금이나마 보탬이 되었으면..

 

그럼 :)

 

 

 

p.s:예전에 이 글에 어느 분이 리플을 달아주셔서, watch()라는 메서드를 사용해 특정 변수 값의 변경 여부를 모니터링 할 수 있다는 것을 알려주셨으나 ... 어느 분인지 알 길이 없어라 '`)