태그 : cocoa

아이폰 개발 팁 - cocos2d 로딩화면 쓰레드 로딩하기

쓰레드를 이용해서 자연스러운 로딩화면을 보여주면서 

백그라운드로 로딩하는데는 여러가지 방법이 있겠지만,

cocos2d 에서 이용할 수 있는 간단한 방법 중엔 이런게 있네요.

원문 링크 중의 어느 댓글을 참고해서 테스트를 해보면..



- (void) applicationDidFinishLaunching:(UIApplication*)application

{

.....


// app뜨면 바로 로딩씬을 불러와서 실행~

loadingScene = [[LoadingScene alloc] init];

[[CCDirector sharedDirector] runWithScene: loadingScene];


// 쓰레드 생성해서 로딩하기~

NSThread* thread = [[[NSThread alloc] initWithTarget:self selector:@selector(loadingProc) object:nil] autorelease];

[thread start];

}


- (void)loadingSceneProc {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


// 이게 핵심 코드 없으면 텍스쳐 다 깨지고 난리납니다;

// 뭐하자는 얘기인지 감만 올 뿐이죠 =_=;;

EAGLContext *k_context = [[[EAGLContext alloc]

   initWithAPI :kEAGLRenderingAPIOpenGLES1

   sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]] autorelease];

[EAGLContext setCurrentContext:k_context];

// 여기서 필요한 것들을 백그라운드로 로딩!

// 실제로 사용할 MainScene에 로딩할게 잔뜩있다고 치고.. 생성해서 로딩~

mainScene = [[MainScene alloc] init];


// 이게 혹시(!) thread-safe하지 않으면 다른 방식으로 notification 처리 필요~

[[CCDirector sharedDirector] replaceScene:mainScene];

[pool release];

}



by 쉬귀 | 2010/10/31 03:03 | 개발 | 트랙백 | 덧글(1)

Cocoa 아이폰 개발 - Custom Font 사용하기


이 방법은 iPhone/iPad SDK 3.2부터 지원되고.. 너무 간단합니다 :>

  • 프로젝트의 info.plist에 key로 UIAppFonts 를 추가하고 
  • array로 변경해서 Item X에 font 이름 쓰기
  • font화일을 프로젝트에 resource로 추가
  • font화일 오른쪽 클릭해서 '정보 입수'로 폰트 이름 확인

  • 아래 코드를 돌려보면 등록된 폰트 이름이 보이고, 이제 그냥 시스템 폰트처럼 사용하면 됩니다.
  • 화일 이름이 아니고, 위에서 확인한 폰트 이름으로 사용해야 합니다. :>
  • 혹시 UIAppFonts에 등록된 폰트가 로딩에 문제가 있으면, 디버거 콘솔창에 뭔가 출력될 겁니다~
  • cocos2d 등에서도 그냥 사용 가능

// 등록된 폰트 이름 보기

NSArray* tempFonts = [UIFont familyNames];

for(NSString* aFont in tempFonts)

NSLog(aFont);



무료 폰트 --> 헤움OTF 무료폰트96종
참고 링크 --> http://bit.ly/bl3zFi


by 쉬귀 | 2010/09/07 22:53 | 개발 | 트랙백(1) | 덧글(5)

코코아 아이폰 개발 - 세이브 화일 저장하기

아이폰 개발에 세이브화일 save/load는 필수죠.
NSString으로 저장한다든지 하는.. -_-; 여러가지 방법이 있겠지만..

아래는 NSKeyedArchiver/NSKeyedUnarchiver를 이용하고 
NSCoder를 통해서 객체별로 serialize를 하는 방식입니다.

약간 무겁다?는 느낌도 있지만.. 요 정도가 확장에도 무난하고 쓸만한거 같네요.
(비도 오고.. 소화도 안되고 해서.. 정리 겸.. ;;)

//
// 범용으로 사용하는 save / load 함수 샘플
//

+(void)saveToFile:(NSString*)filename object:(id)root

{

NSString *path = [self getPath:filename];

      // root 부터 줄줄이 하위객체를 다 돌면서 path화일에 저장하게 됩니다.

BOOL saved=[NSKeyedArchiver archiveRootObject:root toFile:path];

if (saved){

NSLog(@"saved");

else {

NSLog(@"not saved");

};

}


+(id)loadFromFile:(NSString*)filename

{

NSString *path = [self getPath:filename];

              // path화일을 읽어서 적절한 객체를 생성해서 넘겨줍니다.

id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

return obj;

}



//
// 저장할 class 샘플
//
// 빨강색 볼드체가 핵심! 이런 식으로 serialize가 필요한 객체에 NSCoding함수에 대한 구현을 하면 됨.
// 일단 save/load 없이 구현해놓고, 빨강색 부분만 나중에 추가해도 할만한데
// 이 객체 자체의 생성 시점이 NSKeyedUnarchiver를 호출할때 initWithCoder가 불릴 때라는 걸 주의~
//

@interface MyObject : NSObject<NSCoding> {

   ....

int score;

MySubObject* subObj;

int intArray[INT_ARRAY_MAX];

}

... 

@end



@implementation MyObject


- (id) initWithCoder: (NSCoder *)coder

{

if ((self = [super init]))

{

score = [coder decodeIntForKey:@"score"];

self.subObj = [coder decodeObjectForKey:@"subObj"];

[coder decodeArrayOfObjCType:@encode(intcount:INT_ARRAY_MAX at:(void *)intArray];

}

}


- (void) encodeWithCoder: (NSCoder *)coder

{

[coder encodeInt:score forKey:@"score"];

[coder encodeObject:subObj forKey:@"subObj"]; // MySubObject도 NSCoding구현 필수!

[coder encodeArrayOfObjCType:@encode(intcount:INT_ARRAY_MAX at:(const void*)intArray];

}


@end



더 자세한 참고 링크 : http://cocoadevcentral.com/articles/000084.php

by 쉬귀 | 2010/08/25 22:15 | 개발 | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶