안드로이드 개발의 특징
- 풍부한 API로 구성된 애플리케이션 프레임 워크
- 달빅 가상머신(애플리케이션을 안드로이드에서 실행하는 책임을 담당)
- 2D/3D 그래픽 라이브러리
- Ogg, Vorbis, MP3, MPEG-4 등 자주 사용하는 오디오, 동영상, 이미지 형식에 대한 미디어 지원, 특수 효과음 재생 API
- 카메라,GPS,나침반, 가속도계, 터치 화면, 트랙볼, 키보드 등 주변기기에 접근할 수 있는 API
달빅은 DEX 바이트코드 형식으로 프로그램을 실행한다. 일반 자바 .class파일은 sdk에서 제공하는 dx라는 특수 툴을 사용해 DEX형식으로 변형한다. DEX형식은 자바.class파일보다 더 적은 메모리를 남기기 위해 고안됨
개별 달빅 VM인스턴스에서 실행되는 각각의 애플리케이션은 16MB에서 24MB의 힙 메모리를 사용할 수 있다. 이미지와 오디오 리소스 제어할 때 파악해야 한다.
스키아(Skia) 그래픽 라이브러리 : 2D 그래픽을 위한 SW렌더러로 애플리케이션 UI를 렌더링하는데 사용된다.
오픈GL ES : HW 가속 그래픽 렌더링의 산업표준 셰이더 기능을 추가한 오픈GL ES 2.0은 안드로이드2.2부터 지원한다.
오프 코어 : 오디오와 비디오 재생 및 기록을 위한 미디어 라이브러리 Ogg Vorbis, MP3, H.264, MPEG-4
프리타입 : 비트맵과 벡터 폰트, 트루타입 형식을 로드하는 라이브러리
cf) 달빅의 성을을 벗어난 물리 시뮬레이션이나 3D연산시 네이티브 코드를 작성해야 한다. http://code.google.com/p/libgdx 및 블라디미르 실바가 저술한 Pro Android Games을 참고하자
애플리케이션 프레임워크 : 시스템 라이브러리 및 런타임과 연계해 안드로이드의 사용자 측면을 구성한다.
애플리케이션에서 카메라를 사용할 경우 시스템으로 쿼리를 보내 이런 서비스를 제공하는 다른 애플리케이션을 컴포넌트에 요청한다. 따라서 게임 개발자는 애플리케이션의 아키텍처와 생명주기도 잘 알고 있어야 한다.
안드로이드 환경 설정
JDK http://blog.naver.com/kimwg0120?Redirect=Log&logNo=140183686
ANDRIOD http://www.cyworld.com/schasert/8535313
AndroidManifest.xml : 애플리케이션에 대한 정보 제공
default.properties : 빌드 시스템에 대한 다양한 설정 포함
/src : 모든 자바 소스가 들어가며, 패키지명이 안드로이드 프로젝트 마법사에서 지정한 이름과 동일하다
/gen : 안드로이드 빌드 시스템에서 생성한 자바 소스 파일들이 들어간다
assets/ : 애플리케이션에서 원하는 파일이 저장되며, 패키징시 자동으로 함께 패키징 된다.
res/ : 애플리케이션에서 필요로 하는 파일들 아이콘, 국제화에 사용할 문자열 UI 레이아웃을 정의한 XML 등의 자원이 들어간다.
모든 Activity는 항상 추상 메서드인 Activity.onCreate()를 구현해야 한다. 이 메서드는 액티비티가 처음 시작할 때 안드로이드 시스템에서 한 번 호출하며 생성자와 비슷한 역할을 하며, 첫 번째 실행 함수는 onCreate()이다.
안드로이드 애플리케이션을 디버깅 하기 위해선 AndroidManifest.xml에서 application에 android:debuggable="true" 를 추가한다. 그러면 브레이킹 포인트 등 디버깅이 된다. 하지만 마켓 배포시 해제해야 한다.
디버깅 명령은 현재 명령문 실행 F6, 호출한 매서드로 단계 진입 F5, 프로그램 정상실행 F8이 가능하다.
로그캣뷰 : 시스템 컴포넌트와 애플리케이션이 다양한 로깅 레벨의 로깅 정보를 출력할 수 있게 해준다. 좀더 미세한 제어를 하고싶다면 퍼스펙티브로 전환하면 된다.
DDMS(달빅 디버깅 모니터 서버)는 프로세스 및 연결된 모든 기기에서 실행중인 달빅 VM에 대한 상세 정보를 제공한다.
DDMS 퍼스펙티브에서는 전체 프로세스, VM과 스레드, 힙의 현재 상태, 특정 연결 기기에 대한 로그캣 정보 등에 대한 정보를 모아 보여준다.
ADB는 연결된 기기와 에뮬레이터를 관리할 수 있게 해준다. ADB는 3개의 컴포넌트로 구성된다.
- 클라이언트 : adb명령을 통해 실행 가능
- 서버 : 백그라운드 서비스로 설치되며 adb 프로그램과 연결된 에뮬레이터 사이의 통신을 책임짐
- 에뮬레이터와 기기에 대해 백그라운드 프로세스로 실행되는 ade 데몬
입력
폴링 _입력 기기의 현재 상태 파악, 특정 버튼을 터치했는지 여부 파악에 용이, 텍스트 입력에는 이벤트 순서 정보 등이 사라지므로 마땅하지 않다.
이벤트 기반 처리 _마지막 확인 시점 이후 발생한 모든 이벤트를 시간 순서대로 확인할 수 있다.텍스트 입력 또는 이벤트 순서에 의존하는 작업 처리시 적합하다.
안드로이드 이벤트
터치 다운, 터치 드래그, 터치 업, 가속계-> 폴링으로 체크
TouchEvent는 손가락의 위치, 포인터ID를 기록한다. 첫번째 터치는 ID0 두번째는 ID1을 받는다. 손가락0이 떨어지더라도 ID1은 유지된다. 새로운 손가락이 터치되면 ID0이 된다.
파일I/O : 자바 표준 방식인 InputStream과 OutputStream인스턴스를 주로 생성해 사용한다. i/o 모듈에서는 게임과 함께 패키징한 레벨 파일, 이미지, 오디오 파일 등을 주로 익는 것을 처리한다.
InputStream 과 OutputStream은 일반 자바 스트림으로 사용 후 반환해야 한다.
오디오 : 오디오 파일은 많은 메모리가 필요한데, 게임의 음악 재생시 전체를 메모리에 로딩하는 것이 아닌 필요시 마다 스트리밍할 것이다. 보통은 하나의 음악만 스트리밍으로 재생하므로 디스크에는 한 번만 접근하면 된다.
색상 : 색상은 0.0 ~ 1.0의 값을 사용하며 float를 사용하며, 부호없는 정수를 사용한다. 0~255사이의 범위를 갖게 된다.
비트별 색상
32bit float RGB : 1pixel = 12byte 강도 : 0.0~1.0
24bit 정수 RGB : 1pixel = 3~4byte 강도 : 0~255 RGB888또는 BGR888
16bit 정수 RGB : 1pixel = 2byte 강도 : 빨간색/파랑색 0~31, 녹색 0 ~ 63 RGB565 또는 BGR565
알파블렌딩(알파 마스킹) : 색상의 투명도를 지정한다. 32bit정수중 사용하지 않는 8bit에 알파값을 사용한다.
블렌딩 방정식
red = src.red * src.alpha + dst.red * ( 1 - src.alpha)
blue = src.green * src.alpha + dst.green * ( 1 - src.alpha)
green = src.blue * src.alpha + dst.blue * (1 - src.alpha)
안드로이드 애플리케이션 컴포넌트
- 액티비티 : 상호작용할 수 있는 UI를 제공하는 사용자 대면 컴포넌트
- 서비스 : 백그라운드 작업을 수행하며, UI는 가지고 있지 않음
- 콘텐츠 프로바이더 : 다른 어플리케이션에서 사용할 수 있는 데이터 영역 구성
- 인텐트 : 시스템, 애플리케이션에서 생성하는 메시지로 관련 대상으로 전달 됨. 시스템 이벤트 전달 및 다른 애플리케이션이 특정 행동을 할 때 사용
- 브로드캐스트 수신자 : 특정 액티비티를 시작하거나 다른 인텐트를 시스템에게 보내는 등의 행동 가능
안드로이드 애플리케이션은 OS와 달리 단일 시작점이 없으며 특정 인텐트를 통해 특정 동작을 수행하라는 요청을 받을 경우 실행한다.
- name : <manifest>에서 지정한 package 어트리뷰트의 상대 경로에 있는 액티비티 클래스명을 지정- label : 액티비티의 타이틀 바에 표시되며, 애플리케이션의 시작점인 경우 실행프로그램에도 표시된다.- screenOrientation : 실제 사용할 방향을 지정 Portrait(세로), landscape(가로)- configChanges : 기기의 방향변화 화면에 슬라이드 동작 등 변화를 수용할 때 기존 애플리케이션을 종료하고 재 실행하는데, 이 configChanges를 활용하면 종료, 재실행을 하지 않고 여러 개의 설정 변화를 함께 지정할 수 있다. '| '
<intent-filter> 특정 인텐트에 애플리케이션의 어떤 액티비티와 서비스가 실행되어야 하는지 전달<action> 액티비티가 애플리케이션의 주요 시작점임을 안드로이드에게 알려주는 일을 함<category> 애플리케이션 실행 프로그램에 액티비티를 추가하고자 함을 지정android.intent.action.MAIN 애플리케이션의 메인 액티비티를 시작할 때 안드로이드 시스템이 사용하는 특수 인텐트
android.intent.category.LAUNCHER 애플리케이션 실행 프로그램에 특정 액티비티가 들어 있어야 하는지 여부를 안드로이드에게 알려줄 때 사용애플리케이션의 메인 시작점이 될 액티비티 하나에 대해서는 두 개의 인텐트 필터를 지정해야 한다. 나머지 액티비티들은 인텐트 필터없이 정의해 애플리케이션 내부에서만 사용한다.
<uses-permission> 시스템 리소스 등 요청시 사용
- android.permission.RECORD_AUDIO 오디오 녹음 하드웨어 접근을 허용
- android.permission.INTERNET 네트워크 API접근을 허용
- android.permission.WRITE_EXTERNAL_STORAGE 외부 저장소에 파일을 읽고 쓰게 해준다.
- android.permisson.WAKE_LOCK 슬립모드에 빠지는 것을 막아준다.
<uses-feature> 안드로이드 마켓의 하드웨어 프로필에 따라 필터링을 정함<uses-sdk> 애플리케이션의 최소버전과 빌드대상을 지정
class.forName() class 인스턴스를 가져오려는 클래스의 전체 클래스명에 해당하는 문자열을 인자로 받는다
액티비티 상태 변화 감지 매서드
- Activity.onCreate() 최초 실행시 모든 UI 컴포넌트를 설정하고 이를 입력 시스템과 연결
- Activity.onRestart() 정지 상태에서 실행을 재개할 때 호출 먼저 onStop()가 호출되어야 한다
- Activity.onStart() 액티비티가 정지 상태로부터 재개될 때 호출
- Activity.onResume() onStart()이후 일시 정지 상태로부터 실행을 재개할 때 호출
- Activity.onPause() 일시정지 상태에 들어갈 때 호출
- Activity.onStop() 정지 상태시 호출되며 이전에 onPause()가 호출 된다
- Activity.onDestroy() 소멸시 사용
싱글터치 이벤트onTouch(View v, MotionEvent event) //View 터치이벤트 전달 인자 / MotionEvent는 이벤트 자체
MotionEvent는 게임관련 3가지의 메서드를 가지고 있다.MotionEvent.GetX() / GetY() 좌표값MotionEvent.getAction() 터치 이벤트 타입을 반환
- ACTION_DOWN, ACTION_MOVE, ACTION_CANCEL, ACTION_UP
StringBuilder 이벤트 문자열을 구성하는데 사용TextView.setOnTouchListener() 액티비티가 TextView의 MotionEvent를 받을 수 있게 리스너로 등록
cf) 과거 1.5ver의 경우 TouchEvent가 무한 발생되므로 onTouch()에서 Thread.sleep(16)으로 16밀리초 제한을 두는게 좋다
멀티터치 이벤트 처리
event.getX(pointerIndex);
event.getY(pointerIndex);
pointerIndex는 화면을 터치하고 있는 특정 손가락의 이벤트 좌표계를 보관하는 MotionEvent의 내부 배열의 인덱스이다. 포인터 인덱스를 기반으로 포인터를 식별하는 MotionEnvet.getPointerIdentifier(int pointerIndex)가 있다.
int pointerIndex = (event.getAction() & MotionEvnet.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
MotionEvent.ACTION_POINTER_ID_MASK 상수는 값이 0xff00이므로 포인터 인덱스를 갖고있는 8~15bit를 제외한 모든 bit를 0으로 만든다. 즉, 비트 연산을 통해 이벤트 타입을 제거한다(ACTION_DOWN). 즉, 시프트를 통해 8~15it를 0~7bit로 옮겨 이벤트의 식별자뿐 아니라 이벤트의 좌표계도 얻을 수 있다.
MotionEvent.getAction()에서 반환한 정수에 인코딩된 추가 포인터 인덱스를 제거한다. 이 때 포인터 인덱스를 마스크시킨다.int action = event.getAction() & MotionEvent.ACTION_MASK;
MotionEvent.ACTION_POINTER_DOWN : 첫 번째 손가락이 MotionEvent.ACTION_DOWN 발생된 상태에서 추가 손가락이 있을 경우 발생
MotionEvent.ACTION_POINTER_UP : 터치된 두 손가락중 한 손가락이 떨어질 때 호출되며, 마지막 손가락은 MotionEvent.ACTION_UP을 호출한다.
MotionEvnet는 여러 이벤트의 데이터를 담을 수 있으며 포함된 이벤트의 개수를 확인할 경우 MotionEvent.getPointerCount()를 호출하면 된다.
0 개의 댓글:
댓글 쓰기