'Flash'에 해당되는 글 48건

  1. 2008.05.25 if문의 복합 연산자 1
  2. 2008.05.22 조건문
  3. 2008.05.20 값의 비교
  4. 2008.05.19 수학적 연산자
  5. 2008.05.19 이벤트 핸들링
  6. 2008.05.16 Flex 실행 메모리 할당 1
  7. 2008.05.16 텍스트 필드 팁
  8. 2008.05.16 디스플레이 오브젝트 상속구조
일반적으로 많이 쓰이는 조건문중에 if문은 복합연산자를 사용하여 여러 조건을 판단 할 수가 있다.
사용 방법은 if구문의 조건식에서 && , || , ! 과 같은 논리연산자를 사용하여 문장을 만든다.

&& (and,이고,그리고) : 조건식A와 조건식B를 모두 만족해야 코드블럭의 명령문을 실행한다.
if( 조건식A && 조건식B   ){
    명령문
}

|| (or,또는,이거나) :
조건식중에 어느 1개만 만족해도 명령문이 실행한다.
if( 조건식A ||조건식B   ){
    명령문
}

! (NOT, 아니다) : 조건식이 만족하지 않을 때 실행한다.
if( !( 조건식 )   ){
    명령문
}
*조건식을 묶는 경우보다 값의 비교를 != 으로 사용하는 경우가 더 많다.

var name:String = "olga";
if( !(name == "olga") ){
  명령문
}

위의 코드는 이름이 olga가 아닌 경우에 명령문을 수행하도록 하는 것이다.
같은 방법으로 다음과 같이 사용한다.
var name:String = "olga";
if( name != "olga" ){
  명령문
}

Posted by 버터백통

조건문은 명령문의 실행을 논리적 결정하에 선택적으로 실행하도록 한다.

1) if문 : 한 두가지 이상의 조건을 체크할때 실행한다. 하지만 두가지 이상일 때는
switch문을 실행하는 것이 좋다.

- 구조식
if( 검사식 ){
    명령문 //검사식을 만족하면 실행
}

검사식의 조건에 참이냐 거짓이냐의 여부가 명령문의 실행 여부를 관리하게 된다.

추가로 else라는 구문을 더해서 위의 검사식에 만족(true)를 못하면 다음 코드블럭의 명령문을 실행하게 한다.
if( 검사식 ){
    명령문
}else{
  
명령문 //위의 검사식을 만족 못할 시 실행
}


또는 else에 if구문을 추가해서 다시한번 검사를 하기도 한다.
if( 검사식1 ){
    명령문
}else if( 검사식2 ){
  
명령문 //위의 검사식1을 만족 못하고 검사식2를 만족할 때만 실행
}
위의 식에서 검사식1과 검사식2를 모두 만족(true)못하면 두명령문 모두 실행하지 않는다.

* 효율적인 조건문 체크
else if를 사용하여 첫번째 검사식이 만족하면 다음 검사식은 실행하지 않는다.
따라서 상호 베타적인 조건식에서는 여러개의 if문을 사용하기 보다는 else if 를 사용하는 것이
효율적이다.


마지막으로 if구문과 else if 그리고 esle문을 사용한다면 else로 마무리 하여야 문법상 오류가 없다.
if( 검사식1 ){
    명령문
}else if( 검사식2 ){
  
명령문
}else{
  명령문
}




2) switch문 : 여러개의 조건을 체크하기 위해서 사용한다.
 if문이나 else if를 추가해서 사용하는 것보다는 비교적 읽기 쉽고 간단해진다.

- 구조식
switch( 비교대상){
 
  case 검사식:
             명령문
    case 검사식:
             명령문
    case 검사식:
             명령문
   
default:
             명령문
}
비교대상에 사용된 변수나 값이 case문의 검사식에 만족하면 해당 명령문을 실행시킨다.


* switch문은 만족된 case가 실행되면 switch문 본체에서 현재 만족된 case문 하단의 모든 case문이 실행하게 된다(default 포함)
switch( 비교대상){
 
  case 검사식:
             trace(1)
    case 검사식:  -> 만족
             trace(2)
    case 검사식:
             trace(3)
   
default:
             trace(4)

}
두번째 case에서 만족하게 되면 하위 모든 case가 실행하게 된다.
따라서 이를 방지하기 위해서는 break를 사용하여 실행을 중지하여야 한다. 주로 break는 마지막 실행문에서는 사용하지 않는다. 검사식이 마지막에서 실행할 때에는 이미 하위의 case가 없으므로 생략해 주는 것이 좋다.


가령 변수 a="flash"라고 할때 아래 명령문중에서 trace("플래시")가 실행하게 된다.
var a:String = "flash"
switch(a) {
    case "100" :
           trace("문자 100");
           break;
   
case "flash" :
           trace("플래시");
           break;
    case "플래시" :
           trace("flash");
           break;
    default :
           trace("다시 시도하여 주세요!");
}
위에서 변수 a의 값을 비교대상으로 지정하고 그 값을 각 case문에서 비교하게된다.
변수a의 값은 "flash"이므로 case "flash"에서 만족하게 되어 빨간색 부분이 실행하게 된다.


3) 삼항연산자 : 한 문장에서 조건 체크와 명령문을 만들어 사용한다.
변수명 = 조건식 ? 실행문1 : 실행문2;
조건식에 만족하면 " : " 왼쪽의 실행문1이 실행하고 만족하지 않으면 실행문2가 실행한다.

var a:Number = 10;
a == 10 ? trace("변수 a는 10이다") : trace("변수 a는 10이 아니다")
위와 같이 코딩하였을 때 a의 값은 10이므로 앞의 조건식을 만족하여 좌항(빨간색)의 명령문이 실행한다.

Posted by 버터백통

플랙스도 다른 언어와 마찬가지로 값을 비교하기 위해서는 등호/부등호를 사용하여 같은지 여부를 Boolean값으로 반환을 한다. 
이러한 등호/부등호 연산자는 값을 비교하기전에 두 값을 같은 데이터타입으로 변환시키고 서로의 값을 비교한다.
가령 10 == "10"은 서로 다른 데이터 타입이지만 반환은 true를 반환한다. 이는 엄격하지 않은 환경에서 실행하였을 때 데이터 타입을 같은 타입으로 변환 비교 분석하므로 데이터 타입조차 우선 비교하기 위해서는 strict모드를 사용한다.

우선 비교적 엄격하지 않은 환경에서 값을 비교시
a:Number = 10
b:String = "10"
trace( a == b ) //출력:true
위의 코드는 true를 반환한다. 보다 정확한 검사를 하고 싶으면 엄격(strict)한 비교연사자를 사용한다.
a:Number = 10
b:String = "10"
trace( a === b ) //출력:false
엄격한 비교연산자 "==="이나 "!=="을 사용하여 데이터 타입조차 체크한다면
위의 결과값은 false를 반환하게 된다.

하지만 기본적으로 플랙스빌더의 컴파일러는 default가 strict를 사용하고 있으므로
a:Number = 10
b:String = "10"
trace( a == b ) //출력:false
는 false를 반환하게 된다. 이는 strict한 조건을 체크하기 때문에 값의 비교에 앞서
데이터 타입을 먼저 체크하고 이를 반환하게 되는것이다.

또한 데이터 타입 검사는 is연산자를 통하여 수행하기도 한다.
a:int = 10
if( a is int ){
    trace("Int !!")
}
결과는 콘솔에 "Int !!"를 출력한다.

액션스크립트는 데이터 타입에 따라 서로다른 검사방법으로 조건을 체크한다.
* 기본 데이터 타입 : String , number , int , Boolean...
* 복합 데이터 타입 : object , Sprite , Array , ByteArray , BitmapData..
기본 데이터 타입의 검사방식은 그들의 값을 비교하게 된다.
var a:Numbar = 10;
var b:Number = 10;
trace( a == b ) // 출력 : true

그러나 복합 데이터 타입의 그들의 참조(reference)로 비교하게 된다.
var a:Array = ["a","b","c"];
var b:Array = ["a","b","c"];
trace( a == b ) // 출력 : false

var a:Array = ["a","b","c"];
var b:Array = a
trace( a == b ) // 출력 : true
결국 복합데이터 타입은 같은 참조를 가지고 있을 때에만 동일하게 취급된다.

Posted by 버터백통
이번 내용은 아주 간단한 내용일 것이다.
일반적으로 프로그램에서 다루는 연산자는 사칙연산을 기본적으로 제공하고 있다.
나중에 Math를 배우며 좀더 깊이있는 계산법을 다루어 보고 이번에는 간략한 연산식만 만져보자.

덧셈 ; +
뺄셈 : -
나눗셈 : /
곱셈 : *
으로 사용되면 명령문은 a + b와 같이 사용한다
가령 a=1 , b=1이면 a+b는 2라는 값을 반환한다.
이를 변수나 다른 값에 정의하고 싶을 때는 이퀄 " = "을 사용한다.
c = a + b ; //c의 값은 2

또한 복합대입 연산자를 활용하여 값을 연산하는 경우도 있다.
a = a + 10
a += 10
------------------------------------------------------
a = a - 10
a -= 10
------------------------------------------------------
a = a * 10
a *= 10
------------------------------------------------------
a = a / 10
a /= 10
------------------------------------------------------
a = a + 1
a ++
------------------------------------------------------
a = a - 1
a --
------------------------------------------------------
복합 대입 연산자중에서 아래 ++와 --는 위치에 따라 선실행하느냐 후실행하느냐 여부가
정해진다.
a = 5
trace( a ++ ) //5  (a = a + 1)을 대입전에 trace한다
trace( a )     //6


a = 5
trace( ++ a )  //6 (a = a + 1)을 대입후에 trace한다
trace( a )      //6


Posted by 버터백통

액션스크립트 1~2까지는 아주 쉽게 이벤트를 다룰 수 있었다...
하지만 3.0에 와서는 좀 더 세밀한 제어가 가능해졌으며 그에 따르는 코드의 줄도 늘어나게 되었다.

일반적으로 이벤트청취자를 등록하는 방법은 아래와 같다.
대상.addEventListener(이벤트 타입:String , 실행함수)

위와 같이 코드를 입력했다면 대상에서 발생하는 이벤트를 괄호()뒤에 등록되어있는 함수가 실행하도록 한다.
이벤트가 발생하면 실행할 함수(리스너)는 이벤트 타입을 받아서 처리해야한다.
function(변수:이벤트타입):반환값 여부
{
       실행문
}


가령 mc라는 무비클립에 마우스다운 이벤트가 실행하면 onDown이라는 함수를 실행하라 라고한다면,
아래의 코드와 같이 처리한다.
mc.addEventListener(MouseEvent.MOUSE_DOWN , onDown)

private function onDown( event:MouseEvent ):void
{
         trace("마우스를 눌렀다!!")
}

위의 코드를 보면 이벤트 타입이 MouseEvent.MOUSE_DOWN라고 적혀있다. 이는 사용할 이벤트의 타입이
마우스(객체)이벤트이므로 MouseEvent라는 클래스에서 사용할 이벤트 타입을 정하게 되어있다.
MOUSE_DOWN이라는 이벤트 이름은 상수로서 마우스이벤트 클래스에서 설정되어있다.
클래스와 타입을 한번에 사용하려면
"mouseDown"이라고 사용하면 편리하다.
예 )  mc.addEventListener("mouswDown" , onDown);

onDown함수를 보면 매개변수 자리에 event라는 변수를 설정하였는데 타입을 MouseEvent 로 선언하였다
이는 리스너를 호출하는 이벤트 타입을 설정하여야 하며 해당 이벤트가 발생시에 리스너가 실행하도록 되어있다.

이번에는 이벤트 리스너 해제하여 보자
이벤트 등록은 위에서 처럼 addEventListener를 사용하여 청취자(리스너)를 등록하여 명령문을 실행하였다면
이벤트 제거는 이벤트가 발생하는 부분에서 add가 아닌 remove를 하게 되면 리스너와의 연결을 끊어둔다.
 mc.removeEventListener(MouseEvent.MOUSE_DOWN , onDown);


tip) 이벤트를 핸들링하는 함수가 같은 클래스에 작성되었다면 스코프를 맞추기위해 delegate를 생략한다.
delegate는 간접적인 메서드 호출자로 new없이 바로 사용이 가능하다. 만약 클래스가 다르다면 new로 생성하여
스코프를 맞추어주어야 한다.

아래 코드는 외부에서 이벤트나 사각형 그리기 클래스를 두어 delegate한 코드이다.

package
{
 import flash.display.Sprite;
 import flash.events.MouseEvent;

 public class Delegate extends Sprite
 {
  public function Delegate()
  {
   super();
   
   var draw:Rect = new Rect();
   draw.drawRect();
   addChild( draw )
   
   var delegate:DownEvent = new DownEvent();
   this.addEventListener(MouseEvent.MOUSE_DOWN , delegate.onDown)
  }
 
 }
}

//외부에서 실행하는 이벤트처리 클래스
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.Graphics;
 
class DownEvent
{
 public function DownEvent()
 {
  super();
 }
 public function onDown( e:MouseEvent ):void
 {
  trace("Down")
 }
}

//상자그리는 클래스
class Rect extends Sprite
{
 public function Rect()
 {
  super();
 }
 public function drawRect():Graphics
 {
  var g:Graphics = this.graphics
  g.beginFill(0xFF00FF);
  g.drawRect(0,0,100,100);
  g.endFill();
  return g
 }
}

tip)  Event, TimerEvent... 등과 다르게 마우스 이벤트와 키이벤트는 디스플레이 리스트에 등록된 다른 무언가를
활용하여 이벤트를 받아 와야한다. 위에 delegate 코드에서도 클릭할 수 있는 무엇이 필요해서
Rect라는 클래스를 만들고 이를 addChild하여 디스플레이 리스트에 등록하였다.
* 디스플레이 리스트 : swf에서 화면에 그리고자 하는 객체목록과 계층구조이다.
1 : stage : 계층구조의 뿌리(root)와 같은 개념으로 화면에 표현되는 모든 객체의 계층구조를
포함하는 하나의 스테이지 객체.
2 : displayObjectContainer : 컨테이너 개념으로 자신에게 다른 객체를 담을 수 있는 그릇과 같다.
3 : displayObject : 눈에 보일 수 있는 객체



Posted by 버터백통
Tip And Tech2008. 5. 16. 17:43
자바에서 JVM처럼 플렉스/플래시cs3는 AVM2라는 기반위에서 작동한다.
as1,as2는 AVM1에서 구동되고 as3는 AVM2에서 구동되어지며 대부분의 컴퍼넌트와
라이브러리를 내장하고 있기 때문에 실제 개발에 필요한 소스나 용량부분을 어느정도 플러그인단에서
해결할 수 있다고 생각한다.


우선 AVM구동시 우리의 컴퓨트는 4가지의 메모리를 할당하게 된다.
1) 스택영역(runtime stack) : 프로젝트를 실행시 사용하는 영역으로, 메모리를 이용하여 CPU에 의해 직접 관리되는 스택이다. 이는 함수를 호출하고 리턴하는데 있어서 필수적인 메커니즘이다. 런타임 스택은 항상 ESP(Extended Stack Pointer)레지스터를 이용하여 top을 가리키게 된다. 우리는 보통 스택의 개념을 설명할때 '쌓음'의 원리를 이용하여 아래서부터 위로 쌓여가는 것으로 설명하곤 한다. 하지만 IA-32아키텍쳐에서 스택은 아래로 자란다. 즉, 스택을 거꾸로 뒤집어 놓은 것이다.


<그림 1 : push동작>


2) 힙영역(garbage collection heap) : 동적 메모리 할당하는 영역으로 프로그래머가 개발시 변수등을 통하여 메모리 공간을 할당,소멸하는 영역이다. 이부분은 gc의 대상이 되어지고 system.gc실행시에 연결이 끊어진 변수나 객체는 메모리에서 제거된다.

3) 상수영역(constant & code segment) : 정적영역으로 static, const등을 할당하는 공간으로 값의 수정이나 제거가 불가능 하다.

4) 레지스터 영역 : 프로세서 실행 관련 메모리할당부분으로 CPU 안에 있는 고속 저장 장소이며 일반 메모리보다 훨씬 빠른 속도로 접근되도록 설계되었다. 레지스터의 종류로는 8개의 범용 레지스터와 6개의 세그먼트 레지스터, 프로레서 상태 플래그 레지스터(EFLAGS)와 명령어 포인터(EIP)가 있다.

사용자 삽입 이미지


 범용 레지스터(General-Purpose Register) : 범용 레지스터는 계산과 데이터 전송에 주로 사용된다. 다음 그림에서 보듯이 각 레지스터는 하나의 32비트 값이나 두 개의 16비트 값으로 다룰 수 있다. 16비트 값은 다시 2개의 8비트 값으로 다룰 수 있다.

사용자 삽입 이미지

32비트 값이 16비트와 8비트 값으로 각각 구분될 수 있는 레지스터는 다음과 같다.

사용자 삽입 이미지

나머지 범용 레지스터는 하위 16비트에 대해서만 특정한 이름을 갖는다.

사용자 삽입 이미지


*용도(Uses)
-EAX(Accumulator Register) :
  전송 및 연산에 사용. 곱셈과 나눗셈 명령어에 자동적으로 사용됨.

-EBX(Base Register) : 
  전송 및 연산에 사용. 번지의 간접 지정에 사용할 수도 있음.

-ECX(Count Register) : 
  전송 및 연산에 사용. 루프 카운터로 사용

-EDX(Data Register) : 
  전송 및 연산에 사용. 일부 연산 명령에 있어서 EAX와 함께 사용.

-ESI(Source Index) : 
  고속 메모리 전송 명령어에서 사용. 번지의 간접 지정에 사용. 스트링 명령에 있어서, 메모리로부터 레지스터로 데이터를 전송하기 위한 소스 번지의 지정에 사용.

-EDI(Destination Index) : 
  고속 메모리 전송 명령어에서 사용. 번지의 간접 지정에 사용. 스트링 명령에 있어서, 레지스터로부터 메모리에 데이트를 전송하기 위한 수신되는 목적번지를 지정할 때 사용.

-EBP(Base Pointer) :
  일반적인 계산과 데이터 전송에 사용되지 말아야 함. 스택상의 데이터 번지를 간접 지정할 때 사용. 함수 매개 변수와 지역 변수를 참조하기 위해 사용.

-ESP(Stack Pointer) : 
  보통의 계산과 데이터 전송에는 거의 사용되지 않음. 스텍의 최신 데이터가 저장되는 번지를 나타냄.


세그먼트 레지스터(Segment Register) : 실제 모드에서 세그먼트 레지스터는 세그먼트(Segment)라고 하는 미리 할당된 메모리 영역의 시작주소를 가리킨다. 보호 모드에서 세그먼트 레지스터는 세그먼트 서술자 테이블에 대한 포인터를 갖는다. 몇몇 세그먼트는 프로그램 명령어(코드)를 저장하고 다른 세그먼트들은 변수(데이터)를 저장하고 스텍 세그먼트(Stack Segment)라고 하는 또 다른 세그먼트는 함수의 지역 변수와 함수 매개변수를 저장한다.
CS(Code Segment) : 프로그램의 실행 명령어들이 내장되는 메모리 영역의 시작위치를 보관
SS(Stack Segment) : 스택으로 사용되는 메모리 영역의 시작위치를 보관
DS(Data Segment)  : 데이터가 저장되는 메모리 영역의 시작위치를 보관
ES(Extra Segment)  : 변수들을 위한 추가 메모리 영역의 시작위츠를 보관
FS :
GS :

명령어 포인터(EIP : Extended Instruction Pointer) : 실행항 다음 명령어의 주소를 포함
[출처] 1. 레지스터(Register)|작성자 파란바다



tip) 함수의 동작 원리
스택(stack)이라는 자료구조를 이용해 함수 호출이 가능하다는 것을 이야기 하고 싶을 뿐이다. 함수를 호출하게 되면 제어가 그 곳으로 넘어가야 하니까, 이전의 인스트럭션 포인터(EIP)레지스터를 어딘가에 저장시켜놨다가 나중에 다시 불러와야 할 것이다. 그런데 함수 여러개가 중첩되어 호출되었다면, 인스트럭션 포인터를 저장하는 자료구조는 가장 나중에 들어간 자료가 가장 먼저 나와야 올바르게 수행될 것이다. 즉, LIFO(Last-In, First-Out)여야 한다. 그렇다면 스택을 사용하여야 한다는 것은 두말할 필요도 없을 것이다.
개념이 비슷할 뿐 어셈블리어에서는 프로시져(Procedure)라고 한다.

tip) 레지스터 영역과 램영역
램과 레지스터 영역의 연산 속도의 차이는 수십~수백배의 차이가 발생한다.

* 화면에 보이기까지 과정
1 유니코드(utf-8)로 제작된 소스 : 우리가 신나게 개발하는 소스코드, *.as
2 컴파일(바이트코드로 변환) : 컴파일을 하면 바이트코드 형태인 swf파일로 변환한다.
3 .swf(반기계어)
4 인터프리터(JVM또는 AVM) : swf의 바이트 코드를 해석하기 위한 장치또는 플러그인/플레이어
5 실행결과



Posted by 버터백통
Tip And Tech2008. 5. 16. 16:53
* 인풋텍스트필드.restrict = "0.123" // "a-z" : 지정된 특정 문자만 입력가능

* stage.focus = 대상입력텍스트필드 //결과 커서입력(캐럿)이 해당 필드에서 깜빡인다

* focus : 객체를 포커싱하는 방법
  as2: Selection.setFocus(객체) --> as3 : stage.focus=객체(최소한 인터레티브오브젝트를 상속받은 객체여야 한다)

* 입력텍스트 이벤트 프로세스
텍스트필드를 선택한 상태에서 키보드를 누르면...
1 KeyboardEvent.KeyDown
2 TextEvent.TEXT_INPUT-> 텍스트 필드에 입력된 텍스트 표시
3 KeyboardEvent.KEY_UP

TextEvent.TEXT_INPUT은
1 기본적으로 해당 텍스트 필드에서 넘어온 값을 표시하는 함수를 갖는다.
2 커서를 텍스트 맨뒤로 이동시킨다.

* event.preventDefault : 이벤트실행(behavior)을 막는다...

* appendText -> txt.text += "내용"
메서드는 추가 할당(+=)을 text 속성(예: someTextField.text += moreText)에
하는 것보다 효율적입니다.

* 글자입력 코드를 아스키로 분석하여 변환
String.formCharCode(e.text.charCodeAt(0) + 3)
입력된 클자보다 3이후의 값을 가진 문자를 반환


* tabIndex : 순차적으로 번호를 부여하여 순차적으로 포커스를 바꾸어 준다.

* FocusEvent.FOCUS_IN / FocusEvent.FOCUS_OUT : 포커스에 반응하는 이벤트

* as3에서는 비밀번호 ( * )를 하기위한 메서드 : 텍스트필드.displayAsPassword = true;

* 텍스트필드 마키
-키메서드
 텍스트필드.scrollH += 5 : 내용이 가로로 이동한다.
 텍스트필드.maxScrollH : 입력된 내용에 따른 스크롤 최대값을 산출

* 텍스트 포맷 적용
 텍스트필드.setTextFormat(tf) : 지금현재 텍스트 필드의 특성을 텍스트 포맷(tf)으로 설정(한번만)
 텍스트필드.defaultTextFormat = tf : 앞으로 텍스트필드에 텍스트형태를 tf으로 계속 설정

Posted by 버터백통
Tip And Tech2008. 5. 16. 15:39

MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

-Object : 모든 클래스는 오브젝트를 상속받는다....(상속 : 부모의 기능을 모두 가지는 것)

-EventDispatcher : 듣고 말하기가 가능
  - addEventListener()
  - removeeventListener()
  - dispatchEvent()

-DisplayObject : 눈에 보이는 객체(사용자반응 없다 )
  :일반 속성(x , y, rotation ...)
  parent{Shape , Graphics , bitmap}

-interactiveObject : 텍스트필드 , 심플버튼 ,
  마우스 이벤트 , 키보드 이벤트 , 포커스이벤트

- DisplayObjectContainer: 디스플레이 오브젝트를 담을수 있는 클래스
  :Child , index(자식들의 z-order : 자동관리)
  :addChild , addChildAt , removeChild() , removeChildAt ,
  :getChildAt , getChildAt , numChildren , contains(포함여부)

  => sprite , Stage , Loager로 상속

- Sprite : 프레임이 없는 무비클립

- MovieClip : 일반적인 무비클립[Embed시에 최소2프레임이상 되어야 MovieClip클래스로 캐스팅가능]

Posted by 버터백통