카테고리 : 개발

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

아이폰 개발에 세이브화일 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)

cocoa에서 숫자 3자리마다 컴마 찍는 방법

NSNumberFormatter라는 멋진 넘이 있네요.

     // formatter 미리 만들어 놓고.. 재사용 ㄱㄱ~

     NSNumberFormatter *frmtr = [[NSNumberFormatter alloc] init];

     [frmtr setGroupingSize:3];

     [frmtr setGroupingSeparator:@","];

     [frmtr setUsesGroupingSeparator:YES];



     // 실제로 숫자 --> 컴마 문자열로 변환할

     int number = 10000000;

     NSString* commaString = [frmtr stringFromNumber:[NSNumber numberWithInt:number]];


     // commaString == @"10,000,000";


     출처 : http://www.tech-recipes.com/rx/5460/cocoa-convert-number-to-comma-separated-nsstring/


by 쉬귀 | 2010/07/25 20:48 | 개발 | 트랙백 | 덧글(0)

Cocos2D에서 통짜 Sprite화일 쉽게 사용하는 법


sprite animation을 하려면 sprite가 많~~이 필요하다;
그냥 CCSprite로 한장 한장씩 로드해서 하면 힘들다; 개발자도 힘들고 아이폰도 힘들다;
CCSpriteSheet를 사용해서 통짜texture를 읽어놓고 좌표를 정의해서 사용할 수도 있으나,
각 frame별로 좌표를 잡으려다보면.. 먼저 머리 잡고 쓰러지는 수가 있다 -_-;

그래서!
Cocos2D에는 sprite frame animation을 하기 쉽도록 CCSpriteFrameCache를 제공한다.

뭘 하는 거냐면..
  • 각 프레임별 sprite가 통합된 한 장의 texture
  • 그 texture 안의 sprite의 정보(이름, 위치, 사이즈 등)를 담은 plist 화일을 한 큐에 읽고 관리해준다.
와! 좋다~~
그런데, 잠깐 고민을 하게 된다.. plist(Property List)는 어떻게 만들지??
읽는거는 자동이라고 해도 plist에 하나하나씩 입력할 수는 없지;; 힘드니까~

찾아보니.. 삽질하지 말라고 누가 다 만들어놨다. ㄱㅅㄱㅅ;

간단하게 적어보면,
  1. 각 sprite 프레임별로 이미지를 한장 한장씩 만들어서
  2. http://zwoptex.zwopple.com/ 를 띄우고
  3. import해서 
  4. 정렬하고 
  5. export하면 된다. 우왕굳~ :>

그리고, 버전업이 되면서 cache의 create..함수가 deprecate됐으니 저 위에 링크의 소스는 안되고 아래처럼 써야된다~
// CCSprite * blob = [cache createSpriteWithFrameName:@"blob_idle_01.png"];
CCSprite * blob = [CCSprite spriteWithSpriteFrameName:@"blob_idle_01.png"];

핵심은 CCSpriteFrameCache에서 plist를 읽고 나면, 
CCSprite에서 통합하기 전의 원본 화일 이름으로 접근해서 쓰면 되는 것~

자 그럼.. 2D 애니메이션의 세계로 ㄱㄱ~

by 쉬귀 | 2010/03/01 00:05 | 개발 | 트랙백 | 덧글(3)

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