'Flash/AS2.0'에 해당되는 글 27건

  1. Tween과 Cross Scripting //2011/01/24 16:25
  2. 문자열 byte 수 알아내기
  3. TextField.bottomScroll, TextField.maxcroll //2009/07/17 11:08
  4. 콤포넌트 스킨 변경하기 //2009/01/20 00:41
  5. static을 이용한 클래스 사용 시 주의! //2008/12/30 14:13
  6. onLoadStart의 타이밍 문제 //2007/06/29 01:26
  7. MovieClipLoader listener missing 리스너 오작동 //2007/05/11 17:32
  8. Component Focus //2007/03/30 18:32
  9. Flash 8 | FlashPlayer 8 로컬 보안 해법 //2007/03/22 14:53 1
  10. playheadUpdate //2007/03/21 10:09 1
  11. setNewTextFormat , setTextFormat //2007/03/20 00:35
  12. crossdomain //2007/03/18 14:44
  13. Event
  14. XMLNE
  15. XMLLoaderNE

서로 다른 도메인에 존재하는 swf간의 크로스 스크립팅을 이용시 System.security.allowDomain("*"); 을 설정해야 한다.


이 때, 로드하는 swf에 위 설정을 하지 않고 로드 되는 swf에 내장 클래스인 Tween을 이용하면 자식클래스의 설정과 관계없이 "*** 보안 샌드박스 위반 *** 자식 swf에서 부모swf로 접근을 하려 한다"라는 메세지와 함께 오류가 발생하며 작동을 멈추게 된다.


Tween 클래스 이용시 유의할 필요가 있다.

// as2
function getByte(str:String):Number {
	var byte:Number = 0;
	var len:Number = str.length;
	for (var i:Number = 0; i < len; ++i) {
		var code:Number = str.charCodeAt(0);
		// check 2byte character
		if (code < 255) {
			byte = byte + 1;
		} else {
			byte = byte + 2;
		}

	}

	return byte;
}


var ts:String = "!~##$%^&*(()_+=-09876543421`가asdf";
trace(getByte(ts));

TextField.bottomScroll

TextField.maxcroll


위 속성들은 TextField.autoSize = true 일 때

TextField에 text가 입력되면서 바로 확인하면 아직 갱신 되지 않은 상태로 나타난다.

 

TextField._height는 바로 갱신되어 나타난다.

 

높이나 줄 수를 제한하고 싶을 때는 TextField._height를 이용하는 것이 좋을 것이다.



C:\Program Files\Adobe\Adobe Flash CS3\en\Configuration\Component Source\ActionScript 2.0\FLA

 

위 경로의 소스 fla파일을 열어서 라이브러리의 해당 스킨을 프로젝트 fla파일에 옮겨 수정한다.

 

주의 - 이렇게 라이브러리에서 복사해오면 해당 콤포넌트 심볼의 '첫프레임에 내보내기'에 체크가 되어 있지 않으므로 이를 체크해준다.

클래스(s.as)의 static 변수를 사용하면 해당 swf파일에 s.as의 모든 내용이 임포트된다.

 

이 때문에 con.swf에서 s.as의 static변수를 이용한 a.swf를 로드한 후 수정된 s.as를 사용한 s.swf를 로드하면 이미 구버젼의 s.as가 있기때문에 수정된 s.as파일이 아니라 구버젼의 s.as파일이 적용된다.

 

설명이 복잡하지만, 이미 로드된 as를 덮어씌우지 않는 다는 것을 염두하고 생각하면 이해가 쉽다. 다만 static변수를 1개라도 이용한다면 클래스의 모든 내용(안에서 이용된 클래스들까지도)이 함께 로드된다는걸 주의하면 되겠다.

MovieClipLoader의 리스너 중에서 onLoadStart는 로드 명령을 내리면 바로 실행되지 않고, 약간의 딜레이가 있는 후 (아마도 파일의 일부가 로드되기 시작하는 순간부터 일 것으로 추정) 실행된다.

 

그 때문에, 이전에 공개한 ImageLoader의 버퍼를 세밀하게 작동시켰을 때, 이 부분에서 에러가 난다.

 

로더는 이미 로드 명령을 내렸지만, 로드를 확인하는 버퍼에는 아직 로드 중이 아닌 것으로 확인이되어 (위의 딜레이 때문에),

같은 자리에 다시 로드 명령을 내려버린다. 그러면 이미 로드하던 무비클립이 중복(삭제)이 되어서 리스너가 마비가 되버린다.

 

ImageLoader에서의 리스너 마비는 프로그램 작동 중단의 상태로 이어지게된다. 하나하나 로드를 순서있게 하는 중에 리스너가 멈추게 되면 버퍼에 남은 이미지들을 로드하지 못하기 때문이다.

 

그래서, onLoadStart의 실행이 아니라 로드 명령을 내리는 순간에 dispatcher를 작동시켜서 이를 방지했다.



private function load():Void {
  //버퍼에 남은 이미지가 있고, 로딩중이 아니면 로드시작
  if (buffer.hasNext() && !_isActive) {
   _isActive = true;
   var data:Object = buffer.next();
   var url:String = String(data.url);
   _index = Number(data.index);
   var target:MovieClip = MovieClip(data.target);
   //
   swfLoader.loadClip(url, target);
   dispatchEvent({type:LOAD_START, target:target, index:_index}); // 딜레이를 기다리지 않고 바로 이벤트를 날린다.
  }
 }
 private function onLoadStart(_mc:MovieClip):Void { 
  //dispatchEvent({type:LOAD_START, target:_mc, index:_index});
 }

순차 로딩을 하기위해서 배열에 컨테이너 무비클립을 순서대로 넣어 놓은 후, 버퍼에 의해서 필요없는 무비클립을 배열에서 참조하여 삭제한다.

 

강제적으로 무비클립을 삭제해버리면(로드중인 무비클립을 삭제해 버리면), MovieClipLoader의 리스너가 작동하지 않게된다.

 

순차 로딩에서 리스너가 다운된다면 연속로딩을 할 수 없으므로, 지우고자하는 무비클립중 로드중인 것은 우선 로드시킨 후 삭제 하는 방식으로 구현하였다.

Component Focus

 

이전에 작업했던 플래시에 문제가 있다는 말을 보고 예전 소스를 열어서 살펴 보았다

 

마우스가 플래시영역으로 들어가면 휠이 작동하지 않는다는 내용이었다. 이것저것 테스트해보니 정말로 그 플래시만 포커스를 잡고 있는 것이었다.

 

이리저리 살펴보니 문제는 콤포넌트였다. 콤포넌트가 라이브러리에 등록되어 있으면, 실행중에 사용되지 않더라도 포커스가 제대로 작동하지 않았다.

 

범인은 '버튼'이었고 예전 '콤보박스'의 포커스 문제 이후로 다른 문제였다. (비슷하지만..)

 

- 라이브러리에 콤포넌트(버튼)가 등록되어 있으면 마우스 이벤트를 주지 않은 플래시에도 휠이 작동하지 않는다.

출처 - http://rhinoa.tistory.com/tag/%EB%A1%9C%EC%BB%AC%EB%B3%B4%EC%95%88

 

(방법1) 설정 관리자. (유저가 직접 설정)

설정 관리자의 보안 패널을 방문하면 신뢰할 수 있는 경로를 목록에서 직접 편집, 추가 또는 제거할 수 있습니다(그림 2 참조).





  • 그림 2. Flash Player 설정 관리자의 보안 설정

(방법2) FlashPlayerTrust 구성 파일. (자동 설치 방식)

이것은 신뢰할 수 있는 경로를 나열한 단순한 텍스트 파일입니다. 이 파일은 실행 가능한 설치 프로그램을 사용하여 만들 수 있습니다. 설치 프로그램에서 사용자 컴퓨터에 SWF를 설치할 때 신뢰 구성 파일을 설치하여 SWF를 신뢰하도록 지정할 수 있습니다. 이 작업이 각 SWF를 신뢰한다는 사용자의 결정을 명시적으로 나타내지는 않지만 설치 프로그램(실행 가능한 프로그램)을 실행함으로써 이 프로그램에 대한 사용자의 신뢰를 암시적으로 표시하는 것입니다. Flash Player는 두 위치에서 신뢰 구성 파일을 인식합니다. 하나는 컴퓨터의 모든 사용자에게 적용되고 다른 하나는 현재 사용자에게만 적용됩니다. OS 수준의 관리자 권한이 필요하면 모든 사용자 위치를 선택합니다. 각 위치는 다음과 같습니다.

    • Windows 모든 사용자:

      <system>\Macromed\Flash\FlashPlayerTrust

      (예: c:\WINNT\system32\Macromed\Flash\FlashPlayerTrust)

    • Windows 단일 사용자:

      <app data>\Macromedia\Flash Player\#Security\FlashPlayerTrust

      (예: c:\Documents and Settings\fred\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust)

    • Mac OS 모든 사용자:

      <app support>/Macromedia/FlashPlayerTrust

      (예: /Library/Application Support/Macromedia/FlashPlayerTrust)

    • Mac OS 단일 사용자:

      <app data>/Macromedia/Flash Player/#Security/FlashPlayerTrust

      (예: /Users/fred/Library/Preferences/Macromedia/Flash Player/#Security/FlashPlayerTrust)

이 위치는 디렉토리이며 개별 파일이 아닙니다. 이러한 각각의 디렉토리에 원하는 개수의 구성 파일을 설치할 수 있습니다. Flash Player는 디렉토리에서 찾는 모든 파일을 읽습니다. 구성 파일은 FlashPlayerTrust의 하위 디렉토리에 저장할 수 없으며, FlashPlayerTrust 디렉토리에 직접 저장해야 합니다. 개별 구성 파일에 원하는 이름을 지정해도 되지만, 이름 충돌 문제를 방지하려면 설치 프로그램을 통해 해당 제품에만 사용하는 방법으로 구성 파일의 이름을 지정해야 합니다. FlashPlayerTrust 디렉토리는 지정된 시스템에 없을 수도 있으며 그러한 경우에는 설치 프로그램으로 만들어야 합니다.

이 파일의 구문은 매우 단순합니다. 로컬 경로를 한 줄에 한 개씩 무제한으로 포함할 수 있고 공백과 빈 줄을 사용할 수 있습니다. 주석은 # 문자와 함께 사용할 수 있으며 줄 끝에 표시됩니다. 공백을 포함하는 경로에는 작은 따옴표를 사용할 필요가 없으며 사용하면 문제가 발생합니다.

이 파일에는 ASCII가 아닌 문자를 포함할 수 있는 일부 사용자 컴퓨터의 파일 시스템 경로가 있으므로 FlashPlayerTrust 파일에서 사용하는 텍스트 인코딩이 매우 중요합니다. Flash Player는 이 파일의 시작 부분에서 유니코드 BOM(Byte Order Mark: 바이트 순서 표시 문자)을 찾아 UTF-8 및 UTF-16 BOM을 인식하고 파일의 나머지를 UTF-8 또는 UTF-16으로 처리합니다. (예를 들어 Windows 메모장과 Mac TextEdit에서 BOM을 포함하는 유니코드 텍스트 파일을 작성할 수 있으며 다른 여러 가지 텍스트 편집기에서도 동일한 작업을 수행할 수 있습니다.) FlashPlayerTrust 파일의 시작 부분에서 BOM을 찾지 못하면 해당 파일이 컴퓨터의 현재 "코드 페이지"(기본 로컬 인코딩)을 사용하는 것으로 해석됩니다.

 

 

3.FlashPlayerTrust 세부적인 설치 방법

 

FlashPlayerTrust 설치 경로 (windows 2000/XP)

- 전체사용자 적용시

C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust\파일명.cfg


- 개인사용자 적용시

C:\Documents and Settings\user\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust\파일명.cfg


파일명.cfg 내용 (파일명은 자유롭게)

- 특정파일만 신뢰 할때.
C:\경로\파일명.swf
C:\경로\파일명.html


- 폴더전체를 신뢰할때.
C:\경로\


[시나리오] CD-TITLE 배포시 

CD-TITLE 배포시 문제는 사용자 마다 CD롬의 드라이브 ID가 각각 다르다는 것. (D,E,F,G...)

그렇다고 모든 드라이브를 보안 해제하는건 너무 무책임 하다...

따라서, 예상 가능한 드라이브 밑에 특정 폴더를 만들어 보안 해제하는 방법을 쓰면 되겠다.

 

예)

1. [virusdesign]이라는 폴더를 만들어 개발한 모든 파일을 담는다.(swf,flv,as,,html,xml....등등)

2. virusdesign.cfg 파일을 만든다.

3. virusdesign.cfg 에 보안해제 경로를 적어준다.   

   ( D:\virudesign , E:\virudesign , F:\virudesign , G:\virudesign )

4. 이제 FlashPlayerTrust폴더 경로에 자동설치 해주는 인스톨 파일을 만든다.

(인스톨경로-C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust\virusdesign.cfg)

5. CD를 삽입하면 오토런으로 인스톨이 되도록 해주면 더욱 좋을 것이다.

샘플파일-FlashPlayerTrust-goodvirus.zip

 


4. 자동 설치 파일(install) 제작 소프트웨어들.

1.인스톨쉴드(유료)  인스톨쉴드9사용법파워포인트-angeleyes80.zip

2.Nullsoft Scriptable Install System(NSIS)(무료) http://file.naver.com/view.php?fnum=104917

3. Advanced Installer(무료) http://file.naver.com/view.php?fnum=101030

4. Nix Install(무료) http://www.channeld.co.kr/Nixline/product/pro02.html



--------------------------------------------------------------------------------------


5. 추가 TIP


1. flash 8부터는 HTML에서 allowScriptAccess="always"을 해주어야 자바스크립트와 연동이 된다.


2. geturl 또는 fscommand 등... 네트웤 관련 함수들을 사용하지 않는 컨텐츠구성 이라면

위의 방법이 아닌, 플래쉬 프로젝트파일(exe)로 만들어 배포 하는것이 좋다.


3. flash8 보안에 관련된 조금더 자세한 사항를 보려면 http://blog.naver.com/goodvirus/50002738422


4. C:/WINDOWS/system32/Macromed/Flash 밑에 FlashAuthor.cfg 파일은 LocalSecurityPrompt=User 로 바꾸어 항상 최종사용자(user) 입장에서 개발하는 것이 좋다.


5. 간혹, cfg파일을 설치 하였는데, 보안이 해제 안되는 경우?

1. 설정된 디렉토리명 또는 그 하위 디렉토리명이 한글일때, 영문으로 바꿔준다.

2. (1번으로 안될 경우) 브라우져를  모두 껏다가 다시 켠다.

3. (2번으로 안될 경우) 컴퓨터 재부팅 한다.


---------------------------------------------------------------------------------------

가끔 동영상을 flv로 변환한 파일을 재생시키면, complete이벤트가 작동하지 않는 경우가 있다. playhead가 totaltime까지 도달하지 못해서 생기는 현상으로 보여진다.

 

여러개의 flv를 연속 재생시키기위해선 현재 동영상의 마지막을 알아야만 다음 flv를 재생시킬 수 있을텐데, complete가 작동하지 않으면 연속재생이 되지 않기때문에, playheadUpdate이벤트마다, 일정 시간뒤 (약 1초) 다음 flv를 재생시키는 setTimeout를 삭제/호출하면 마지막 playhead가 멈춰있을 경우 일정 시간뒤 다음 flv가 재생된다.

 

이때 주의 해야할 것이, playheadUpdate가 이전flv의 rewind과정에서도 작동을 하여 setTimeout의 삭제가 잘 되지 않는 것이다.

flv.state를 이용해서 playing시에만 setTimeout을 실행하도록 하면 문제가 해결된다.

 

단, 위의 방법은 flv의 다운로드가 늦어져 playhead가 멈춰있는 시간이 일정시간 이상이 되면(재생 중간이라도) 다음 flv가 재생되게 되므로 이를 고려해야한다. 

'Flash > AS2.0' 카테고리의 다른 글

Component Focus //2007/03/30 18:32  (0) 2012.06.05
Flash 8 | FlashPlayer 8 로컬 보안 해법 //2007/03/22 14:53  (1) 2012.06.05
setNewTextFormat , setTextFormat //2007/03/20 00:35  (0) 2012.06.05
crossdomain //2007/03/18 14:44  (0) 2012.06.05
Event  (0) 2012.06.05

setNewTextFormat 은 텍스트포멧 설정 후에 텍스트를 입력해야한다. 이전에 입력된 텍스트에는 적용이되지 않는다.

setTextFormat 은 설정 전 텍스트가 입력되어 있어야한다. 이후에 텍스트가 입력되면 텍스트포멧은 사라진다.

'Flash > AS2.0' 카테고리의 다른 글

Flash 8 | FlashPlayer 8 로컬 보안 해법 //2007/03/22 14:53  (1) 2012.06.05
playheadUpdate //2007/03/21 10:09  (1) 2012.06.05
crossdomain //2007/03/18 14:44  (0) 2012.06.05
Event  (0) 2012.06.05
XMLNE  (0) 2012.06.05

crossdomain //2007/03/18 14:44

크로스 도메인 설정에

- 영향이 있는 파일 : php/asp 등 웹언어, swf, xml, txt

- 영향이 없는 파일 : 이미지파일, flv파일

 

(이미지 파일은 다른 도메인일 경우 로드는 되지만, BitmapData draw는 되지 않는다)

'Flash > AS2.0' 카테고리의 다른 글

playheadUpdate //2007/03/21 10:09  (1) 2012.06.05
setNewTextFormat , setTextFormat //2007/03/20 00:35  (0) 2012.06.05
Event  (0) 2012.06.05
XMLNE  (0) 2012.06.05
XMLLoaderNE  (0) 2012.06.05

Event

class com.showjean.Event {
	public static function get COMPLETE():String {	return "complete";	}
	public static function get ERROR():String 	{	return "error";	}
	public static function get START():String 	{	return "start";	}
	public static function get PROGRESS():String {	return "progress";	}
	public static function get INIT():String {	return "init";	}
}

'Flash > AS2.0' 카테고리의 다른 글

setNewTextFormat , setTextFormat //2007/03/20 00:35  (0) 2012.06.05
crossdomain //2007/03/18 14:44  (0) 2012.06.05
XMLNE  (0) 2012.06.05
XMLLoaderNE  (0) 2012.06.05
Adapter  (0) 2012.06.05

XMLNE

/*
 * XMLNE 
 *
 * @author: showjean in http://showjean.com/works
 * @version: 1.0.0
 * @date: 2008.7.11.
 *
 * @comment: XML의 각 노드의 속성과 노드밸류를 Object형태로 반환
 
 var xml:XML = new XML('
 
	
		
			showjean
		
		
			qwer
		
		
			1111
		
	

');
 
 
 var obj:Object = XMLNE.create(xml.firstChild);
 
 obj.attributes.text -> "abcd"
 obj.test[0].attributes.name -> "dododo"
 obj.test[0].unit[0].value -> "showjean"
 obj.test[0].unit[0].attributes.type -> "string"
 
 * 
 */
class com.showjean.XMLNE { 

	public static function create(xml:XMLNode):Object {
		var x:XMLNE = new XMLNE();
		return x.adapt(xml);
	}
	private function adapt(xml:XMLNode):Object {
		var obj:Object = new Object();

		// 속성 저장/
		for (var name in xml.attributes) {
			obj.attributes = xml.attributes;
			break;
		}
		for (var currentNode:XMLNode = xml.firstChild; currentNode != null; currentNode=currentNode.nextSibling) {
			var name:String = currentNode.nodeName;
			if (currentNode.nodeType == 1) {
				if (obj[name] == undefined) {
					obj[name] = new Array();
				}
				obj[name].push(arguments.callee(currentNode));
			} else if (currentNode.nodeType == 3) {
				obj["value"] = currentNode.nodeValue;
			}
		}
		return obj;
	}
}

'Flash > AS2.0' 카테고리의 다른 글

crossdomain //2007/03/18 14:44  (0) 2012.06.05
Event  (0) 2012.06.05
XMLLoaderNE  (0) 2012.06.05
Adapter  (0) 2012.06.05
SimpleButtonHandler //2007/03/18 13:22  (0) 2012.06.05

XMLLoaderNE

/*
* XMLLoaderNE
*
* @author: showjean in http://showjean.com/works
* @version: 1.0.0
* @date: 2008.11.25.
*
* @comment: event - 
*/
import mx.events.EventDispatcher;
import com.showjean.utils.Adapter;
import com.showjean.Event;
class com.showjean.net.XMLLoaderNE extends EventDispatcher {
	private var _interval:Number;
	private var _xml:XML;
	//
	public function XMLLoaderNE() {
	}
	//로드 진행을 알리는 메소드. 
	private function checkProgress():Void {
		var l:Number = _xml.getBytesLoaded();
		if (l>0) {
			dispatchEvent({type:Event.PROGRESS, bytesLoaded:l, bytesTotal:_xml.getBytesTotal()});
		}
	}
	private function callProgressor():Void {
		clearInterval(_interval);
		_interval = _global.setInterval(this, "checkProgress", 30);
	}
	public function load(tar:String):Void {
		_xml = new XML();
		_xml.ignoreWhite = true;
		_xml.load(tar);
		callProgressor();
		_xml.onLoad = Adapter.wrap(this, __xmlLoaded, tar);
	}
	private function __xmlLoaded(suc:Boolean, tar:String):Void {
		clearInterval(_interval);
		if (suc) {
			//trace("XML loaded");
			checkProgress();
			dispatchEvent({type:Event.COMPLETE, data:_xml, url:tar});
		} else {
			//trace("XML load failed");
			dispatchEvent({type:Event.ERROR, data:_xml, url:tar});
		}
	}
}



- 사용법

System.useCodepage = true;
import com.showjean.net.XMLLoaderNE;
import com.showjean.Event;
import com.showjean.utils.Adapter;
import com.showjean.XMLNE;


var lv = new XMLLoaderNE();
lv.load("test.xml");
lv.addEventListener(Event.COMPLETE,this);
lv.addEventListener(Event.PROGRESS,this);
var obj:Object;
function complete(evt:Object):Void {
	trace(evt.data);
	obj = XMLNE.create(evt.target.firstChild);
	trace(obj.attributes.text);// -> "abcd"
	trace(obj.test[0].attributes.name);// -> "dododo"
	trace(obj.test[0].unit[0].value);// -> "showjean"
	trace(obj.test[0].unit[0].attributes.type);// -> "string"
}
function progress(evt:Object):Void {
	//trace(evt.target.getBytesLoaded());
}


'Flash > AS2.0' 카테고리의 다른 글

Event  (0) 2012.06.05
XMLNE  (0) 2012.06.05
Adapter  (0) 2012.06.05
SimpleButtonHandler //2007/03/18 13:22  (0) 2012.06.05
한글 워드랩 메쏘드 //2007/03/10 17:49  (0) 2012.06.05