Total587,633
Today2
Yesterday7

카테고리

분류 전체보기 (437)
예찬+상빈 아들만 둘!.. (0)
IT, Gadget (90)
DEV life (30)
테마게시판 (0)
Life (47)
사진이 있는 이야기 (73)
30대의 유희 (196)
오늘뭐먹지 (0)

최근에 받은 트랙백

블로그 이미지
jakesoul
좁지만,제이크씨의문화살롱

달력

« » 2019.8
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

최근에 달린 댓글

http://github.com/cdave1/ftgles

openGL 기반의 FTGL을 openGLES로 포팅한 라이브러리로, static library 형태로 제공되어 쉽게 기존의 XCode 프로젝트에 추가시킬 수 있다. 자세한 installation은 링크를 참조. 밑에는 installation과정을 간단히 스샷으로 표현. 








Posted by jakesoul

근황:

현재 기본적인 어플리케이션 프레임과 각종 필요 API등은 어느 정도 작업이 끝난 상태입니다. (오래 걸렸죠...-_-;;)

이제 보다 근본적인 문제에 부딪혔는데, 그것은 바로 리소스를 가공할 툴을 만드는 것과, 어떻게 프로젝트를 매니징/프로듀스할 것이냐 하는 것들입니다.

필요인력을 수급하고 프로젝트를 관리하는 것은 사실 여기서 다루긴 어려운 문제고,

리소스를 가공할 툴..같은 경우는 cocoa 개발에 대한 소양이 깊지 못한 관계로 천상 wintel 플랫폼에서 작업을 하기로 결정했습니다. 결국 맥을 메인으로 쓰는 것은 또 다시 철회, 한동안 치워두었던 wintel 머신을 다시 들여놨습니다. (cpu가 amdx2 쿠마인데, 한밤중에 작업하고 있으면 지금 내가 시카고행 대한항공 보잉747기 이코노미석에 앉아 있는 느낌도 납니다. 저는 미쿡에 가본적이 없다능)

이왕 맥과 wintel 머신을 병행하기로 한 이상, 장기적으로 windows에 아예 cygwin따위로 iPhone 개발 환경을 구축하는 것도 고려중입니다. 집에 모니터가 달랑 하나라 아무래도 (노트북이 아닌)컴퓨터 두대에서 와리가리 하는 것도 귀찮을 테니까요. 그럼 대체 맥은 왜 산거지...? (-_-)





'DEV life > DEV.mobile' 카테고리의 다른 글

SKT 앱스토어 오픈  (0) 2009.06.09
SKT 앱스토어 어플 공모전  (4) 2009.05.11
날로 먹는 iPhone dev 일기 #3  (2) 2009.05.06
SKT의 앱스토어, 성공할까?  (26) 2009.04.14
2D 프레임버퍼의 제어  (2) 2009.04.07
날로 먹는 iPhone dev 일기 #2  (0) 2009.04.07
Posted by jakesoul
Touch

어떤 형태로건 사용자의 입력이 없다면 그것을 '게임'이라고 부를 수 있을 까요?

사용자의 입력이라는 것이, 일반적인 게임의 조작성에서 조금 멀리 떨어져 있을 수는 있어도-비쥬얼 노블 류 처럼 OK 버튼이나 푹푹 눌러대거나, NDS의 닌텐독스나 대합주에서 처럼 마이크에 소리를 지른다거나 등등등-어찌 되었건 '게임'이라는 어플리케이션을 구성하는데 외부의 조작을 처리하는 것은 반드시 필요한 것이 되겠습니다. 

 iPhone은, 설명할 필요도 없이, 메인 입력으로 터치 인터페이스를 사용하죠. 이것을 처리하기 위해서 필요한 것은, 프로젝트에 UIKit framework가 포함되어 있을 것입니다.


touch를 제어하는 방법을 잘 다룬 예제로는 Apple Sample Codes의 Touches가 있습니다. 코드를 얻은 후, MyView.m 파일 중반을 보시면 touch event 를 다루는 이벤트 핸들러 메소드들이 있습니다.

이를 간단히 정리해보면-

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;


이름을 보니 이놈이 뭐하는 놈인지 설명할 필요가 없어졌습니다.

그래도 간단히 짚고 넘어가죠^^;;


// Handles the start of a touch

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSUInteger numTaps = [[touches anyObject] tapCount]; // ==> 현재 터치되어있는 수를 구하는 코드

// ...중략


// Enumerate through all the touch objects.

NSUInteger touchCount = 0;

for (UITouch *touch in touches) {

    // Send to the dispatch method, which will make sure the appropriate subview is acted upon

[self dispatchFirstTouchAtPoint:[touch locationInView:self] forEvent:nil];

// ==> 모든 터치에 대해, 터치 위치와 이벤트 등에 따라 처리해줍니다.

touchCount++;  

}

}


-(void) dispatchFirstTouchAtPoint:(CGPoint)touchPoint forEvent:(UIEvent *)event

{

// ...생략-_-

}


이놈 까지 봤으니 이후는 더더욱 설명할 것이 없을 것입니다.


// Handles the continuation of a touch.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{  

// ...생략

// Enumerates through all touch objects

   for (UITouch *touch in touches) {

// Send to the dispatch method, which will make sure the appropriate subview is acted upon

  [self dispatchTouchEvent:[touch view] toPosition:[touch locationInView:self]];

}

// ...생략

}


-(void) dispatchTouchEvent:(UIView *)theView toPosition:(CGPoint)position

{

// ...생략

}


// Handles the end of a touch event.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    // Enumerates through all touch object

    for (UITouch *touch in touches){

// Sends to the dispatch method, which will make sure the appropriate subview is acted upon

[self dispatchTouchEndEvent:[touch view] toPosition:[touch locationInView:self]];

}

}


-(void) dispatchTouchEndEvent:(UIView *)theView toPosition:(CGPoint)position

{   

// ...생략

}


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

    // Enumerates through all touch object

    for (UITouch *touch in touches){

// Sends to the dispatch method, which will make sure the appropriate subview is acted upon

[self dispatchTouchEndEvent:[touch view] toPosition:[touch locationInView:self]];

}

}


참 쉽죠잉?-_-  터치의 처리 자체는 간단한 문제지만, 이후 구현하고자 하는 게임의 인터페이스 디자인에 따라 이벤트의 처리를 보다 효율적으로, 그리고 직관적으로 설계하기 위한 연구가 필요할 것입니다. 다음은 사운드 출력 고고싱~

* iPhone Simulator에서의 멀티터치 입력은, option키를 누르면 가능합니다.


'DEV life > DEV.mobile' 카테고리의 다른 글

SKT의 앱스토어, 성공할까?  (26) 2009.04.14
2D 프레임버퍼의 제어  (2) 2009.04.07
날로 먹는 iPhone dev 일기 #2  (0) 2009.04.07
날로 먹는 iPhone dev 일기 #1  (2) 2009.04.01
날로 먹는 iPhone dev 일기 #0  (2) 2009.03.30
게임 플랫폼으로서의 iPhone  (2) 2009.03.24
Posted by jakesoul
Drawing@2D 

애플은 iPhone의 3D API로 openGL | es를 사용합니다. 익히 아시다시피 openGL은 'os비종속적인' 표준 3D 라이브러리죠. 물론 3D뿐만 아니라 2D 이미지를 표시할 때도 Quartz보다 openGL | es 사용이 권장됩니다.

openGL(es)로 2D 이미지를 그리는 것은 개발자 입장에서 썩 효율적인 일은 아닙니다. openGL의 3D 좌표계에서 2D 좌표를 직관적으로 사용할 수 없는 것은 물론이고, 애초에 2D 이미지 = z뎁스 고정된 rect위의 텍스쳐이기 때문에 이미지 크기에 대한 제한(텍스쳐 이미지의 크기는 power of 2이어야 합니다. 32*32, 64*64, 128*128, ...) 등으로 이것 저것 신경써야 할 것이 많습니다.

물론, 어느 개발사건 상용게임 혹은 그에 준하는 게임을 만들 때 openGL (혹은 directX) 만을 가지고 만들지는 않습니다. 라이브러리에서 제공하는 기본 API 자체로는 개발자가 일일이 해야할 것이 많기 때문이죠. 보통 '엔진'으로 불리우는, 보다 하이레벨의 라이브러리 셋을 얹어 쓰게 됩니다.

보통 iPhone 개발용으로 자주 언급되는 엔진으로는 oolong, sio2, cocos2d 등-모두 open source-이 있는데요, 그중 2D 관련해서는 cocos2d 가 가장 많이 다뤄지고 있습니다. 제가 살펴보니 실제 게임을 구현하는데 조금 애매한 부분이 있습니다. 어딘가 불필요한 부분도 많고, 반대로 조금 모자란 부분도 있습니다. 그저 쉽게 이미지 몇장을 화면에 배치하고 이동이나 회전 등의 제어를 하는 것으로 만족한다면 모를까, 이대로는 게임 엔진을 구성할 수는 없는 수준입니다. 결국 많이 손을 보아야하는데, 이미 누군가에 의해 높이 쌓아져 올린 동전 더미를 건드리는 것보다, 새로 동전을 쌓는 것이 수월할 때도 있습니다. 

외국의 dev 포럼을 보면 보통 2D 기반의 작업에 대해서, cocos2d의 texture2D 클래스만 가져와서 개발을 하는 경우를 종종 볼 수 있습니다. texture2D 클래스를 어디서 구할 수 있느냐 물어보는 사람들도 자주 있구요.

컨셉자체가 '날로먹는' 것이므로 자세한 설명과 친절한 예제등은 생략하고 바로 Texture2D를 이용해서 화면에 이미지를 찍어보도록 하겠습니다. 

준비물 : 
1) 애플에서 제공하는 GLSprite 샘플코드
 : Welcome to Xcode 창의 iPhone Dev Center > iPhone Sample Code 섹션에서 찾아들어가시거나, 여기(로그인 필요) 에서 받으면 되겠습니다.

2) Texture2D관련 파일들 - Texture2D.h / Texture2D.m / PVRTexture.h / PVRTexture.m
: cocos2d-for-iphone 소스를 받아서 그 안에서 추출. http://code.google.com/p/cocos2d-iphone/

GLSprite 프로젝트를 열고, Add > Existing Files > 해서 4개의 Texture2D 파일들을 추가합니다. 이 때 필요시 타겟 폴더에 아이템을 복사함Copy items into destination group's folder (if needed)에 체크하세요.


이제 EAGLView.m 을 들여다 보도록 하겠습니다.

살짝 살펴보면,  GLSprite 어플은 
 
어플이 시작되면
(id)initWithCoder:(NSCoder*)coder;
-> [self setupView];
-> [self drawView];

그리고 매 timeout마다
(void)drawView;


이렇게 돌아가는 것을 알 수 있습니다. *한번 돌려 [CMD-R] 보세요. 4각형에 텍스쳐가 매핑되어서 빙글빙글 돌고 있습니다.



- (void)setupView


이곳에서 스프라이트(이미지)의 로딩과 기본적인 openGL|es 세팅이 이루어집니다. 중간에 스프라이트를 읽어오는 부분을 살펴봅니다.

spriteImage = [UIImage imageNamed:@"Sprite.png"].CGImage; 

Sprite.png파일을 UIImage로 읽어서, 그것을 CoreGraphics Image로 가져오는 코드입니다. 하지만 이 때 image 파일들은 8비트, 32비트 rgb(a)칼라여야 하고, power of 2의 사이즈를 가져야 합니다. 이것 저것 따지는 게 많고 귀찮습니다.

이제 Texture2D 클래스를 이용해서 쉽고 편하게 2D이미지를 읽어와서 화면에 뿌려보도록 하죠.

EAGLView.h 에 Texture2D 헤더를 임포트 선언합니다.

#import "Texture2D.h"


그리고 EAGLView 클래스 선언 내부에 Texture2D 객체를 하나 추가해줍니다.

Texture2D *tex;


그리고 원하는 이미지 파일을 Resources 폴더 밑에 추가해줍니다.  Add > Existing Files > 마찬가지로 이 때 필요시 타겟 폴더에 아이템을 복사함Copy items into destination group's folder (if needed) 을 체크.

그리고  - (void)setupView 를 다음과 같이 추가/변경합니다.


그리고 - (void)drawView 를 고쳐 보죠.


이 때, 이미지의 기준 좌표는 좌측 하단이며, 전체 화면은 x: -1.0 ~ 1.0, y: -1.5 ~ 1.5 를 차지하고 있습니다. 대강 감이 오시죠? (-1.0, -1.5) 부터 넓이 2.0, 높이 3.0의 Rect에 텍스쳐를 그리라는 것입니다. 참고로 커멘트 되어있는 부분- [tex drawAtPoint:CGPointMake(-1.0, -1.5)]; 는 한 점CGPoint 위에 텍스쳐를 그리는 것으로, cocos2d 안에 있는 Texture2D소스를 바로 가져왔을 때 한 두라인을 수정해야 화면에 제대로 보입니다. 


제가 넣은 이미지를 띄워보았습니다. =) 

이것으로 화면에 '내가 원하는 이미지'를 '원하는 위치'에 띄우는 것이 가능해졌습니다. 이제 기존에 자신이 쓰던 스프라이트/리소스 툴과 연계하여 보다 편리하고 보다 효율적으로 돌아가는 스프라이트 엔진을 짜는 것이 필요하겠죠.

'DEV life > DEV.mobile' 카테고리의 다른 글

2D 프레임버퍼의 제어  (2) 2009.04.07
날로 먹는 iPhone dev 일기 #2  (0) 2009.04.07
날로 먹는 iPhone dev 일기 #1  (2) 2009.04.01
날로 먹는 iPhone dev 일기 #0  (2) 2009.03.30
게임 플랫폼으로서의 iPhone  (2) 2009.03.24
에리테리아 전설  (6) 2009.03.13
Posted by jakesoul
앱스토어 런칭과 함께 외국의 개인 개발자들이 대박을 터뜨리는 것이 보도되면서, 저 역시 대박의 부푼 꿈을 안고 맥미니와 아이팟 터치를 질럿드래군했습니다. 하지만 당시 회사에서 거친 프로젝트 중심에서 야근을 외쳐대느라 잠시 묻어두었다가, 이번 달 초에 다시 팔을 걷어 부쳤습니다. (국내 개인 개발자의 앱스토어 대박 기사에 움찔움찔!)

하지만 여전히 계속되는 야근과 육아&가사에, 생각만큼 진도가 나가지 않습니다. 따져보니 하루 평균 한시간도 안되는 시간이 투자되고 있는데... 스스로에 대한 채찍질과, 앞으로 저와 비슷한 고민을 하실 또다른 개발자들을 위하여 기록을 남기기로 합니다. 거창하게 강좌라고 하기는 뭣하고, 처음 iPhone dev에 발을 담그시려는, 그리고 Xcode 한번은 돌려보신^^) 분들이 가볍게 쭉 리뷰하면서 큰 그림을 이해하시는데 도움이 되는 정도의 아티클이 되겠습니다. 

따로 objective-C 에 대한 언급은 않겠습니다. 새로운 언어 자체보다 플랫폼의 이해, 그리고 그에 따른 문제 해결 방법이 근본적인 탐구 대상이 될 것이며, 특별히 중요하지 않은 부분은 스킵하고 중요한 부분만 후딱후딱 치고 나갈 것입니다. 말그대로 '날로 먹는' 개발 일기가 될 것입니다. =) 


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

Specification

플랫폼과 언어를 막론하고, 게임(+ 대부분의 end user용 어플 개발)을 만들 때 기본적으로 구현 되어야할 기능들은 다음과 같습니다.

1) 화면에 이미지와 글씨를 그린다 
2) 사용자의 입력을 받는다 
3) 사운드를 출력한다 
4) 파일을 읽고 쓴다 
5) 네트워킹을 한다

이 중 1-2-3만 되어도 간단한 게임을 구성할 수 있겠죠? 이 중에서도 가장 기본이 되는 것은 1) 일 것입니다. 실제로 게임 개발에서도 가장 비중을 두는 것이 그래픽이구요. 꼭 보기좋은 떡이 먹기도 좋은건 아니지만, 최소한 보기좋다고 욕먹는 경우는 없으니까요. 그래서, 일단 화면에 2D 이미지를 뿌리는 것 부터 시작하기로 하죠. (사실 3D 개발 관련해서는 똘똘한 cs 전공 학부생만도 못한 소양이라...ㅎㅎ)


원래는 이 뒤로 분량이 더 있는데(2D drawing)... 맥상에서 화면 캡쳐하는 방법을 몰라서 여기서 끊고 갑니다.-_-;;


'DEV life > DEV.mobile' 카테고리의 다른 글

날로 먹는 iPhone dev 일기 #2  (0) 2009.04.07
날로 먹는 iPhone dev 일기 #1  (2) 2009.04.01
날로 먹는 iPhone dev 일기 #0  (2) 2009.03.30
게임 플랫폼으로서의 iPhone  (2) 2009.03.24
에리테리아 전설  (6) 2009.03.13
KTF Brew 단말기 현황 (08년 3월 31일자)  (0) 2008.09.07
Posted by jakesoul