2012-06-22 2 views
0

iOS/Kobold2d 프로젝트에서 CCBigImage를 사용 중입니다. 스프라이트가 너무 커서 한 번에로드 할 수 없기 때문입니다. 응용 프로그램을 실행할 때 CCBigImage에 PLIST 파일을로드 할 때 불행하게도 그것은왜 "CCTextureCache + CCBigImageExtensions"가 내 Kobold2D 프로젝트에 링크되어 있지 않습니까?

ERROR: Uncaught exception -[CCTextureCache 
addImageFromAnotherThreadWithName:target:selector:]: unrecognized 
selector sent to instance 0xa17d010 

으로 중지합니다.

CCBigImage* bg = [CCBigImage nodeWithTilesFile:@"bg1dot5.plist" tilesExtension: @"pvr.ccz" tilesZ: 0] 

은 CCBigImage load()를 호출합니다. 이 메서드는 결국 지정된 예외를 발생시키는

[CCTextureCache sharedTextureCache] addImageFromAnotherThreadWithName: _imageName 
                   target: self 
                  selector: @selector(loadedTexture:) 

을 호출합니다. "CCTextureCache + CCBigImageExtensions.h"를 CCBigImage를로드하는 소스 파일에 임포트하여 주어진 선택기가 CCTextureCache에 추가 될 것으로 예상했지만 실제로는 그렇지 않습니다.

저는 Kobold2d 1.1.0 및 XCode 4.3.3 (모든 최신 버전)을 사용하고 있습니다. 그 선택자를 포함시키기 위해서 내가해야 할 일이 있습니까?

나는 또한 내가 확장 헤더 파일을 포함하지만 같은 예외가 나는 CCBigImage를로드 할 때와 같이 occures로

[[CCTextureCache sharedTextureCache] addImageFromAnotherThreadWithName:@"" target:nil selector:nil]; 

가 직접 프로젝트가 잘 컴파일했다.

답변

2

Objective-C 범주가 포함 된 정적 라이브러리는 iOS 응용 프로그램과 강제 연결되어야합니다 (Mac 응용 프로그램에는이 문제가 없습니다). 그렇지 않으면 범주 메서드를 확인할 수 없으며 설명한 오류가 발생합니다. More info here.

특히 Kobold2D에서 -all_load 플래그를 사용하지 않는 것이 좋습니다. 이렇게하면 앱에서 사용할 수없는 모든 코드를 맹목적으로 앱에 연결할 수 있습니다. 기본적으로 링커는 눈이 멀고 어리석은 짓이며 앱 크기는 수십 메가 바이트까지 커집니다.

향후 Kobold2D 버전에서 cocos2d 확장의 강제 연결을 추가 할 예정입니다. 지금은 BuildSettings 그룹의 Kobold2D-Libraries 프로젝트의 Xcode에서 FrameworksAndLibraries.xcconfig 파일을 편집해야합니다.

프레임 워크/라이브러리가 강제로드 어디에 섹션을 찾습니다

LINK_WITH_ADMOB = $(KKLIBROOT)/GoogleAdMobAdsSDK/libGoogleAdMobAds.a 
FORCE_LOAD_COCOS2D = -force_load "$(BUILT_PRODUCTS_DIR)/libcocos2d-ios.a" 
FORCE_LOAD_KOBOLD2D = -force_load "$(BUILT_PRODUCTS_DIR)/libkobold2d-ios.a" 
FORCE_LOAD_KOBOLDSCRIPT = -force_load "$(BUILT_PRODUCTS_DIR)/libkoboldscript-ios.a" 
FORCE_LOAD_KOBOLDSCRIPTWRAPPER = -force_load "$(BUILT_PRODUCTS_DIR)/libkoboldscriptwrapper-ios.a" 
FORCE_LOAD_ISIMULATE = -force_load "$(KKLIBROOT)/iSimulateSDK/libisimulate-4.x-opengl.a" 
FORCE_LOAD_COCOS3D = -force_load "$(BUILT_PRODUCTS_DIR)/libcocos3d-ios.a" 

KKFW_IOS = $(KKFW_SysConfig) $(KKFW_AVFoundation) $(KKFW_CoreGraphics) $(KKFW_CoreLocation) $(KKFW_MediaPlayer) $(KKFW_OpenGLES) $(LINK_WITH_ADMOB) $(FORCE_LOAD_KOBOLD2D) $(FORCE_LOAD_KOBOLDSCRIPT) $(FORCE_LOAD_KOBOLDSCRIPTWRAPPER) $(FORCE_LOAD_COCOS2D) 

지금이 모든에합니다 (적인 Cocos2D-확장 라이브러리를 -force_load하기 위해 "KKFW_IOS = ..."줄 전에 다른 FORCE_LOAD_ ... 항목을 추가

FORCE_LOAD_COCOS2D_EXTENSIONS = 
      -force_load "$(BUILT_PRODUCTS_DIR)/libcocos2d-extensions-ios.a" 

는 그런 다음 "KKFW_IOS = ..."줄의 끝에 새로운 FORCE_LOAD_COCOS2D_EXTENSIONS 항목을 추가() 가독성을 위해 축약 :

012 일 개 라인은 그냥 읽기 쉽도록 줄 바꿈)를 추가
KKFW_IOS = $(KKFW_SysConfig) … $(FORCE_LOAD_COCOS2D_EXTENSIONS) 

이렇게하면 문제가 해결되어 CCBigImage 카테고리 메소드를 사용할 수 있습니다.

+0

단케! 매력처럼 작동합니다. –

+0

최신 Kobold2D 버전을 다운로드했는데이 줄이 주석 처리되어 있으며 줄의 주석 처리가 제거되면 다른 오류가 발생합니다. 그리고 그 라인의 주석을 풀 때 또 다른 컴파일러 오류가 발생하고, 그렇지 않을 경우 위의 오류가 발생합니다. 나는 XCode 4.5를 사용하고있다. 내가 누락 된 것이 있습니까? – bobmoff