jasu's blog
블로그 메뉴글
[AS3] 3대(APE, Revive, Fisix) Physics Engine 정리
3대 Physics Engine 정리
타이틀 |
|||
제작 |
MIT(Alec Cove) |
Andre michelle |
Fisix 회사 |
라이센스 |
LGPL |
Free |
Free(제한적) |
규모 |
소 |
중 |
대 |
API 문서 |
다운로드 한 소스로부터 |
||
특징 |
Simple |
고속, 정확 |
다기능 |
표현 범위 |
정방형 파티클 등 |
베이지어곡석 표면 처리 등 |
로프, 프렉탈, 지형
등 |
테스트 예 |
APE
먼저 처음 접했던 것은 APE 물리엔진이었다. 이것은 AS2 버전으로 이미 알려졌던 Flade 엔진을 AS3로 고치면서 새롭게 APE라는 이름으로 나오게 되었다. 위 3개의 엔진 중에 가장 심플한 클래스 구조를 가지고 있다. 19개의 클래스 중에 public 클래스는 불과 12개 밖에 되지 않기 때문에 소스를 분석하는데도 그리 어렵지 않을 것 같다.
Revive
Revive는 두 번째로 접하게 된 물리 엔진이다. 2005, 2006 MAX conference에도 스피커로 참여했던 Andre michelle이 만든 엔진이다. Revive의 경우는 베이지어 곡선 처리가 가능하여 surface 표현할 때 곡선처리가 가능하다. 물리엔진의 계산 표현이 비교적 정교하여 움직임이 매끄럽고 속도가 빠르다. 마우스 이벤트에 대해 기본적으로 제공하고 있기 때문에 약간의 확장을 통해서 마우스를 통한 인터렉션이 자유롭다.
클래스 구조
* de/
o popforge/
+
revive/
# application/ - 어플리케이션
* SceneContainer.as
– 뷰어
* Simulation.as - 물리
엔진
# display/ - 표시
* ExtDrawAPI.as – Graphics을 사용하고 호를 그리는
확장
* IDrawAble.as – 표시오브젝트
관련 Interface
# forces/ - 힘
* FixedSpring.as - 고정
용수철
* IForce.as - 힘을
가지는 오브젝트를 위한 Interface
* Spring.as - 용수철
# geom/ - 지오메트리
* BezierCubic.as – 3 베이지어곡선
* BezierQuadric.as - 4 베이지어곡선
* BoundingBox.as - 바운딘
* ICurve.as - 곡선을
위한 Interface
* Vector.as - 2 차원
벡터
# member/ - 물체
* Immovable.as - 움직이지
않는 물체의 base class
*
ImmovableBezierQuadric.as - 움직이지 않는 4 베이지어곡선
*
ImmovableCircleInner.as - 움직이지 않는 원
*
ImmovableCircleInnerSegment.as - 움직이지 않는 호
*
ImmovableCircleOuter.as - 움직이지 않는 원
*
ImmovableCircleOuterSegment.as - 움직이지 않는 호
* ImmovableGate.as
* ImmovableGroup.as
- 움직이지 않는 그룹
* ImmovablePoint.as
- 움직이지 않는 점
* Movable.as - 움직이는
물체의 base class
* MovableCircle.as - 움직이는
원
*
MovableParticle.as - 움직이는 점
* MovableSegment.as
- 움직이는 선
# resolve/
*
DynamicIntersection.as - 동적 접점
* IDynamicIntersectionTestAble.as
- 동적인 접점을 테스트하는Interface
* IResolvable.as
+ surface/ - 인터페이스
# display/ - 표시
*
DefaultTextFormat.as - 이 라이브러리의 디폴트 텍스트 포맷
* FPSCounter.as -
FPS 카운터
# io/ - IO
* PopKey.as – 키
코드 상태를 관리
* PopMouse.as - mouse button의 상태를 관리
# valuation/ -
* Potentiometer.as –
미터
Fisix
Fisix 엔진은 0.5 alpha버전으로 공개되어 있으나 위의 APE, Revive 보다 많은 기능을 포함하고 있다. 소스를 다운로드 하면 API문서, 라이브러리, 샘플 6개와 나머지 라이선스와 관련된 텍스트 파일을 볼 수 있다. Public 클래스는 47개 정도 되어 꽤 많은 기능을 제공하고 있다. as파일은 없으며 swc 파일만을 배포하고 있는 듯 하다.
* Example1 … 타이머, 엔진 표현, 직선 표면 1 개, 차
바퀴
* Example2 … ENTER_FRAME , 엔진 표현, 차 바퀴
*
Example3 … ENTER_FRAME , 엔진 표현, 용수철, 마우스 interaction
*
Example4 … 숫자 키1 ~4 ,5 ~6 모드 변환,
파티클의 자동 삭제
*
Example5 … 로프, SWF 부품(타이어)
*
Example6 … 유모차
글
연말에 등장하는 FlashPlayer9 update3에서 실현되는 기능 향상이란?
2006년 6월에 발표된 flashPlayer9는 flash CS3 시대를 예감 시키는 중요한 내용을 포함하고 있었다. FlashPlayer9는 올 연말에도 대폭적인 업데이트를 예정하고 있다고 한다. Flash나 ActionScript의 향후를 예측하는데 있어서 중요한 FlashPlayer9 update3의 개요에 대해서 Adobe Systems사 FlashPlayer담당 그룹 프로덕트 메니저 Emmy Huang의 이야기다.
Update3은 주로 퍼포먼스 향상에 주력하고 있어 다양한 신기능의 추가나 기능 강화를 도모하고 있다고 한다. 또 이번은 크로스 플랫폼에서 제공하는 것을 중시하고 있고 처음으로 Windows/Macintosh/Linux판을 동시에 출시 한다고 한다.
추가되는 새로운 기능으로서는 크게 나누어 4개가 있는데, 우선 첫 번째로 거론되는 것이 하드웨어의 가속화에 의한 풀 스크린 모드이다.(예전에 포스트로 올려 놓은 것이 있는데 동영상을 위해서 기초적인 기능만을 첨부한 swc파일 컴포넌트로 복사해야 한다) update3은 하드웨어 스켈링을 하기 위한 랜더링 속도를 향상하여 고해상도인 브라우저상에서 재생하고 있는 동영상을 부드럽게 재생할 수 있는 것이 특징이라고 한다. 물론 종래의 버전에서도 풀 스크린을 서포트하고 있고 고해상도의 동영상을 재생할 수 있었지만 컴퓨터의 처리 능력이 높지 않으면 재생이 어려웠던 것이 사실이다. 그러나 update3에서는 보다 많은 머신으로 고해상도의 동영상을 풀스크린으로 재생 할 수 있다. 『웹 브라우저로 이만큼의 HD 퀄리티의 영상을 제공할 수 있는 것은 adobe에 있어서도 매우 익사이팅한 일입니다』 라고 FlashPlayer 그룹 프로덕트 매니저의 Emmy Huang의 이야기다.
리치 인터넷 어플리케이션 관련 기능 강화
이 밖에도 리치 인터넷 어플리케이션 관련해서도 기능 강화가 있다고 한다. Adobe 플랫폼 컴포넌트에 추가된 새로운 플레이어의 캐시는 플랫폼 라이브러리를 포함하는 장소에서 정확히 브라우저 캐시와 같이 한 번 다운로드를 해 저장하면 두 번째에서는 곧바로 사용할 수 있게 된다고 한다. 이 기능을 우선 최초로 활용하는 것은 Flex 체제라고 한다. 약 500KB 정도의 Flex 파일을 캐시 시키는 것으로 swf파일의 사이즈를 작게 하는 것과 동시에 start up 시간을 단축할 수 있다고 한다. 현재 adobe labs에서 베타판을 다운로드하여 이 기능을 사용해 볼 수 있다. 미래지향적으로 라이브러리를 추가해 나가기 때문에 캐시를 사용해 다양한 작업을 시도할 수 있을 것이라고 이야기한다.
또 Flash와 브라우저와의 통신에 사용하는 API가 있지만 이 커뮤니케이션도 개선되고 있다고 한다. 즉 브라우저의 컴퍼넌트와 FlashPlayer의 통합, 인터그레이션이 보다 좋아지고 있다고 한다.
그 외의 추가 기능은 아래와 같다.
Internet Exploler(IE)에 보안 관련 API가 서포트 되고 있었지만 Windows 플러그인 외에 FireFox에도 서포트 된다는 설명이다.
Flash Media Server(FMS)에 전달되는 컨텐츠의 보호를 할 수 있도록 RTMP 프로토콜로 암호화가 서포트 된다고 한다.
글
[AS3] 무게 중심축과 질량
글
[AS3] Array의 index값이 소수이면 index가 아니다?
위와 같이 obj에 추가한 value 변수의 값을 동적으로 할당할 수 있다. ActionScript에서는 이러한 동적인 프로퍼티의 할당은 해시 맵(연상배열 or 결합배열)으로 되어 있어 [] 연산자로 액세스가 가능하다.
이와 같이 Array도 dynamic class이므로 동적으로 프로퍼티를 할당할 수 있다.
배열의 index를 문자열이 아닌 음수나 소수로 할 경우에는 정수로 치환되지 않고 문자열인 결합배열로 취급한다.
배경에는 length를 통해서 배열 원소의 개수를 취득할 수 있는데 이때 결합배열(문자열 키로 참조)로 되어 있는 것은 length에 포함되지 않는다.
아래와 같이 동적으로 배열의 인덱스 값을 계산하여 사용할 경우에는 int형으로 치환해 주는 것에 주의해야 한다.
글
[AS3] 1행짜리 Tetris
게임방법 : [H][L]왼쪽과 오른쪽, [J][K] 회전, [SPACE]는 떨어뜨리기.
게임 화면을 클릭해서 키보드 포커스를 줄 필요가 있다.
* import *를 사용함.
* 정수명이나 이벤트명은 직접적으로 쓰면 import를 생략.
* for문이나 if 의 생략 할 수 있다 {}은 생략.
* const 보다 var를 씀.
* with 사용할 수 있는 곳은 사용.
* true , false 보다 1 ,0
* switch ~case 보다 함수 테이블을 사용.
* new Array() 보다 []
* drawRect()의 endFill()를 생략.
* 인스턴스 변수를 1 행으로 전부 선언하면 var 를 줄일 수 있다.
* 로컬 변수 를 인스턴스 변수로 옮기면 var를 삭제할 수 있다.
* 클래스명과 constructor 이외의 public ,private는 삭제.
* 배열 의 첨자에 사용한 int 형 변수 이외의 「: 형명」은 삭제.
* 변수 이름이나 함수 이름을 1 문자로.
* 개행은 모두 삭제, 연속하는 공백은 하나의 공백으로.
* 연산자 ,{ ,} ,( ,) ,; , 의 전후의 공백은 삭제.
* 「} 」의 직전의 「; 」는 삭제.
예전 DOS시절에 C언어로 헥사와 테스트리스를 접목한 게임을 만든 적이 있었는데 그때 만들었던 게임의 룰은 테트리스 처럼 가로 행이 채워졌을 때도 삭제하고 대각선과 세로에서도 같은 색이 연속으로 5개 있을 때도 삭제하게 했던 기억이 난다. 도스 시절이었기 때문에 아마도 5.25인치 디스크에 보관을 하다가 잃어버린 것 같다.
Assembly 언어는 대학교 다닐 때 가장 골치 아픈 녀석이었다. 직접 기계어로 작성한다는 매력과 그 속도 면에서 반할만한 언어이기는 했지만 그것을 이해하기에는 나의 두뇌가 너무 아날로그적이었던 기억이다. C언어를 배울 당시에도 point(*) 개념으로 point -> point 까지만 들어가도 그때부터 뇌세포가 사경을 헤맸으니…
그러고 보면 ActionScript는 참 친절한 언어라는 생각이 든다… 나 또한 ActionScript를 향해 좀더 친절해 져야겠다는 생각이 든다.. 쿠쿠
Tetris.as 소스
package{import flash.display.*;import flash.text.*;public class Tetris extends Sprite{var W=10,H=20,T=16,C=[0x000000,0x00FFFF,0xFFFF00,0x22FF22,0xFF2222,0x4444FF,0xFF8844,0xFF22FF],P=[[[1,1,1,1]],[[0,2,0],[2,2,2]],[[3,3,0],[0,3,3]],[[0,4,4],[4,4,0]],[[5,5],[5,0],[5,0]],[[6,6],[0,6],[0,6]],[[7,7],[7,7]]],s=[30,20,10,5],b=[],p,r,t=new TextField(),f=[],l=0,c=0,g,j:int,i:int,v:int,u:int;public function Tetris(){t.x=W*T;t.autoSize="left";t.text="Next:";addChild(t);for(j=0;j<H;++j){b[j]=[];for(i=0;i<W;++i)b[j][i]=0}f[72]=function(){v-=w(v-1,u,p)};f[74]=function(){m(1)};f[75]=function(){m(0)};f[76]=function(){v+=w(v+1,u,p)};f[32]=function(){d();h()};stage.addEventListener("keyDown",function(e){if(f[e.keyCode]){f[e.keyCode]();n()}});h();h();addEventListener("enterFrame",function(e){if(--c<0){c=s[int(l/10)];if(w(v,u+1,p)){++u;n()}else{d();h()}}})}function m(o){var q=new Array(p[0].length);for(j=0;j<q.length;++j)q[j]=[];for(j=0;j<p.length;++j)for(i=0;i<q.length;++i)if(o)q[i][p.length-1-j]=p[j][i];else q[q.length-1-i][j]=p[j][i];if(w(v,u,q))p=q}function n(){with(graphics){clear();for(j=0;j<H;++j)for(i=0;i<W;++i){g=0;if(u<=j&&j<(u+p.length)&&v<=i&&i<(v+p[0].length))g=p[j-u][i-v];if(!g)g=b[j][i];beginFill(C[g]);drawRect(i*T,j*T,T,T)}for(j=0;j<r.length;++j)for(i=0;i<r[j].length;++i){beginFill(C[r[j][i]]);drawRect((i+W+1)*T,(j+2)*T,T,T)}}}function w(x:int,y:int,p){for(j=0;j<p.length;++j){if(0>(y+j)||(y+j)>=H)return 0;for(i=0;i<p[j].length;++i){if(0>(x+i)||(x+i)>=W)return 0;if(p[j][i]&&b[y+j][x+i])return 0}}return 1}function d(){for(;w(v,u+1,p);u++);for(j=0;j<p.length;++j)for(i=0;i<p[j].length;++i)if(p[j][i])b[u+j][v+i]=p[j][i];for(j=0;j<H;++j)if(b[j].indexOf(0)<0){b.splice(j,1);b.unshift([]);for(i=0;i<W;++i)b[0][i]=0}l++;if(l/10>=s.length)l=0}function h(){p=r;if(p){v=(W-p[0].length)/2;u=0;if(!w(v,u,p))t.text="GAME OVER"}r=P[int(Math.random()*P.length)]}}}
*위 소스를 Tetris.as 파일로 생성하여 Flash CS3에서 Document class에 등록하고 퍼블리시 하면 된다.