프로젝트 빌드시에 


CLScoreServerPost.m

 Deprecations

 'uniqueIdentifier' is deprecated


CLScoreServerRequest.m

 Deprecations

 'uniqueIdentifier' is deprecated


의 2개 Warning이 발생할 경우, 프로젝트 트리에서 루트 옆의 M자 아이콘을 클릭한다. 

옆에 나오는 프로젝트 세팅에서, Info 옆의 Build Settings를 클릭하고, 아래의 Deploment > iOS Deployment Target을 iOS 4.x대로 변경해 낮추면 위 Warning이 발생하지 않는다.

이것은 딱히 하지 않아도 Warning이므로 프로젝트 실행에 지장은 없다. 

1. 맥 OS X가 설치되었다면 응용프로그램 > 유틸리티 > Bootcamp 지원 을 선택해서 부트캠프로 윈도우 7을 설치할 수 있다.

2. 외장 ODD가 있다면 그걸 이용하면 되지만 없을 경우에는 부팅 USB 드라이브를 만든다. 보통 윈도우 7용 부팅 USB는 MS의 USB Tool이나 UltraISO 등을 이용해서 만드는데, 라이온 이상의 맥 OS에서는 부트캠프 내에 자체적으로 부팅 USB를 만들어 주는 기능이 있으므로 이런 것을 이용할 필요는 없다.

3. 부트캠프를 실행하면 3가지 항목이 나온다. 

 1) Windows 7 설치 디스크 생성 :
     이게 부팅 USB를 만드는 항목이다. (당연히 ODD로 설치할 경우에는 필요없다)
     이 항목을 선택했을 경우, 설치에 사용할 윈도우 7 원본 설치 DVD 이미지(ISO파일)의 경로와, 대상 USB 드라이브를
     지정할 수 있다. 

 2) Apple에서 최신 Windows 지원 소프트웨어 다운로드 :
     부트캠프를 이용해 윈도우 7을 설치했다고 하더라도, 실제 윈도우를 기동하면 맥북의 각종 하드웨어를 윈도우에서
     제어하는 데에 필요한 드라이버가 설치되지 않은 상태이다. 이를 위해서는 맥을 위해서 제공되는 드라이버들이 필요한데
     바로 이 드라이버들을 다운받는 항목이다. 이 항목을 선택했을 경우, 설치 디스크 생성 과정이 끝난 뒤 인터넷으로
     드라이버를 다운로드하게 된다. (꽤 상당히 시간이 걸린다)

 3) Windows 7 설치 :
     1)에서 생성된 USB나, ODD의 설치 디스크를 이용해서 실제로 윈도우 7을 설치한다.
     이 항목을 선택했을 경우, 설치 과정에서 맥북의 하드디스크 파티션을 원하는 크기만큼 나누어 윈도우용으로 할당할 수
     있다. (별도의 포맷 과정이 필요없다)

plist 프레임 키값을 알아서 가져오는 방법입니다.
 TexturePacker를 사용하여 생성된 plist 프레임 키값을 가져올 때 사용하였습니다. 
        

 NSMutableArray *animFrames = [NSMutableArray array];
        
 NSString *framePath = [[NSBundle mainBundle] pathForResource:@"1st_bad_animation" ofType:@"plist"];
 NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:framePath];
 NSDictionary *framesDict = [dictionary objectForKey:@"frames"];

 // Dictionary는 순서가 뒤섞여 있어서 정렬하기 위해 Array에 새로 담습니다.
 NSMutableArray *sortFrames = [[NSMutableArray alloc] initWithCapacity:[framesDict count]];
        
 for (NSString *frameDictKey in framesDict) 
 {
       [sortFrames addObject:frameDictKey];
 }
        
 [sortFrames sortUsingSelector:@selector(compare:)]; // 정렬 
  // compare 는 기본으로 제공되는 함수이고 커스텀이 가능합니다.
        
  for(NSString *frameDictKey in sortFrames) 
  {
       CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:frameDictKey];
       [animFrames addObject:frame];
  }
XCode4로 업데이트 되면서 App 등록을 시킬려고 했더니.. 이거 뭔가 잘 안된다.
그래서 가볍게 구글링 해봤는데.. 없다. (다들 아는걸 나만 모르고 있었나?;;)
어쩔 수 없이 XCode 페이지에서 Xcode 4 Transition Guide를 살펴보니 끝트머리(96 of 98)에 나와있다.
만약 검색안하고 처음부터 살펴봤으면(물런 그럴일은 없겠지만)... 끔찍하다 -ㅅ-;
뭐 암튼 어떻게 바뀌었는지 정리 한번 해봤다.

과거 App Upload방식의 변경이 웹페이지에서 직접 파일을 업로드 하는 방식에서, File Upload 부분만 Application Loader로 바뀌었었다면. 이번엔 Upload하기 전 과정이 바뀌었는데, Archive(새로 추가됨)를 이용하도록 변경되었다.

어떻게 바뀌었는지 둘러보자.
아참. 웹페이지에서 하던일은 똑같이 해줘야 한다. 순전히 XCode에서의 작업만 변경되었다.

1. Build Configuration, Distribution?
1-1. XCode3에서 넘어온 경우
XCode3에서 Build Configure "Distribution"을 만들어서 사용했던 경우인데, 
 Archive Build Configuration만 변경해줘도 되고 아래 1-2 방법을 사용해도 된다.

Editor에서 Edit Scheme를 클릭


Archive가 Release로 선택되어 있는데, 이를 Distribution으로 변경.


1-2. 새로 프로젝트를 만든 경우 (CodeSign 적용)
 
과거에는 Build Configuration에서 Release를 복사해서 Distribution을 만들었었는데 XCode4에서는 어떻게 Distribution을 만드는지 모르겠다.
이런 프로세스 자체가 사라진것 같은데, 개인적인 추측으론 쓸대없이 Distribution만들지말고 Release쓰라고 그런게 아닐까? 한다.
암튼 돌아와서, Release의 CodeSign만 변경해주면 된다.

 
Project Navigator에서 현 프로젝트를 선택한 후 Build Setting 탭으로 이동 (아래 캡쳐에서는 탭이 짤려서 안나온다)
여기서 Release CodeSign을 Distribution용 CodeSign으로 선택


결국 이 과정은 CodeSign을 맞추는 과정이다.

2. Archive
Organizer의 Archives 에 등록을 해야먄 App을 Upload할 수 있다.
현재는 아무것도 없는 상태


Editor로 돌아와서, iOS Device로 시뮬레이터 선택


Product -> Archive를 실행

Archive를 위한 Compiling중.

Compile이 끝나고 Organizer를 확인해보면, Archive한 App이 나타난다.
여기서 Submit 버튼을 누르면 AppStore 등록 프로세스로 넘어간다.



3. App Store에 등록
여기서부터는 과거 Application Loader 방식과 동일하다고 보면 된다.
Organizer에서 Submit을 하면, 로그인창이 나오는데, 개발 계정으로 접속을 하면 된다.

로그인을 하면, Application과 CodeSign이 나오는데, 웹페이지(개발센터)에서 Ready for Upload인 App들만 나온다. (과거와 동일)

Next누르면 Upload가 시작된다.

Upload가 끝나면 이런 화면이 뜨는데..
이슈거리가 있으면 어떤 화면이 뜰지 모르겠다. 인증서가 잘못되면 여기서 걸리지 않을까 추측해본다.

Status를 확인해보면 Submitted라고 나온다.


웹페이지(개발센터)로 가서 한번 확인해보면, "Upload Received"

몇초후 Reload하니 "Waiting For Review"로 status가 변경되었다.


4. 정리

   XCode3XCode4
 Distribution 만들기 (CodeSign)  1. Info 에서 Release 복사해서 Distribution 타입 만들기.  1. Schema에서 Archive의 Build Type을 Distribution으로 변경 혹은 Release의 CodeSign 변경
 Compile 및 Upload 준비
 2. Distribution으로 Build.
 3. Compress
 2. Product -> Archive
 App Upload
 4. Application Loader를 이용해서 Upload.  3. Organizer -> Submit

Finder왔다갔다 할 필요 없이 XCode내에서 클릭 먗번으로 줄여줬고, 
Application Loader를 이용해서 Upload하는 방식은 변하지 않았다.

기타 오류 발생 및 해결 방법 정리
Build Active Architecture Only 설정을 NO로 설정 (Default 값이 NO)
Build할때만 Build Active Architecture Only를 YES로 설정

프로젝트의 Build Setting에서 
Target에 Skip Install 설정을 NO로 변경하여야 한다. (단. Main Project의 설정은 YES 이어야 한다.)

UUID mismatch detected with the loaded library...
디바이스와 SDK의 버전이 일치하지 않아서 발생하는 문제 (Xcode를 삭제 후 설치 요망) 

배포용 인증서 저장시 오류사항
개발용 인증서와 이름이 같으면 생성이 안된다.

옵티마이저 아케이브 오류사항
com.apple.transporter.util.StreamUtil.readBytes(Ljava/io/InputStream;)[B
Xcode Reinstall
sudo /Developer/Library/uninstall-devtools –mode=all

1. CCActionGrid.m 파일의
    
"Incompatible pointer types assigning "CCActionInterval*" from "CCAction*" 에러

other = [action retain]; 부분을
other = (CCActionInterval*) [action retain]; 로 변경  
  



2. ZAttributedString.m 파일의 에러

ZAttributeRun *newRun = [[ZAttributeRun allocinitWithIndex:NSMaxRange(range) attributes:[[_attributes lastObject]attributes]]; 를
ZAttributeRun *newRun = [[ZAttributeRun allocinitWithIndex:NSMaxRange(range) attributes:(NSDictionary*)[(ZAttributeRun *)[_attributes lastObjectattributes]]; 로 변경

ZAttributeRun *newRun = [[ZAttributeRun alloc] initWithIndex:NSMaxRange(range) attributes:[[_attributes objectAtIndex:firstAfter-1] attributes]]; 를

ZAttributeRun *newRun = [[ZAttributeRun allocinitWithIndex:NSMaxRange(range) attributes:(NSDictionary*)[(ZAttributeRun *)[_attributes objectAtIndex:firstAfter-1attributes]]; 로 변경   


3.  CCDirevctorIOS.m 파일의 에러

UIDeviceOrientationPortraitUpsideDown 부분을
UIInterfaceOrientationPortraitUpsideDown 로 변경  

//
//  HelloWorldLayer.m
//  FontStrokeDemo
//
//  Created by user on 12-2-1.
//  Copyright __MyCompanyName__ 2012亮�. All rights reserved.
//


// Import the interfaces
#import "HelloWorldLayer.h"

// HelloWorldLayer implementation
@implementation HelloWorldLayer

+(CCScene *) scene
{
	// 'scene' is an autorelease object.
	CCScene *scene = [CCScene node];
	
	// 'layer' is an autorelease object.
	HelloWorldLayer *layer = [HelloWorldLayer node];
	
	// add layer as a child to scene
	[scene addChild: layer];
	
	// return the scene
	return scene;
}

-(CCRenderTexture*) createStroke:(CCLabelTTF*) label   
                            size:(float)size   
                           color:(ccColor3B)cor
{
	CCRenderTexture* rt = [CCRenderTexture renderTextureWithWidth:label.texture.contentSize.width+size*2  height:label.texture.contentSize.height+size*2];
	CGPoint originalPos = [label position];
	ccColor3B originalColor = [label color];
	BOOL originalVisibility = [label visible];
	[label setColor:cor];
	[label setVisible:YES];
	ccBlendFunc originalBlend = [label blendFunc];
	[label setBlendFunc:(ccBlendFunc) { GL_SRC_ALPHA, GL_ONE }];
	CGPoint meio = ccp(label.texture.contentSize.width/2+size, label.texture.contentSize.height/2+size);
	[rt begin];
	for (int i=0; i<360; i+=30) // you should optimize that for your needs
	{
		[label setPosition:ccp(meio.x + sin(CC_DEGREES_TO_RADIANS(i))*size, meio.y + cos(CC_DEGREES_TO_RADIANS(i))*size)];
		[label visit];
	}
	[rt end];
	[label setPosition:originalPos];
	[label setColor:originalColor];
	[label setBlendFunc:originalBlend];
	[label setVisible:originalVisibility];
	[rt setPosition:originalPos];
	return rt;
}

// on "init" you need to initialize your instance
-(id) init
{
	// always call "super" init
	// Apple recommends to re-assign "self" with the "super" return value
	if( (self=[super init])) {
		
        //label1
		CCLabelTTF* label = [CCLabelTTF labelWithString:@"FontStrokeDemo"
                                             dimensions:CGSizeMake(305,179) 
                                              alignment:UITextAlignmentLeft
                                               fontName:@"Arial" 
                                               fontSize:38];
        [label setPosition:ccp(240, 160)];
        [label setColor:ccWHITE];
        CCRenderTexture* stroke = [self createStroke:label  
                                                size:3  
                                               color:ccBLUE];
        [self addChild:stroke];
        [self addChild:label];
        
        //label2
		CCLabelTTF* label2 = [CCLabelTTF labelWithString:@"Test String"
                                             dimensions:CGSizeMake(305,179) 
                                              alignment:UITextAlignmentLeft
                                               fontName:@"Arial" 
                                               fontSize:38];
        [label2 setPosition:ccp(240, 100)];
        [label2 setColor:ccWHITE];
        CCRenderTexture* stroke2 = [self createStroke:label2  
                                                size:3  
                                               color:ccRED];
        [self addChild:stroke2];
        [self addChild:label2];
	}
	return self;
}

// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
	// in case you have something to dealloc, do it in this method
	// in this particular example nothing needs to be released.
	// cocos2d will automatically release all the children (Label)
	
	// don't forget to call "super dealloc"
	[super dealloc];
}
@end
cocos2D에서 레티나, 3GS 2가지 해상도를 지원하기 위해서는

1. retina 사용여부 부분을 주석해제 해야합니다. (appDelegate 안에 주석처리 되어 있음)

// Enables High Res mode(Retina Display) on iPhone 4 and maintains low res on all other devices 
if (! [director enableRetinaDisplay:YES])
 CCLOG(@"Retina Display Not Supported");

2. 이미지는 2가지로 만들어서 넣으면 됩니다.

aaa.png(3GS), aaa-hd.png(레티나)

* @2x는 cocos2d에서는 필요 없습니다. -hd로 대체됩니다. 단 default.png는 default@2x.png로 만들어야 합니다. 
아이폰 용으로 레티나 디스플래이를 지원할 경우
파일명 뒤에 -hd 를 붙여 사용한다.

이때 아이패드용으로 개발 시 이 레티나용 소스를 사용해서 표현하고 싶다면
ccFileUtils.m  파일을 찾아가

+(NSString*) getDoubleResolutionImage:(NSString*)path

이 함수안에 

if( CC_CONTENT_SCALE_FACTOR() == 2)

위의 부분을 아래와 같이 변경해 주자

if( CC_CONTENT_SCALE_FACTOR() == 2 || (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad))
이는 레티나 디스플래이용으로 설정되었을 때 -hd 파일을 쓴다는 부분인데
뒤에 부가적으로 아이폰 일 경우에도 사용하겠다고 선언해주는 것이다.

UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
이 부분은 현재 인터페이스가 아이패드인지 확인 하는 부분


추가적으로 이렇게 불러오는 리소스와 더불어
포인트도 아이폰용 포인트를 그대로 사용하고 싶다면 아래와 같이 인라인 함수를 하나 만들어 사용하면 편하다.

/** Returns ipad point.
 @return CGPoint
 */
static inline CGPoint
CGPointMakeBothIPad(float iPhonePoint_X, float iPhonePoint_Y) {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        return CGPointMake(iPhonePoint_X/320*768,iPhonePoint_Y/480*1024);
    else
        return CGPointMake(iPhonePoint_X,iPhonePoint_Y);
}
* 라이센스 관련

1. 나의 앱은 소스 코드를 공개하지 않으려고 한다. 그래도 Cocos2D를 사용할 수 있는가?
-> 물론이다. Cocos2D는 MIT 라이센스로 관리되고 있다. 궁금한 점이 있다면 라이센스 관련 항목을 읽어보라.

2. 만약 누가 나의 앱을 구입했을 경우 나는 그에게 소스 코드도 제공해야 하는가?
-> 당신의 게임을 구입했다 하더라도 그 게임의 소스 코드를 제공해야 할 의무는 없다.


* 개발 관련

1. Cocos2D에서 3D 오브젝트를 사용할 수 있는가?
-> 아무 문제 없이 2D 게임에도 3D 오브젝트를 넣어서 그래픽 퀄리티를 높일 수 있다. Cocos2D의 기본 투영 행렬 구조는 3D와 같으므로 아마 변경할 필요도 없을 것이다.

2. 버그를 발견하거나 제안할 사항이 있다. 어떻게 하면 되는가?
-> 이슈 추적기를 사용하라. http://code.google.com/p/cocos2d-iphone/issues/list
또한 포럼에 있는 버그/제안사항 쪽에 글을 써도 된다. 하지만 이슈 추적기를 사용하는 것을 권장한다.

3. 엔진의 개선에 참여하고 싶다면?
-> 당신이 코드에 기여하고 싶다면 다음 단계를 따라주기 바란다.
(만약 당신이 새로운 git 또는 GitHub를 가지고 있다면 Pro Git를 읽어야 한다. 특히 Contributing to a project: Small/Large Public Project 부분을 읽어주시길) (*역주 : GIT는 분산 소스코드 관리 프로그램임)

4. 아이폰용 SDK 3.x와 4.x를 위한 게임을 개발할 수 있는가?
-> 물론이다. Cocos2D는 SDK 2.x, 3.x, 4.x를 지원한다.

5. Cocos2D를 아이폰/아이패드/맥에서 사용할 수 있는가?
-> 그렇다. Cocos2D는 모든 애플 디바이스를 잘 지원한다.
- 아이폰/아이팟 터치 1세대
- 아이폰 3G/아이팟 터치 2세대 
- 아이폰 3Gs/아이팟 터치 3세대
- 아이폰 4/아이팟터치 4세대(고해상도 레티나 모드 선택 지원 가능)
- 아이패드
- Mac OSX

6. 텍스처 사이즈는 어떻게 해야 하는가?
-> 두 가지 고려해야 할 사항이 있다. 비압축 텍스처와 PVRTC 텍스처이다.

비압축 텍스처를 위해 텍스처는 3세대 디바이스에서는 2048 이하의 2제곱수를 가진 2차원 텍스처여야 하고, 그 이전 디바이스에서는 1024 이하여야 한다. 따라서 16x256은 OK. 512x512도 OK. 그러나 240x320은 2의 제곱수가 아니므로 안된다.
이 규칙에 맞지 않는 이미지도 사용은 가능하지만, 텍스처로 변환되어 저장될 때 2의 배수로 자동 저장된다는 점을 기억하라. 240x320의 이미지는 텍스처로 변환될 때 256x512로 바뀔 것이다. 
아이폰 3Gs와 같은 새로운 플랫폼에서는 최대 텍스처 사이즈가 2048x2048까지 가능하다. 아이폰 3G 이하라면 1024x1024까지만 가능하다.

PVRTC 압축 텍스처는 2의 제곱수 크기로 정사각형이어야 한다. 예를 들면 4x4, 32x32, 256x256, 1024x1024와 같은 크기여야 한다. 이 포맷으로 로드된 이미지는 GPU상에서 돌아가는 포맷과 밀접하게 매칭되는 특별한 포맷이다. 따라서 2의 제곱수 크기로 정사각형이어야만 한다. 만약 PVRTC 압축 텍스처를 사용했는데 흰 그림만이 나올 경우 이러한 크기와 정사각형이 아닐 확률이 높다.

7. 스프라이트 시트는 무엇이며 왜 사용해야 하는가?
-> 스프라이트 시트는 큰 스프라이트 상에 정렬된 스프라이트들의 모음이다. 이것을 사용하면 두 가지 장점이 있는데, 첫째로 시트 상의 모든 스프라이트가 한 번의 드로우 콜로 그려질 수 있다는 것이다. 이것은 매우 효율적이다. 두번째로는 메모리의 낭비 없이 2의 제곱수 크기가 아닌 텍스처를 사용할 수 있다는 것이다. 스프라이트 시트 상에 스프라이트를 묶는 가장 좋은 실습은 스프라이트 섹션(http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:sprites)을 참고하면 더욱 자세한 정보를 얻을 수 있다.

8. 텍스처 상에 렌더링하기(렌더 투 텍스처) 기술을 사용할 수 있는가?
-> 물론이다. 프레임버퍼 오브젝트를 사용할 수 있다. 이것은 Cocos2D에서 이펙트 구현을 위해 사용되고 있다. Grabber.m 또는 RenderTexture.m 클래스를 참고하라.

9. 라이트나 연기 같은 동적 알파 효과를 사용할 수 있는가?
-> 물론이다. 프레임버퍼 오브젝트와 채널 마스킹 조합으로 오직 알파 채널 상에서 적절한 블렌딩 모드를 사용해 그릴 수 있다. 연기 효과를 위한 iSteam(다른 이미지보다 상위에 그려지는 편집 가능한 연기 레이어), 번개, 스크래치 복원 이펙트와 변경 가능한 플레이 필드. 이러한 렌더 텍스처 클래스를 보고 다음의 스레드(http://groups.google.com/group/cocos2d-iphone-discuss/brouwse_frm/thread/dab9b84cd5262d80/ed15695bb0cb3af5?lnk=gst&q=scratch+off#ed15695bb0cb3af5)를 참고하라. 

10. 내 프로젝트에 사운드를 추가하는 방법은?
-> Cocos2D는 여러 가지의 오디오 프레임워크를 가지고 있다. 당신에게 필요한 것을 잘 골라서 사용하기 바란다. 

SimpleAudioEngine 인터페이스는 Cocos Denshion 오디오 라이브러리의 일부로서, 대부분의 게임 어플리케이션에 사용하기에는 충분할 것이다

3D의 공간감이 느껴지는 사운드가 필요하다면 PASoundMgr 인터페이스를 사용하면 된다. PASoundMgr은 Cocos2D의 expermental/sound-engine 디렉토리에 포함되어 있다.

더 많은 고급 오디오 테크닉이 필요하거나 저수준의 OS 오디오 API에 접근하고 싶다면 CocosDenshion 오디오 라이브러리의 CDAudioManager 인터페이스가 좋은 선택이 될 것이다.

매우 간단한 오디오 기능이 필요하다면 OS 오디오 API를 직접 사용하는 것으로 충분할 수도 있다. 예를 들어 만약 사운드 하나만 플레이하고 싶다면 AVAudioPlayer API로 간단하게 SimpleAudioEngine과 CDAudioManager 인터페이스 내에서 배경음악으로 활용할 수 있을 것이다.


* 문제 해결

1. 이미지를 띄웠는데, 시뮬레이터에서 색상이 엉망으로 보인다.
-> 혹시 PowerPC 기반 맥을 사용하고 있지 않는가? 맞다면 이미 보고된 문제이다. PowerPC는 아이폰 개발에 적합한 플랫폼이 아니다.

2.  테스트는 어떻게 해볼 수 있는가?
-> 1. Cocos2D XCode 프로젝트를 연다.
    2. 다음 순서로 클릭한다. XCode > View > Customize toolbar 
    3. Active Target, Active Executable을 드래그해서 당신의 탑 프로젝트 툴바로 옮긴다.
    4. 테스트하고 싶은 뷰를 선택하고 드롭다운 메뉴에서 Build and Go를 선택한다.

3. PNG 이미지가 포토샵에서 보이는 것처럼 보이지 않는다. 어째서인가? 
-> 만약 PNG 이미지가 포토샵에서처럼 깨끗하게 나오지 않는다면 우선은 32비트 픽셀 포맷을 사용하도록 하자.

 [[CCDirector sharedDirector] setPixelFormat:kRGBA8]; // 기본은 RGB565
 [[CCTexture2D setDefaultAlphaPixelFormat:KCCTexture2DPixelFormat_RGBA8888]; // 기본은 RGBA8888

그래도 여전히 문제가 생긴다면 다음 사항을 체크하자.

 * 디바이스 상에서 이미지가 생성될 때 알파 채널이 미리 적용되었는지 여부
 * 미리 적용된 알파 이미지를 정확하게 렌더링하기 위해, Cocos2D는 이 블렌딩함수를 사용한다.

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

그러나 당신이 만약 다른 블렌딩함수를 사용하고 싶다면 다음과 같이 해야 한다.

// Cocos2D v0.7x는 모든 스프라이트에 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA를 블렌딩 함수로서 사용한다.
// 이 방법은 정확하지 않다. 그러나 만약 당신이 0.7x의 방식을 에뮬레이트하고 싶다면

[sprite setBlendFunc: (ccBlendFunc) {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}];

블렌딩 함수에 대한 더 많은 정보와 미리 곱해진 알파 이미지에 대해서 알고 싶다면 다음을 읽어보기 바란다.

Premultiplied images in Cocos2D (http://www.cocos2d-iphone.org/wiki/doku.php/release_notes0_8#premultiplied_images)

그리고, 이미지가 혹시 하얗게 나올 경우, 이미지가 미리 곱해진 알파를 가지고 있다면 텍스처가 변환될 때 RGB 컴포넌트가 수정될 것이다. 하지만 만약 이것을 오버라이드하고 싶다면 다음과 같이 하라.

[sprite setOpacityModifyRGB:NO];
 

이전글에서 사용한 프로젝트에서 텍스쳐를 붙혀볼랍니다.

프로젝트 첨부하였습니다.(N드라이브에서 파일을 올리니 올려지는구나 ~)







1.우선 사용할 텍스쳐를 추가합니다.

문제는 사용해야할수있는 텍스쳐의 사이즈가 정해져있습니다.

그거슨 2의 제곱....

Icon.png는 72x72의 사이즈 이고

Lena256.png는 파일명대로 256x256 입니다.

텍스쳐 싸이즈가 2의 제곱이 아닐경우 2의 제곱으로 만들어 줘야하나 생략합니다;

(애플 공식샘플에 존재하나 구글에서 찾는게 더 빠르니 nextPOT 으로 검색 )  POT는 -Power Of Two


그리고 텍스쳐를 읽어들이기 위해 CoreGraphics.framework를 추가해야합니다.

혹 CoreGraphics.framework 추가를 까먹고 빌드를 하면

_CG~궁시렁~  이런 에러가 나오는데 

프렘웤이나 라이브러리 추가안햇을경우의 에러출력 방식을 알수있기에 그냥 빌드해보시길 바랍니다;








2.텍스쳐읽어들이는 소스가 좀 길어서 새로 메쏘드를 작성합니다.

그리고 멤버변수인 텍스쳐 오브젝트도 같이 만들어 줍니다.





3.텍스쳐를 읽어들이기 전에 해야할일은

사용한 텍스쳐 삭제하기 입니다.

나중에 하면 까먹는 일이 많으니 제일먼저 해줍니다;






4.텍스쳐 로딩하기

간단하게 텍스쳐를 사용하기위한 멤버변수와 텍스쳐 파일명을 건네줍니다.(66,71라인)

넘겨준 멤버변수에 저장이 되기에 포인터로 넘겨줍니다.

로딩에 실패했을경우 NO가 반납되어

assert()에서 프로그램강제 종료되게 하였습니다.(69,74라인)






5.텍스쳐 로딩 메쏘드

UIImage로 텍스쳐를 가져오고있으나(482라인)

간단하게 하기위해 일단 캐쉬가 남는 imageNamed을 사용.

게임에서 쓸려면 imageWithData를 사용해야합니다.


픽셀 데이터를 저장하기 위해 malloc으로 메모리생성 (489라인)

메모리생성 했으니 반납하는것도 안까먹기 (497,564라인)

아이폰 아이패드용 텍스쳐 로딩처리(491 ~ 521 라인)


OpenGL에서의 텍스쳐 생성과 옵션설정(525 ~ 552 라인)

간혹 필터링 설정을 안하는 샘플이 있는데(529,531 라인)

에뮬레이터에서는 잘되는데 디바이스에서는 안되는 경우가 많습니다.

필터링도 종류가 많으니 옵션을 바꿔가면서 직접 눈으로 확인하는게 좋습니다.

( GL_LINEAR는 고퀄리티 속도저하/ GL_NEAREST는 저퀄리티 속도상승 )


어드레싱에 대해선 다음번에 쓸 atlas에서 쓰기로 하고(536라인)


환경설정은 GL_MODULATE가 디폴트 설정에 사각형 색상 무시 텍스쳐 출력이고(543라인)

GL_DECAL을 사용하면 사각형의 색깔과 텍스쳐의 그림이 같이 출력됩니다.


알파채널을 사용하는 GL_RGBA를 사용하니 블렌딩을 유효화(547라인)


마지막으로 GPU에게 전송하면 텍스쳐를 사용할 준비가 끝납니다.(552라인)





6.텍스쳐 좌표 설정

레나는 왼쪽위에구석을 기준으로 256싸이즈로 출력(197라인)

아이콘은 왼쪽밑에구석을 기준으로 72싸이즈로 출력되게 수정.


저번에 귀찮아서 생략한 색상도 추가하고(230라인)

4개의 정점의 색깔을 흰색으로 수정.


이번에 텍스쳐출력을 위해 텍스쳐좌표를 새롭게 작성.(243라인)

텍스쳐싸이즈가 1024픽쎌이던 32픽쎌이던 1.0이 최대싸이즈 입니다.

이건 다음에 쓸 atlas에서 다시 설명하겠습니다.

텍스쳐도 알기쉽게 퀘변조로의 Z 의 순서로 작성합니다.

소스 코멘트에서도 적었듯이 좌표로 치자면 x,y를(244라인)

다이렉트X에서는 u,v로 쓰고

오픈쥐엘에서는 s,t로 쓰나 둘다 같은놈입니다.


좌표랑 색상쓰려고 했던것처럼 텍스쳐도 똑같이 해줍니다(282라인)


glEnable(GL_TEXTURE_2D)을 써서 텍스쳐를 사용할것이라는걸 알리고(286라인)

텍스쳐생성할때 사용하였던 glBindTexture()를써서 사용할 텍스쳐오브젝트를 선택합니다(289라인)

첨에 mTexture를 바인드해서 사각형을 출력하였고(레나)

그담음엔 mTexture2를 바인드해서 사각형을 출력하였습니다.(아이콘)


기본적으로 렌더링이 끝나면 이 메쏘드에서 렌더링할때 유효화했던 스테이트를 원래상태로 돌려줍니다.(300~305라인)





이걸루 간단하게 텍스쳐를 출력해보았습니다.


위에처럼 텍스쳐를 쭈욱사용할경우 glEnable(GL_TEXTURE_2D)를 

텍스쳐 로딩할때 한번만 써줘서 286라인 생략가능합니다.(블렌드처럼)

그리고 glEnableClientState도 텍스쳐 로딩끝나고 한번만 설정해주면

매번 다시 설정할 필요는 없습니다.


단, 다른곳에서 glDisable을 안할경우에 해당됩니다. ㅎ_ㅎ;


다음엔 간단 텍스쳐 atlas를 해볼랍니다;

+ Recent posts