[iOS - cos2d - X 게임 개발 의 5] 게임 에 저 장 된 Cocos2dX 자체 CCUserDefault 류 에 대한 상세 한 설명;

이 사이트 이화 명 히 미 오리지널, 전재 는 반드시 뚜렷 한 곳 에 표시 해 야 한다.
에서 옮 겨 싣 기 [흑 미 GameDev 거리] 원본 링크: http://www.himigame.com/iphone-cocos2dx/653.html
 
이 편 은 Cocos2dX 에 저 장 된 저장 소 를 공유 하 는데 그 중에서 도 세부 적 으로 실수 하기 쉬 운 문 제 를 소개 합 니 다.
Cocos2dX 에서 자체 저장 소 클래스 를 제공 합 니 다: CCUserDefault ,물론 여기 서 하 이 미 는 데이터 양 이 많 으 면 SQL 저장 소 를 사용 하 는 것 이 좋 습 니 다. 또한 주의해 야 할 것 은 가능 한 한 Cocos2dX 에서 플랫폼 과 관련 된 api 를 사용 하여 개발 하지 않 는 것 입 니 다. 예 를 들 어 Xcode 는 Cocos2dX 를 사용 하여 게임 을 개발 할 때 iOS 의 컨트롤/구성 요 소 를 프로젝트 에 사용 하 는 것 입 니 다.그러면 안 드 로 이 드 등 플랫폼 에 이식 할 때 매우 힘 들 것 입 니 다. 정상 적 인 운행 도 불가능 할 것 입 니 다. 다른 플랫폼 에 iOS 의 이러한 컨트롤 이 있 을 수 없 기 때문에 있어 도 바 텀 이 다 를 것 입 니 다!다시 말 하면 신마 기능 은 모두 Cocos2dX api 를 사용 하여 이 루어 집 니 다. 가능 한 한 X 에 접근 하 세 요. 그래서 이곳 의 저장 소 는 저도 X 자체 의 CCUserDefault 를 사용 합 니 다.적어도 Cocos2dX 자체 가 가지 고 있 는 크로스 플랫폼 에 대한 지원 이 좋 을 것 입 니 다.
본론 으로 들 어가 면 먼저 이런 종류의 API 를 대체적으로 소개 합 니 다.
   
   
   
   
  1. Public Member Functions 
  2.   
  3.     ~CCUserDefault () 
  4. bool    getBoolForKey (const char *pKey, bool defaultValue=false
  5.     Get bool value by key, if the key doesn't exist, a default value will return
  6. int     getIntegerForKey (const char *pKey, int defaultValue=0) 
  7.     Get integer value by key, if the key doesn't exist, a default value will return
  8. float   getFloatForKey (const char *pKey, float defaultValue=0.0f) 
  9.     Get float value by key, if the key doesn't exist, a default value will return
  10. double  getDoubleForKey (const char *pKey, double defaultValue=0.0) 
  11.     Get double value by key, if the key doesn't exist, a default value will return
  12. std::string     getStringForKey (const char *pKey, const std::string &defaultValue=""
  13.     Get string value by key, if the key doesn't exist, a default value will return
  14. void    setBoolForKey (const char *pKey, bool value) 
  15.     Set bool value by key. 
  16. void    setIntegerForKey (const char *pKey, int value) 
  17.     Set integer value by key. 
  18. void    setFloatForKey (const char *pKey, float value) 
  19.     Set float value by key. 
  20. void    setDoubleForKey (const char *pKey, double value) 
  21.     Set double value by key. 
  22. void    setStringForKey (const char *pKey, const std::string &value) 
  23.     Set string value by key. 
  24. void    flush () 
  25.     Save content to xml file. 
  26. Static Public Member Functions 
  27.   
  28. static CCUserDefault *  sharedUserDefault () 
  29. static void     purgeSharedUserDefault () 
  30. static const std::string &  getXMLFilePath () 

 
이상 에서 CCUserDefault 의 사용 과 기능, 해시 표 구조, Key - Value, key 색인 Value 값 을 한눈 에 볼 수 있 습 니 다.
제 공 된 저장 소 는 모두 기본 형식 입 니 다. bool, int, string, double, float, 방법 은 쉽게 알 수 있 습 니 다. set 를 저장 하고 get 을 가 져 옵 니 다.  !
 
   
   
   
   
  1. //  
  2.     CCUserDefault::sharedUserDefault()->setStringForKey("key""himi"); 
  3.     CCUserDefault::sharedUserDefault()->flush();// , xml , value 。 
  4.     // string  
  5.     string str= "wahaha"
  6.     // himi, str ; 
  7.     str= CCUserDefault::sharedUserDefault()->getStringForKey("key"); 
  8.     CCLog(" str=:%s",str.c_str()); 

여기 주의 하 세 요.   CCUserDefault 에 하나 있어 요. flush () 의 함수 입 니 다. 이것 은 데 이 터 를 xml 파일 에 기록 하 는 데 사 용 됩 니 다. 즉, setXX 의 일부 함 수 를 사용 한 후에 제출 하 십시오 (flush 함 수 를 호출 하 십시오).
그러면 마지막 으로 static 방법 에서 CCUserDefault 류 가 shared UserDefault 를 인터페이스 로 개발 자 에 게 사용 하도록 남 겨 놓 은 것 을 볼 수 있 습 니 다. 그러면 대충 소개 한 다음 에 코드 검증 을 몇 단계 작성 하 겠 습 니 다.
OK, 다음은 콘 솔 입력 의 결과 입 니 다.
   
   
   
   
  1. Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0 
  2. Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies 
  3. Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543 
  4. Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2 
  5. Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096 
  6. Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16 
  7. Cocos2d: cocos2d: GL supports PVRTC: YES 
  8. Cocos2d: cocos2d: GL supports BGRA8888 textures: NO 
  9. Cocos2d: cocos2d: GL supports NPOT textures: YES 
  10. Cocos2d: cocos2d: GL supports discard_framebuffer: YES 
  11. Cocos2d: cocos2d: compiled with NPOT support: NO 
  12. Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO 
  13. Cocos2d:  str=:himi 

마지막 문장 은 우리 의 저장 에 문제 가 없다 는 것 을 검 증 했 습 니 다. 그러면 우 리 는 지금 xml 에 존재 하 는 지 검증 합 니 다. 먼저 현재 실행 중인 항목 을 중단 한 다음 에 방금 코드 를 삭제 하고 다음 코드 를 교체 합 니 다.
1 CCLog( " str=:%s" ,CCUserDefault::sharedUserDefault()->getStringForKey( "key" ).c_str());
그리고 이 항목 을 다시 실행 합 니 다. 관찰 콘 솔 인쇄 는 다음 과 같 습 니 다.
 
   
   
   
   
  1. Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0 
  2. Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies 
  3. Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543 
  4. Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2 
  5. Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096 
  6. Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16 
  7. Cocos2d: cocos2d: GL supports PVRTC: YES 
  8. Cocos2d: cocos2d: GL supports BGRA8888 textures: NO 
  9. Cocos2d: cocos2d: GL supports NPOT textures: YES 
  10. Cocos2d: cocos2d: GL supports discard_framebuffer: YES 
  11. Cocos2d: cocos2d: compiled with NPOT support: NO 
  12. Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO 
  13. Cocos2d:  str=:himi 

 
방금 키 -> 키 를 통 해 "himi"라 는 문자열 을 정상적으로 얻 었 습 니 다. OK, 모니터링 에 문제 가 없습니다.
그러면 일반적인 상황 에서 저 희 는 현재 프로젝트 에 데 이 터 를 저장 하 는 xml 파일 이 존재 하 는 지 여 부 를 판단 하 는 방법 이 필요 합 니 다. 그러면 Himi 는 Cocos2dX 기본 소스 코드 에 이런 방법 이 있 지만 개발 자 에 게 제공 되 지 않 았 습 니 다. 이 함 수 는 private 에 의 해 사유 화 되 었 기 때문에 이 함수 소스 코드 는 다음 그림 과 같 습 니 다.
 
 
 
   
   
   
   
  1. .h : 
  2. bool isHaveSaveFile(); 
  3.   
  4. .cpp : 
  5. // xml  
  6. bool HelloWorld::isHaveSaveFile(){ 
  7.     if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml")) 
  8.     { 
  9.         CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml"true); 
  10.         CCUserDefault::sharedUserDefault()->flush();//  
  11.         //        CCLog(" , "); 
  12.         return false
  13.     }else
  14.         //        CCLog(" "); 
  15.         return true
  16.     } 

비고: 데 이 터 를 저장 하 는 xml 이 존재 하지 않 을 때 데 이 터 를 처음 저장 할 때 기본적으로 생 성 됩 니 다. 경 로 는 app 아래 documens 입 니 다. 다음 그림 과 같 습 니 다.
       그렇다면 하 이 미 는 데이터 xml 가 존재 하 는 지 확인 하 는 함 수 를 사용자 정의 하여 사용 할 수 있 습 니 다.(알림: 많은 어린이 신발 을 말 해 야 합 니 다. 왜 소스 코드 를 직접 수정 하지 않 고 Public 를 사용 하지 않 습 니까?! 사실 Himi 도 그렇게 생각 합 니 다. 하지만 후기 에 새로운 Cocos2dX 버 전 을 사 용 했 거나 동료 기계 의 Cocos2dX 가 소스 코드 를 이렇게 수정 하지 않 았 다 면 오류 가 발생 할 수 있 습 니 다. 반대로 판단 하 는 방법 을 쉽게 쓸 수 있 는데 굳이 움 직 일 필요 가 있 습 니까? 하하!)
 
 그러면 여기 Himi 가 강조 하 는 점! 여러분 은 setXX 함수 의 매개 변 수 를 주의해 야 합 니 다. 예 를 들 어 다음 과 같은 함수:
setStringForKey (const char *pKey, const std::string &value)
첫 번 째 매개 변 수 는 const char * 유형 이지 string 이 아니다!!! (Himi 는 이 때문에 많은 시간 을 낭비 하고 비극 적 이다.)
Himi 는 다음 과 같은 코드 를 저장 하여 오 류 를 일 으 켰 습 니 다. 다음 과 같 습 니 다.
1 CCUserDefault::sharedUserDefault()->setStringForKey( "" +823, sKey);
오류 캡 처 는 다음 과 같 습 니 다. (저 장 된 key 가 경로 가 되 었 습 니 다.....................................................
   아, 답답 해 요. 여기 Himi 가 실 수 를 했 어 요. 어린이 신발 들 이 더 이상 실 수 를 범 하지 않 았 으 면 좋 겠 어 요. 그 전에 Himi 는 itoa 를 찾 아 함 수 를 찾 으 려 고 했 지만 도저히 찾 을 수가 없어 요! (c++ 있어 야 지.×××문자열 돌리 기), 그러나 Cocos2dX 에는 없 으 며, 마지막 으로 Himi 는 Cocos2dX 엔진 에서 실현 되 는 itoa 의 원본 코드 를 사 용 했 습 니 다. 다음 과 같 습 니 다.
Cocos2dX 가 자체 적 으로 가지 고 있 는 이 CCUserDefault 는 암호 화 된 것 이 아니 라 명문 이 며 xml 형식 이기 때문에 후속 Himi 는 base 64 를 사용 하여 암호 화 된 글 을 쓸 준 비 를 하고 있 습 니 다.
본편×××:
  SaveDataForCocos2dx.zip (667 바이트, 1 회)
 
 

좋은 웹페이지 즐겨찾기