오픈소스 게임 프레임웍 Flixel을 이용해서 간단한 코인 모으기
게임을 만들어 보면서 Flixel 프레임웍의 기능들을 알아볼 수
있는 예제입니다.
 
flixel.org 사이트에 있는 내용이며 처음 접하시는 분들의 이해를
돕기 위해 작성된 글입니다.

해당 예제에서는 플레이어(레드박스), 코인, 출구, 스코어 표시,
현재 상태, 타일맵 생성 그리고 게임의 승리 조건을 나타내는
소스들로 이루어져 있습니다.

실제 사용자가 작성해야할 코드는 크게 EZPPlatformer.as(메인
클래스) 와 PlayState.as(게임화면) 두개의 클래스로 이루어져 있습니다. 어렵지 않으니 차근차근 보시면 됩니다~~!
 

package
{
	import org.flixel.FlxGame
	[SWF(width="640", height="480", backgroundColor="#000000")]
	[Frame(factoryClass="Preloader")]

	public class EZPlatformer extends FlxGame
	{
		public function EZPlatformer()
		{
			super(320,240,PlayState,2);
			forceDebugger = true;
		}
	}
}
EZPlatformer.as
메인 클래스(EZPlatformer) 생성 합니다.
부모 클래스 생성자 인자값으로 가로 320 세로 240에
최초에 보여질 게임화면 PlayState를 참조시키고 화면을 2배 줌합니다.


package
{
	import org.flixel.*;

	public class PlayState extends FlxState
	{
		public var level:FlxTilemap;
		public var exit:FlxSprite;
		public var coins:FlxGroup;
		public var player:FlxSprite;
		public var score:FlxText;
		public var status:FlxText;
		
		override public function create():void
		{
			//배경색을 밝은 회색으로 설정 (0xAARRGGBB)
			FlxG.bgColor = 0xffaaaaaa;
PlayState.as
실제 보여질 게임화면을 구성 작성합니다.
앞으로 만들어질 모든 게임과 관련된 화면들은
FlxState 클래스를 상속해서 화면을 구성합니다.
우선 FlxG 클래스의 bgColor 클래스 속성을 이용해 배경 색을 변경합니다.


			//맵 디자인 (320x240 화면에 40x30 으로 채운다 )
			var data:Array = new Array(
			
				1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
				1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1,
				1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
				1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
				1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
				1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1,
				1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1,
				1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
				1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 );
			//레벨 데이터를 이용해 타일맵을 만듭니다. Create a new tilemap using our level data
			level = new FlxTilemap();
			level.loadMap(FlxTilemap.arrayToCSV(data,40),FlxTilemap.ImgAuto,0,0,FlxTilemap.AUTO);
			add(level);
타일 맵 구성하기
타일 맵을 만들기위해 data배열에 맵을 그려줄 데이터를 넣습니다(1과0으로 이루어진).
level 변수에 FlxTilemap클래스를 객체로 생성합니다.
level 객체의 loadMap 함수를 이용해 타일맵을 만듭니다.


			//출구를 만듭니다. 처음에는 숨겨져 있는 어두운 회색 상자
			exit = new FlxSprite(35*8+1,25*8);
			exit.makeGraphic(14,16,0xff3f3f3f);
			exit.exists = false;
			add(exit);
출구 만들기
FlxSprite클래스를 이용해 출구로 사용할 객체를 만듭니다.


			//수집할 동전을 만듭니다. 
			coins = new FlxGroup();
			//상단 왼쪽에 코인들
			createCoin(18,4);
			createCoin(12,4);
			createCoin(9,4);
			createCoin(8,11);
			createCoin(1,7);
			createCoin(3,4);
			createCoin(5,2);
			createCoin(15,11);
			createCoin(16,11);
			
			//하단 왼쪽에 코인들
			createCoin(3,16);
			createCoin(4,16);
			createCoin(1,23);
			createCoin(2,23);
			createCoin(3,23);
			createCoin(4,23);
			createCoin(5,23);
			createCoin(12,26);
			createCoin(13,26);
			createCoin(17,20);
			createCoin(18,20);
			
			//상단 오른쪽 코인들
			createCoin(21,4);
			createCoin(26,2);
			createCoin(29,2);
			createCoin(31,5);
			createCoin(34,5);
			createCoin(36,8);
			createCoin(33,11);
			createCoin(31,11);
			createCoin(29,11);
			createCoin(27,11);
			createCoin(25,11);
			createCoin(36,14);
			
			//하단 오른쪽 코인들
			createCoin(38,17);
			createCoin(33,17);
			createCoin(28,19);
			createCoin(25,20);
			createCoin(18,26);
			createCoin(22,26);
			createCoin(26,26);
			createCoin(30,26);

			add(coins);
코인 만들기
createCoin(x, y) 함수를 이용해 화면에 보여질 코인들을 생성합니다.


	
			//플레이어 만들기 (붉은상자)
			player = new FlxSprite(FlxG.width/2 - 5);
			player.makeGraphic(10,12,0xffaa1111);
			player.maxVelocity.x = 80;
			player.maxVelocity.y = 200;
			player.acceleration.y = 200;
			player.drag.x = player.maxVelocity.x*4;
			add(player);
플레이어 만들기(붉은상자)
FlxSprite클래스를 이용해 플레이어 객체를 생성합니다.
Player 속성값을 이용해 중력값과 가속도를 설정합니다.


			
			score = new FlxText(2,2,80);
			score.shadow = 0xff000000;
			score.text = "SCORE: "+(coins.countDead()*100);
			add(score);
스코어 보드 만들기
FlxText클래스를 이용해 스코어 보드 객체를 생성합니다.


			
			status = new FlxText(FlxG.width-160-2,2,160);
			status.shadow = 0xff000000;
			status.alignment = "right";
			switch(FlxG.score)
			{
				case 0: status.text = "Collect coins."; break;
				case 1: status.text = "Aww, you died!"; break;
			}
			add(status);
현재 상태창 만들기
FlxText클래스를 이용해 상태창 객체를 생성합니다.


		}
		
		//코인을 타일 좌표에 생성
		public function createCoin(X:uint,Y:uint):void
		{
			var coin:FlxSprite = new FlxSprite(X*8+3,Y*8+2);
			coin.makeGraphic(2,4,0xffffff00);
			coins.add(coin);
		}
코인 생성 메서드
FlxSpritet클래스를 이용해 화면에 코인객체를 생성해주는 메서드입니다.


		
		override public function update():void
		{
			//플레이어 움직임 컨트롤
			player.acceleration.x = 0;
			if(FlxG.keys.LEFT)
				player.acceleration.x = -player.maxVelocity.x*4;
			if(FlxG.keys.RIGHT)
				player.acceleration.x = player.maxVelocity.x*4;
			if(FlxG.keys.justPressed("SPACE") && player.isTouching(FlxObject.FLOOR))
				player.velocity.y = -player.maxVelocity.y/2;
	
			//모든 객체를 업데이트 한다.
			super.update();

			//플레이어가 코인과 오버랩 되는지 체크
			FlxG.overlap(coins,player,getCoin);
			
			//플레이어가 출구를 건들였는지 체크
			FlxG.overlap(exit,player,win);
			
			//마지막으로 플레이어가 맵에 다달았을때 충돌 체크
			FlxG.collide(level,player);
			
			//플레이어가 죽었는지 체크
			if(player.y > FlxG.height)
			{
				FlxG.score = 1; //sets status.text to "Aww, you died!"
				FlxG.resetState();
			}
		}
화면 업데이트 하기(update())
enterFrame에 의해 모든 상황을 체크하는 심장이라고 볼 수 있습니다.
플레이어와 코인, 출구, 타일 맵 충돌등을 그리고 죽었을 때의 상황을 계속 체크합니다.


		//플레이어가 코인을 건들였을 때
		public function getCoin(Coin:FlxSprite,Player:FlxSprite):void
		{
			Coin.kill();
			score.text = "SCORE: "+(coins.countDead()*100);
			if(coins.countLiving() == 0)
			{
				status.text = "Find the exit.";
				exit.exists = true;
			}
		}
getCoin()
플레이어가 코인에 충돌할 경우 코인을 삭제합니다.
스코어 보드에 점수를 추가 합니다.
코인의 갯수가 0이 되었을 경우 출구가 보이게 됩니다.


		//사용자가 출구에 도착 했을 때
		public function win(Exit:FlxSprite,Player:FlxSprite):void
		{
			status.text = "Yay, you won!";
			score.text = "SCORE: 5000";
			Player.kill();
		}
	}
}
게임을 클리어 했을 경우 (win())
현재 상태창을 변경합니다.
스코어보드에 점수값을 대입
플레이어를 죽입니다 ;ㅁ;


결과물 : http://flixel.org/EZPlatformer/
소스 : https://github.com/AdamAtomic/EZPlatformer/archives/master


게임을 만들기 위해서는 기술적으로 많은 기능들이 들어가는데 flixel 프레임웍을 이용한다면
게임에 필요한 기능들을 쉽고 간편하게 사용해서 단기간에 게임 개발이 가능합니다.
잘 활용한다면 좋은 프레임웍이 될 수 있을거 같네요.

현재도 플래시를 통해 안드로이드, 아이폰 모바일 플랫폼 개발이 가능합니다.
추후에 나올 모레힐 버전에서는 하드웨어 가속을 통해 좀더 원활한 개발이 가능할것이고
모바일 게임 개발에 이런 다양한 프레임웍들이 큰 도움이 되리라 생각됩니다.

flixel 사이트에는 튜토리얼, 예제, 도움말등 더 많은
자료가 정리되어 있습니다. 참고하세요~ 

flixel이 지원하는 기본적인 기능 
- 카메라
- 패스파인딩
- 리플레이
- 충돌
- 타일맵 생성 & 자동 생성
- 파티클 생성
- 저장

프레임웍 사이트 : http://flixel.org

A
ir 2.6 + Flixel 을 통해 만들어진 IOS 게임들
- http://www.youtube.com/watch?v=Rd-i4mGJcSo 
http://johnlindquist.com/2011/03/29/flixel-on-the-ipad/ 

앱스토어 올라가있는 Air 2.6 + Flixel 게임 어플
http://itunes.apple.com/us/app/pixel-city-skater/id436758864?mt=8&ls=1
http://www.youtube.com/watch?v=vtFPuBQTgoU

저작자 표시

'AS3 > ActionScript' 카테고리의 다른 글

flixel 게임 프레임웍을 이용한 미니게임 만들기  (8) 2011/05/19
osmf 샘플  (0) 2011/04/05
LocalConnection  (0) 2011/03/22
Actionscript 3 MySql Driver - assql  (0) 2011/03/14
as3.0 lib  (0) 2011/02/07
twitter API for ActionScrpit 3.0  (0) 2010/09/21

Trackback Address :: http://superman.pe.kr/trackback/116 관련글 쓰기

댓글을 달아 주세요

  1. BlogIcon xoul 2011/05/20 13:58 Address Modify/Delete Reply

    우와 말로만 듣던건데 이런거였군요 ^^

  2. BlogIcon 김빠따 2011/05/20 14:18 Address Modify/Delete Reply

    오오오오~오남~ 머시따~

  3. BlogIcon 지돌스타 2011/05/21 01:22 Address Modify/Delete Reply

    내용 정말 좋네요. 잘보고 갑니다.

  4. BlogIcon 동강 2011/05/21 12:27 Address Modify/Delete Reply

    잘 보고 갑니다. 이미 구현된게 사용하기 편하게 되어 있네요.

osmf 샘플

AS3/ActionScript 2011/04/05 11:26 |

Open Source Media Framework (OSMF) simplifies the development of media players by allowing developers to assemble components to create high-quality, full-featured video playback experiences.
This open framework enables development focused on web-based video monetization, with lower costs and faster turnaround.
It ‘s ActionScript3.0 based and was created by Adobe.
OSMF is designed for developers Adobe Flash / Flex / Air.

I created some examples to work with OSMF, including creating a simple video player, an advanced player, load external SWF files and external images, play audio and mp3 files.

SIMPLE VIDEO PLAYER

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.media.MediaPlayerSprite;
    import org.osmf.media.URLResource; 

    public class Main extends MovieClip
    {
        private const VIDEO_URL:String="http://flepstudio.org/utilita/VideoPlayer/IronMan2.mov";

        private var url_resource:URLResource;

        private var video_sprite:MediaPlayerSprite;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            this.video_sprite=new MediaPlayerSprite();
            url_resource=new URLResource(VIDEO_URL);
            this.video_sprite.resource=url_resource;

            this.addChild(video_sprite);
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

SIMPLE VIDEO PLAYER WITH PLAY BUTTON

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.media.MediaPlayerSprite;
    import org.osmf.media.URLResource;
    import org.osmf.events.PlayEvent;

    public class Main extends MovieClip
    {
        private const VIDEO_URL:String="http://flepstudio.org/utilita/VideoPlayer/IronMan2.mov";

        private var url_resource:URLResource;

        private var video_sprite:MediaPlayerSprite;

        private var play_button:PlayButton;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            createOSMFvideo();
            createPlayButton();
            addListeners();
        }

        private function createOSMFvideo():void
        {
            video_sprite=new MediaPlayerSprite();
            video_sprite.mediaPlayer.autoPlay=false;
            url_resource=new URLResource(VIDEO_URL);
            video_sprite.resource=url_resource;

            addChild(video_sprite);
        }

        private function createPlayButton():void
        {
            play_button=new PlayButton();
            play_button.x=stage.stageWidth/2-play_button.width/2;
            play_button.y=stage.stageHeight/2-play_button.height/2;
            addChild(play_button);
        }

        private function addListeners():void
        {
            play_button.mouseChildren=false;
            play_button.buttonMode=true;
            play_button.addEventListener(MouseEvent.CLICK, playVideo);

            video_sprite.mediaPlayer.addEventListener(PlayEvent.PLAY_STATE_CHANGE,checkState);
        }

        private function playVideo(evt:MouseEvent):void
        {
            video_sprite.mediaPlayer.play();
        }

        private function checkState(evt:PlayEvent):void
        {
            play_button.visible=!video_sprite.mediaPlayer.playing;
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

SIMPLE VIDEO ELEMENT

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.containers.MediaContainer;
    import org.osmf.elements.VideoElement;
    import org.osmf.events.*;
    import org.osmf.media.*;
    import org.osmf.net.*;

    public class Main extends Sprite
    {
        private const PROGRESSIVE:String="http://flepstudio.org/utilita/VideoPlayer/IronMan2.mov";
        private var url_resource:URLResource;
        private var media_container:MediaContainer;
        private var media_player:MediaPlayer;
        private var net_loader:NetLoader;
        private var video_element:VideoElement;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            createOSMFvideo();
        }

        private function createOSMFvideo():void
        {
            net_loader=new NetLoader();

            video_element=new VideoElement();

            url_resource=new URLResource(PROGRESSIVE);
            video_element.resource=url_resource;

            media_player=new MediaPlayer();
            media_player.bufferTime=5;
            media_player.addEventListener(BufferEvent.BUFFERING_CHANGE,onBufferUpdated);
            media_player.addEventListener(TimeEvent.CURRENT_TIME_CHANGE,onTimeUpdated);
            media_player.addEventListener(LoadEvent.BYTES_LOADED_CHANGE,onBytesUpdated);
            media_player.media=video_element;

            media_container=new MediaContainer();
            media_container.addMediaElement(video_element);

            addChild(media_container);
            swapChildren(media_container,info_mc);
        }

        private function onBufferUpdated(evt:BufferEvent):void
        {
            info_mc.buffering_txt.appendText('buffering: '+evt.target.buffering+'\n'+ 'buffer length: '+evt.target.bufferLength+'\n');
        }

        private function onTimeUpdated(evt:TimeEvent):void
        {
            info_mc.time_txt.text='\n'+'time: '+int(evt.target.currentTime)+'\n'+'duration: '+int(evt.target.duration)+'\n';
        }

        private function onBytesUpdated(evt:LoadEvent):void
        {
            info_mc.bytes_txt.text='\n'+'bytes loaded: '+evt.target.bytesLoaded+'\n'+'bytes total: '+evt.target.bytesTotal+'\n'+'percentage: '+Math.floor((evt.target.bytesLoaded/evt.target.bytesTotal)*100)+' %';
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

ADVANCED VIDEO ELEMENT

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.geom.*;
    import flash.events.*;

    import org.osmf.containers.MediaContainer;
    import org.osmf.elements.VideoElement;
    import org.osmf.events.*;
    import org.osmf.media.*;
    import org.osmf.net.*;

    public class Main extends Sprite
    {
        //private const PROGRESSIVE:String="http://www.flepstudio.org/utilita/VideoPlayer/IronMan2.mov";
        private const PROGRESSIVE:String="http://php:8888/IronMan2.mov";
        private var url_resource:URLResource;
        private var media_container:MediaContainer;
        private var media_player:MediaPlayer;
        private var net_loader:NetLoader;
        private var video_element:VideoElement;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            console_mc.pause_mc.gotoAndStop(1);
            console_mc.play_mc.gotoAndStop(1);
            console_mc.stop_mc.gotoAndStop(1);

            createOSMFvideo();
            addListeners();
        }

        private function createOSMFvideo():void
        {
            net_loader=new NetLoader();

            video_element=new VideoElement();

            url_resource=new URLResource(PROGRESSIVE);
            video_element.resource=url_resource;

            media_player=new MediaPlayer();
            media_player.bufferTime=5;
            media_player.autoPlay=true;
            media_player.addEventListener(BufferEvent.BUFFERING_CHANGE,onBufferUpdated);
            media_player.addEventListener(TimeEvent.CURRENT_TIME_CHANGE,onTimeUpdated);
            media_player.addEventListener(LoadEvent.BYTES_LOADED_CHANGE,onBytesUpdated);
            media_player.addEventListener(PlayEvent.PLAY_STATE_CHANGE,checkPlayState);
            media_player.media=video_element;

            media_container=new MediaContainer();
            media_container.addMediaElement(video_element);

            addChild(media_container);
            swapChildren(media_container,console_mc);
        }

        private function addListeners():void
        {
            console_mc.pause_mc.mouseChildren=false;
            console_mc.pause_mc.buttonMode=true;
            console_mc.pause_mc.addEventListener(MouseEvent.MOUSE_DOWN,onConsoleDown);

            console_mc.play_mc.mouseChildren=false;
            console_mc.play_mc.buttonMode=true;
            console_mc.play_mc.addEventListener(MouseEvent.MOUSE_DOWN,onConsoleDown);

            console_mc.stop_mc.mouseChildren=false;
            console_mc.stop_mc.buttonMode=true;
            console_mc.stop_mc.addEventListener(MouseEvent.MOUSE_DOWN,onConsoleDown);

            console_mc.volumebar_mc.knob_mc.x=console_mc.volumebar_mc.bar_mc.x+console_mc.volumebar_mc.bar_mc.width-console_mc.volumebar_mc.knob_mc.width+2;
            console_mc.volumebar_mc.knob_mc.mouseChildren=false;
            console_mc.volumebar_mc.knob_mc.buttonMode=true;
            console_mc.volumebar_mc.knob_mc.addEventListener(MouseEvent.MOUSE_DOWN,onKnobDown);
        }

        private function onConsoleDown(evt:MouseEvent):void
        {
            switch(evt.target.name)
            {
                case "pause_mc":
                    if(evt.target.currentFrame==1)
                    {
                        media_player.pause();
                        evt.target.gotoAndStop(2);
                    }
                    else
                    {
                        media_player.play();
                        evt.target.gotoAndStop(1);
                    }
                break;

                case "play_mc":
                    disablePlayButton();
                    enableStopButton();
                    media_player.play();
                break;

                case "stop_mc":
                    disableStopButton();
                    enablePlayButton();
                    console_mc.pause_mc.gotoAndStop(1);
                    media_player.stop();
                break;
            }
        }

        private function onKnobDown(evt:MouseEvent):void
        {
            var rect:Rectangle=new Rectangle(console_mc.volumebar_mc.bar_mc.x+console_mc.volumebar_mc.bar_mc.width-evt.target.width+2,
                                             evt.target.y,-console_mc.volumebar_mc.bar_mc.width+evt.target.width-4,0);
            evt.target.startDrag(false,rect);
            evt.target.addEventListener(Event.ENTER_FRAME,volumeControl);
        }

        private function volumeControl(evt:Event):void
        {
            var distance:Number=console_mc.volumebar_mc.bar_mc.width-evt.target.width;
            var p:Number=evt.target.x-console_mc.volumebar_mc.bar_mc.x;
            var percentage:Number=Math.ceil((p/distance)*100);
            media_player.volume=percentage/100;
        }

        private function checkPlayState(evt:PlayEvent):void
        {
            if(evt.target.playing)
            {
                enablePauseButton();
                disablePlayButton();
            }
            else
            {
                disablePauseButton();
                enablePlayButton();
            }
        }

        private function enablePauseButton():void
        {
            console_mc.pause_mc.gotoAndStop(1);
            console_mc.pause_mc.mouseEnabled=true;
        }

        private function disablePauseButton():void
        {
            console_mc.pause_mc.gotoAndStop(2);
            console_mc.pause_mc.mouseEnabled=false;
        }

        private function enablePlayButton():void
        {
            console_mc.play_mc.gotoAndStop(1);
            console_mc.play_mc.mouseEnabled=true;
        }

        private function disablePlayButton():void
        {
            console_mc.play_mc.gotoAndStop(2);
            console_mc.play_mc.mouseEnabled=false;
        }

        private function enableStopButton():void
        {
            console_mc.stop_mc.gotoAndStop(1);
            console_mc.stop_mc.mouseEnabled=true;
        }

        private function disableStopButton():void
        {
            console_mc.stop_mc.gotoAndStop(2);
            console_mc.stop_mc.mouseEnabled=false;
        }

        private function onBufferUpdated(evt:BufferEvent):void
        {
            //trace('buffering: '+evt.target.buffering+' buffer length: '+evt.target.bufferLength);
        }

        private function onTimeUpdated(evt:TimeEvent):void
        {
            //trace('time: '+int(evt.target.currentTime)+'\n'+'duration: '+int(evt.target.duration));
        }

        private function onBytesUpdated(evt:LoadEvent):void
        {
            //trace('buffering');
            //trace('bytes loaded: '+evt.target.bytesLoaded+'\n'+'bytes total: '+evt.target.bytesTotal+'\n'+'percentage: '+Math.floor((evt.target.bytesLoaded/evt.target.bytesTotal)*100)+' %');
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

AUDIO ELEMENT

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.containers.MediaContainer;
    import org.osmf.elements.AudioElement;
    import org.osmf.events.TimeEvent;
    import org.osmf.media.MediaPlayer;
    import org.osmf.media.URLResource;

    public class Main extends Sprite
    {
        private const TRACK_URL:String="http://www.flepstudio.org/music/dire_straits/13 - Sultans of Swing.mp3";

        private var url_resource:URLResource;

        private var media_player:MediaPlayer;

        private var audio_element:AudioElement;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            createOSMFaudio();
        }

        private function createOSMFaudio():void
        {
            media_player=new MediaPlayer();
            url_resource=new URLResource(TRACK_URL);
            audio_element=new AudioElement();
            audio_element.resource=url_resource;

            media_player.volume=.5;
            media_player.loop=true;
            media_player.addEventListener(TimeEvent.CURRENT_TIME_CHANGE,onTimeUpdated);
            media_player.addEventListener(TimeEvent.DURATION_CHANGE,onTimeUpdated);
            media_player.autoPlay=true;
            media_player.media=audio_element;
        }

        private function onTimeUpdated(evt:TimeEvent):void
        {
            info_txt.text='time: '+int(evt.target.currentTime)+'\n'+'duration: '+int(evt.target.duration);
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

SWF ELEMENT

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.elements.SWFElement;
    import org.osmf.media.MediaPlayerSprite;
    import org.osmf.media.URLResource;

    public class Main extends Sprite
    {
        private const SWF:String="http://mediapm.edgesuite.net/osmf/content/test/ten.swf";

        private var url_resource:URLResource;

        private var video_sprite:MediaPlayerSprite;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            stage.scaleMode=StageScaleMode.NO_SCALE;
            stage.align=StageAlign.TOP_LEFT;

            createOSMFvideo();
        }

        private function createOSMFvideo():void
        {
            video_sprite=new MediaPlayerSprite();
            var swf_element:SWFElement=new SWFElement();
            url_resource=new URLResource(SWF);
            swf_element.resource=url_resource;

            addChild(video_sprite);
            video_sprite.media=swf_element;
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

IMAGE ELEMENT

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.elements.ImageElement;
    import org.osmf.media.MediaPlayerSprite;
    import org.osmf.media.URLResource;

    public class Main extends Sprite
    {
        private const IMAGE:String="http://mediapm.edgesuite.net/strobe/content/test/train.jpg";

        private var url_resource:URLResource;

        private var video_sprite:MediaPlayerSprite;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            stage.scaleMode=StageScaleMode.NO_SCALE;
            stage.align=StageAlign.TOP_LEFT;

            createOSMFvideo();
        }

        private function createOSMFvideo():void
        {
            video_sprite=new MediaPlayerSprite();
            var image_element:ImageElement=new ImageElement();
            url_resource=new URLResource(IMAGE);
            image_element.resource=url_resource;

            addChild(video_sprite);
            video_sprite.media=image_element;
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

MULTI VIDEO SEQUENCE

package com.flepstudio
{
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;

    import org.osmf.elements.*;
    import org.osmf.media.MediaPlayerSprite;
    import org.osmf.media.URLResource;

    public class Main extends Sprite
    {
        private var videos_array:Array=new Array("video_1.flv",
                                                                                 "video_2.flv",
                                                                                 "video_3.flv");

        private const DELAY:Number=1;

        private var serial_ement:SerialElement;

        private var video_sprite:MediaPlayerSprite;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            addEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            stage.scaleMode=StageScaleMode.NO_SCALE;
            stage.align=StageAlign.TOP_LEFT;

            createOSMFvideo();
        }

        private function createOSMFvideo():void
        {
            video_sprite=new MediaPlayerSprite();
            video_sprite.width=stage.stageWidth;
            video_sprite.height=stage.stageHeight;
            serial_ement=new SerialElement();

            for(var i:int=0;i<videos_array.length;i++)
            {
                serial_ement.addChild(new VideoElement(new URLResource(videos_array[i])));
                serial_ement.addChild(new DurationElement(DELAY));
            }

            addChild(video_sprite);
            video_sprite.media=serial_ement;
        }

        private function destroy(evt:Event):void
        {
            removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
        }
    }
}

출처 : http://englishblog.flepstudio.org/tutorials/flash-cs3/mix/working-with-open-source-media-framework-osmf/ 
저작자 표시

'AS3 > ActionScript' 카테고리의 다른 글

flixel 게임 프레임웍을 이용한 미니게임 만들기  (8) 2011/05/19
osmf 샘플  (0) 2011/04/05
LocalConnection  (0) 2011/03/22
Actionscript 3 MySql Driver - assql  (0) 2011/03/14
as3.0 lib  (0) 2011/02/07
twitter API for ActionScrpit 3.0  (0) 2010/09/21

Trackback Address :: http://superman.pe.kr/trackback/103 관련글 쓰기

댓글을 달아 주세요

LocalConnection

AS3/ActionScript 2011/03/22 11:15 |
두 swf 간의 LocalConnection 클래스를 통해서 통신이 가능하다.
아래는 좋은예제 사이트

http://www.permadi.com/blog/2009/04/using-localconnection-for-swf-communications-in-actionscript-3/
저작자 표시

'AS3 > ActionScript' 카테고리의 다른 글

flixel 게임 프레임웍을 이용한 미니게임 만들기  (8) 2011/05/19
osmf 샘플  (0) 2011/04/05
LocalConnection  (0) 2011/03/22
Actionscript 3 MySql Driver - assql  (0) 2011/03/14
as3.0 lib  (0) 2011/02/07
twitter API for ActionScrpit 3.0  (0) 2010/09/21

Trackback Address :: http://superman.pe.kr/trackback/97 관련글 쓰기

댓글을 달아 주세요


assql 
http://code.google.com/p/assql/


머드초보님 
http://mudchobo.tistory.com/245



저작자 표시

'AS3 > ActionScript' 카테고리의 다른 글

osmf 샘플  (0) 2011/04/05
LocalConnection  (0) 2011/03/22
Actionscript 3 MySql Driver - assql  (0) 2011/03/14
as3.0 lib  (0) 2011/02/07
twitter API for ActionScrpit 3.0  (0) 2010/09/21
창 리사이즈시에 비율에 맞춰서 늘어나게 하기  (0) 2010/03/26

Trackback Address :: http://superman.pe.kr/trackback/95 관련글 쓰기

댓글을 달아 주세요

as3.0 lib

AS3/ActionScript 2011/02/07 11:01 |

3D 엔진

게임 개발
3D animation framework library
3D Physics Engine
アニメーショントゥイーン 라이브러리
그래픽
이미지 처리
2D 물리 엔진
2D 물리
보안
유닛 테스트
오디오 라이브러리
빠티쿠루시스테무
비동기 처리
선적 장비
객체 지향 프레임 워크
통신
이진
AIR
디버깅
기타

Resource : 
http://www.be-interactive.org/index.php?itemid=404 
http://ntt.cc/2008/04/09/over-30-useful-as3-open-source-projects.html


via http://namoowagom.cafe24.com/blog2/13

저작자 표시

Trackback Address :: http://superman.pe.kr/trackback/86 관련글 쓰기

댓글을 달아 주세요

작성중
저작자 표시

Trackback Address :: http://superman.pe.kr/trackback/72 관련글 쓰기

댓글을 달아 주세요

public function updateLayout(): void {	
	var ratio:Number = 0;				
	var wd = stage.stageWidth;	
	var ht = stage.stageHeight;				
	if (wd > ht) {		
		ratio = wd / 980		
		var nht = 550 * ratio		
		if (nht < ht) {			
			ratio = ht/550		
		}				
	} else {		
		ratio = ht / 550		
		var nwd = 980 * ratio		
		if (nwd < wd) {			
			ratio = wd / 980		
		}	
	}				
	if (ratio<1) {		
		ratio = 1;	
	}				
	resizeTarget.width = 980*ratio;	
	resizeTarget.height = 550*ratio;
}
저작자 표시

Trackback Address :: http://superman.pe.kr/trackback/52 관련글 쓰기

댓글을 달아 주세요



비트맵 드로울 이용한 사운드 스펙트럼입니다.

사운드 스펙트럼 부분은 자수님 올려주신 내용을 참고했습니다.

BGM 출처 : http://www.freebgm.net/v3/?mid=freebgm&category=33321&document_srl=107600

저작자 표시 비영리

Trackback Address :: http://superman.pe.kr/trackback/49 관련글 쓰기

댓글을 달아 주세요

  1. BlogIcon 수달공주 2010/04/12 16:54 Address Modify/Delete Reply

    잘보고가요오~ㅋㅋ

//rgb값들

public var r:Number = 0; 
public var g:Number = 127; 
public var b:Number = 255;

//rgb인터벌값들 
public var ri:Number = 0.025; 
public var gi:Number = 0.025; 
public var bi:Number = 0.025;

//rgb변환양 값 
public var rm:Number = 58+41; 
public var gm:Number = 58+41; 
public var bm:Number = 58+41;

//256 - rgb변환양 값(static값) 
public var ra:Number = 197-41; 
public var ga:Number = 197-41; 
public var ba:Number = 197-41;

color = Math.sin(r += ri) * rm + ra << 16 | Math.sin(g += gi) * gm + ga << 8 | Math.sin(b += bi) * bm + ba

여기서 이부분!!!

r << 16 | g << 8 | b

a<<b

a를 비트b만큼 왼쪽으로 이동 <<16은 16진수로 볼때 왼쪽으로 4칸 이동하고 이동한 부분에 0이 채워지죠

a|b

비트 or연산인데요 두개의 비트열이 0이 아니면 1로 떨어집니다

결국 a랑 b랑 자리수가 틀리면 + 가 되겠지요

 

[출처] 칼라 트랜지션 (플래시(Flash)로 생계를 이어가는 사람들의 모임:플생사모) |작성자 장원희

Trackback Address :: http://superman.pe.kr/trackback/33 관련글 쓰기

댓글을 달아 주세요

이 포스트를 보낸곳 ()


Flash Player 10.1


이번 LA에서 진행중인 MAX에서 가장 많은 관심을 끄게 될 녀석인거 같습니다.

특히 이번 플레이어 버젼은 모바일 디바이스에서도 웹에서와 동일한 PAI들을 사용가능하도록 지원되는것이

눈여겨 볼 사항이겠지요. 물론, APP들이 해당 디바이스에서 잘 돌아갈지 안돌아갈지는 퍼포먼스 향상에 대해서

항상 고려를 깔고 가야겠지요.

자, 먼저 다음의 링크를 통해 플래시 플레이어 10.1 에 대한 개념을 좀 쌓아보도록 합시다.

http://labs.adobe.com/technologies/flashplayer10/

 

http://labs.adobe.com/technologies/flashplayer10/features.html

 

http://labs.adobe.com/technologies/flashplayer10/videos/

 

http://www.adobe.com/devnet/logged_in/jchurch_flashplayer10.1.html

 

우선, 큰 주요 특징을 크게 크게 정리하면

- 모바일에서의 full 플래시 플레이어 기능 제공(웹과 동일한)- 물론, 디바이스에서 퍼포먼스를 낼수 있는 한계안에서겠지요

이에 따라, 디바이스 자원을 효율적으로 사용하기 위한 부분들이 많이 추가와 개선이 된다고 합니다.

  CPU사용과 배터리, 메모리 관리의 향상,시동 시간의 단축, GPU사용으로 인한 그래픽 요소들의 성능 향상,멀티 터치 지원 등

 

- 미디어 의 전송과 배포 (http 스트리밍 이라든지, rtmfp 프로토콜을 통한 p2p미디어 전송, flash access2.0을 통한 DRM기능)

 

- 향상된 비디오 스크리밍 재생(이건 매번 항상 나오네요. ㅋ )

  이부분에 대해서는 추후에 다시 FMS와 연계하여 포스팅 하겠음.

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

뭐, 여러가지 기능들이 더 많이 있겠지만, 플래시 플레이어 10.1 의 기본적인 특징은 다시 포스팅 하기로 하고, 이번 발표와 더불어서 모바일에서의 플래시 플랫폼에 대하여 이야기 해보고자 합니다. 먼저, 올해 말과 내년 으로 예상되는 플래시 플레이어 10.1 과 모바일 탑재에 관한 방향에 관해 나열해보도록 하겠습니다.

 

- 플래시 플레이어 10.1 개발자용  공식 베타는 올해 말에 배포

  (Windows Mobile, Palm webOS  Windows, Macintosh,Linux 용- 2010년 초에 정식 배포 )

 

- Window Mobile,Palm web OS,구글 안드로이드,Symbian 등의 OS에서 구동가능.

  (2010년 중반부터 실제로 탑재된 모습을 볼 수 있을 듯)

 

- BlackBerry 스마트폰에서도 플래시 플레이어 10.1 지원 예정

 

- 모토로라, 내년 초 플래시 플레이어10.1을 장착한 안드로이드 기반의 제품 생산

 

- 노키아, 향후 생산되는 (2010년까지)모든 기종에 플래시 플레이어 10.1 지원

 

- Flash Professional CS5 출시(올해 말에 베타 배포)되면 swf를 iPhone(i-pod touch)용 컨텐츠로 변환 가능(as 3.0면 가능)

 

- 퀄퀌(Qualcomm) 모바일 디바이스용 칩셋에 플래시 플레이어 10.1 탑재 예정

   (도시바와 퀄퀌의 스냅드래곤 칩섹을 사용하는 디바이스)

 

- ARM 아키텍쳐 칩셋에서 플래시 플레이어 지원 : 어도비에서 OEM방식으로 공급하여 제공, 2009년 말 또는 2010년초 출시 예정

 

- 2010년안에 Mobile Flex Framework (코드명 Slider) 발표- (400mhz 이상 128mb 메모리 이상에서 구현되는..)

 

자, 이런 형태로 로드맵들이 움직여준다면 내년 하반기와 내후년(2011년)사이에는 많은 스마트폰을 비롯한 디바이스에서

현재 최신 버젼의 액션스크립트 3.0을 적용할 수 있게 되겠지요. 물론, 디바이스에서 지원하는 환경에 따라 그 기대치가 달라

지 겠지요. 여하튼, 위 내용에서 보듯이 스마트폰 뿐 아니라, 어도비가 퀄퀌과 ARM 측과 협력을 맺어서 출시되는 칩셋은 전세계적으로 가장 많은 모바일 디바이스(넷북,셋탑박스,MID,디지털TV 등) 제품군에서 플래시 플레이어가 기본적으로 칩셋에 들어간다고 볼 수 있습니다.

 

물론, 국내는 삼성과 lg에서 발빠르게 움직여줘야 하겠지만, 삼성. lg의 경우도 Open Screen Project에 참가하는 것으로

알 고 있으니, 그냥 모르쇠로 일관하지는 않을 것입니다. 또한, 모바일과 관련하여 특화된 기능들의 추가가 되었는데, 아무래도 아무리 데스트탑에서 사용되는 API들을 사용한다하더라도 디바이스환경의 퍼포먼스가 떨어지면 무용지물이겠지요. 그래서 어도비에서는 CPU사용량이라든지, 메모리 관리, 배터리 관리에 대하여 추가적인 기능들을 추가하였습니다.

 

모바일과 관련한 추가된 기능들에 대해서는 다음과 같습니다.

 

http://labs.adobe.com/technologies/flashplayer10/features.html

 

- GPU사용으로 인한 하드웨어 가속(H.264 비디오 라든지, 벡터,3d 효과,이미지들의 처리)

: 이건 gpu 사용이 가능한 디바이스에 해당이 되겠지요. 비디오와 그래픽적인 요소에서 gpu 를 사용함으로써

  메인 cpu에 대한 부하를 줄여주는 효과를 볼 수 잇음

 

- 디바이스의 버츄얼 키패드 지원(with 텍스트필드)

:  대부분의 적용되는 디바이스는 터치로 구동되는 환경을 두고 바라볼 수 있는데, 텍스트 필드에 포커스가 오면

   디바이스의 버츄얼 키보드가 자동으로 열리고 포커스를 잃으면 사라지고 등의 디바이스에서 제공되는

  버츄얼 키보드와 바로 연결하여 텍스트 필드를 사용할 수 있다.

 

- 멀티 터치 및 제스쳐 지원

: 아이폰등에서 이미 구현중인 기능인데..멀티 터치 및 제스쳐를 통한 화면이동,회전,확대, 축소

 

- 디바이스의 x,y,z,좌표에 따른 가속도계(Accelerometer) 지원

: 이것으로 재미난 게임들의 개발이 많이 이루어질듯, 물론, 현재 다른 스마트폰용 게임에서 많이 볼 수 있지요.

  이것을 이용하면 현재 디바이스가 뒤집어져있는지, 옆으로 돌려져잇는지, 우측으로 기울었는지..등을 감지할수 있겠네요.

감지를 하는 업데이트 비율을 조절함으로 배터리 절약을 고려하여 개발할 수도 있답니다.

 

- 화면 회전

: 말그대로 화면의 portrait 와 landscape 모드의 전환 가능.

 

- swf로드 관리

:여러개의 플래시 컨텐츠를 가동하는 페이지 또는 여러개의 페이지에서 플래시를 사용하면, 동시적으로 플래시 컨텐츠의 구동

으로 인하여 cpu의 갑작스런 증가와 더불어 버벅이게 되는 현상을 방지하기 위하여 SWF로드시 cpu와 메모리의 제약에 따른

재 생을 최적하합니다. swf우선권과 화면상에 visibility,이용가능한 cpu및 메모리의 자원에 따라서 로드되거나 잠시 재생 및 로드가 보류됨을 가지게 됩니다. swf우선권은 새로운 html파라미터인 hasPriority를 통해 swf의 우선권을 줄 수 있고, 보류된 인스턴스는 html페이지가 완전히 로드가 끝난 후에 로드됩니다. 화면밖이나 위의 페이지에 가려서 눈에 보이지 않는 인스턴스는 swf재생이 중지되고(pause), 화면상에 나타날때 시작합니다. 예를들어, 전화가 오거나 알람이 울리면 swf의 재생이 중지되어,

cpu사용,메모리사용,밧데리 사용을 절약하게되는 효과를 가질 수 있다.

(흠..여기서 인스턴스가 swf내의 오브젝트 인스턴스인지 swf 자체를 말하는것인지는..애매모호하네여)

 

- 슬립모드

: 이것도 전원관리와도 관련이 있겠는데, 디바이스가 화면보호화면이나 그와 비슷한류의 모드로 들어가면(즉,슬립모드로 들어가면) 오디오나 비디오 재생을 제외하곤, 재생의 속도를 남추거나 중지(전화올때)합니다.

 

- 프레임레이트의 디바이스 환경의 적응성

: 플래시 플레이어는 렌더링 함에 있어서 효율적인 cpu 및 자원 사용을 위해서 swf의 프레임레이트를 낮추고 모니터링 합니다.

플레이어의 프레임 레이트가 어느 시점이하까지 떨어지게 되면 플레이어는 정의된 디폴트 프레임 레이트에 도달하기 위해

프레임을 조절합니다.

 

대 체적으로 모바일이라는 특성에 맞춘 기능과  자원활용에 대한 퍼포먼스 관련 이슈들이 많은 거 같습니다. 데스크탑과 동일한 스크립트 환경을 제공한다해도 아무래도 모바일은 아직 모바일이기때문에 그런 자원의 제한적을 얼마나 효율적으로 관리를 하고 사용하느냐에 대하여 많은 고민을 하여 녹여넣은 것 같네요. 빨리 나와봐야 정확히 감이 오겠네요. 아직은... 기사와 포스팅된 글들에 의존하다보니, 그렇다고 max를 갔다온 것두 아니고 –_-; 답답하지요 .. ^^: 우야꼬는 좋겠네..max가서..부럽~~ ^^:

 


[출처] 앞으로 나올 Flash Player 10.1 와 향후 모바일 플래시 플랫폼|작성자 clia

Trackback Address :: http://superman.pe.kr/trackback/31 관련글 쓰기

댓글을 달아 주세요