Post

Cocos2d NULL 아니라 nullptr

1. cocos2dx null 체크

define 되어있는걸로 봐서는 NULL 0 이라서

이건 쓰면 안될 거 같은데;;; 하고 있다가 찾아보니

C++11부터는 nullptr 쓰면 된다고 적혀 있었음 ㅇㅇ

그래서 nullprt을 사용했다.

2. cocos2dx 한글 폰트 적용

1) visual studio 출력단에서 글자가 깨지는 경우.

이 경우에는 헤더, cpp 파일 인코딩이 다른 경우라 다른이름으로 저장-인코딩해서 저장- 유니코드 utf8로 변경해주면된다.

2) cocos2d System font를 사용하고 싶은 경우

#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#pragma execution_character_set("utf-8")
#endif

선언해두고 

createWithSystemFont 함수로 읽을 한글 폰트를 갖다놓는다.

text = Label::createWithSystemFont("한글폰트야 나와라!!!!", "fontname.ttf", 50);

 근데 생각해보니까...따로 fonts 폴더에 폰트 넣은 뒤에

폴더 경로를 지정을 안해줬는데 잘 읽히네?

왜죠?

난관은 내가 원하는 위치에 텍스트를 출력하는 건데

이게 생각보다 잘 안된다. 어느 디바이스든 고르게 잘 출력하고 싶은데 안돼...

좌표계 헷갈려 ㅠㅠㅠ살려줘ㅠㅠㅠㅠㅠ

Post

1. getVisibleOrigin 에서 가져오는 값이 뭘까?

auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();

출력해보니 Director::getInstance()->getVisibleSize();는 내가 지정한 해상도이다.

getVisibleOrigin()은 뭔지 잘 모르겠다. 코드보니 scale 사용하고 어쩌구 있는데 잘 모르겠으니

패스당...(할게 너무 많아ㅠㅠ)

visibleSize.width: 400.000000 height: 800.000000 origin x: 0.000000 y: 0.000000

Post

c++ 알 수 없는 재정의 지정자입니다

c++ 알 수 없는 재정의 지정자입니다라는 에러가 떴다.

Size test;

라고 헤더에 선언하고 그대로 cpp에서 사용하는데 말이다.

class가 cocos2d::Layer 상속받고 있었는데 설마 cocos2d::Layer 안에 test라는 변수가 있겠냐고....

근데도 계속 c++ 알 수 없는 재정의 지정자입니다 라는 에러가 떴다ㅠㅠ

당연히 이름이 틀릴리는 없고....

그래서 혹시나 싶어 test 변수를 사용하는 곳에 마우스를 갖다대니 <error-type>이라는 팁창이 떴다.

Size가 어느 class에 Size인지 인지를 하지 못한 모양.

보니까 내가 USING_NS_CC; 라고 선언을 안해봐서

어디의 Size 클래스 명을 쓰는 건지 알 수 없던 모양이었다.

USING_NS_CC; 추가하고 해결.

아니면 Size에 namespace를 추가해도 해결된다.

Post

CallFunc::create 함수에서 CC_CALLBACK_0 매크로 인자로 원하는 인수 넘기기

CallFunc::create에 콜백함수를 등록하면서 내가 원하는 인자를 전달하고 싶었는데 자꾸 에러가 났다.

	spr->runAction(Sequence::create(
		DelayTime::create(0.1),
		CallFunc::create(CC_CALLBACK_0(HelloWorld::test, this)), NULL));

에러는 인수가 맞지 않다는 것ㅠㅠ

확인해보니 CallFunc::create 함수 선언이

CallFunc * CallFunc::create(const std::function<void()> &func)

const std::function<void()>, 인수가 없는 void return 함수만 받기 때문에 에러가 나는거라고 파악했다.

그래서 검색해보니까

#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)

##__VA_ARGS__ 부분에 내가 함수로 넘기고 싶은 값을 넘기라고 ㅇㅇ

한참헤맸네ㅠㅠㅠ

코코스 어려워ㅠㅠㅠㅠㅠㅠㅠㅠ

그리고 내 미천한 c++ 실력으로는 독해가 안된다...c++ 11 공부한 적 없어서 힘들다....ㅠㅠ

게다가 자잘한 버그가 벌써부터 눈에 띈다ㅠㅠ

하 어떻게 해야하는거?? 코코스... 정말 가시밭길이구나...

 

Post

cocos2d-x에서 에러나는 것들 수정한 기록

cocos2d-x 에러 수정하기

 

1. Image 안불러와지는 에러.

내 첫번째 test프로젝트가 image를 분명히 추가했는데 찾지를 못하는 에러가 발생했다.

지금보니까 2번 에러 때문인듯. 아무튼 프로젝트 꼬인거 같아서 삭제하고 새로 프로젝트 만듬.

2. CC_FORMAT_PRINTF 에러

내가 넣은 image를 처음에는 잘 불러왔는데 이것저것 테스트를 하다보니 에러가 뜨더니 안된다???

찾아보니 오류 목록 뜨는 하단 창에 빌드전용+inteliSence라고 박스가 있는데 그걸 빌드 전용으로 바꿔주면 된다고 한다.

그러니까 에러는 사라졌는데 여전히 이미지는 바뀐이미지가 적용이 안됨...왜죠?

3. Image 추가 및 그리기

뭔지 모르겠는데 한번 Resources에 추가한 Image는 삭제해도 프로젝트 상에 그대로 남아있다.

그 일례로 Resources 폴더에서 이미지를 삭제하기도 했는데 계속 읽어서 그림을 그림.

그 때문에 a라는 이미지는 평생 a라는 이미지이고, 다른 이미지를 a라고 바꿔도 그 이미지가 안불러와짐;;;

(이건 좀 크리티컬한데;;;)

이부분은 cocos2d Image 사용법을 한번 봐야할 것 같다.

아무튼 Images/TestImage3.png 위치에 이미지를 추가하면 잘 불러와진다.

auto sprite3 = Sprite::create("Images/TestImage3.png");
if (sprite3 == nullptr) {
 	problemLoading("'Images/TestImage3.png'");
}
else {
	sprite3->setAnchorPoint(Vec2(0, 0));
    sprite3->setPosition(Vec2(0, 0));
    this->addChild(sprite3, 0);
}

 

Post

Cocos2d Anchor 좌표 설정(with cocos2d 기본 프로젝트)

cocos2d 좌표계는 위와 같다.

왼쪽 하단이 (0,0)이다. 그리고 오른쪽으로 갈수록 x좌표의 값이 늘어나며

마찬가지로 위로 갈수록 y좌표의 값이 늘어난다.

즉 (100, 50) 이라고 한다면 왼쪽으로 100, 위로 50 올라간 위치에 그림이 그려진다고 생각하기 쉽다.

여기서 실제로 (10, 10) 좌표로 그려주게 되면 어떻게 될까?

우리가 생각한대로 (10,10) 좌표에 그려지지 않는다. 좀 어긋나 있을 것이다.

바로 앵커값 때문이다.

앵커는 그림을 그리는 기준점이다.

예를 들어 좌표계만 보면 480, 320에 그림을 그려주게 만들면 화면 밖에다 그려줄거라고 생각하기 쉽다.

왜냐하면 최대 너비가 480이고 높이가 320인데 거기서부터 그림을 그린다고 생각하기 때문이다.

하지만 실제로는 4분의 1정도의 이미지가 그려진다. 

cocos2d 는 앵커의 위치를 기준으로 그려서 화면에 그려질 수도 있수도 있고 아닐 수도 있기 때문이다.

앵커가 0, 0일 경우 왼쪽 하단, 1,0 일 경우 오른쪽 하단

0,1일 경우 왼쪽 상단, 1,1일 경우 오른쪽 상단을 기준으로 잡고 그림을 그려준다.

앵커 0, 0 위치 10, 10일 때 좌표계에서 10, 10씩 만큼 떨어진 위치에서 좌하단을 기준으로 네모를 그려준다.

sprite->setAnchorPoint(Vec2(1, 0));

앵커 위치를 1, 0으로 그려주면 좌상단이 기준이 되므로 아래와 같이 그려진다.

이로써 기본 앵커는 딱 그림의 중앙(0.5, 0.5)이라는 걸 알 수 있다.

sprite->setAnchorPoint(Vec2(0.5, 0.5));

그래서 앵커를 중앙으로 변경하면 처음 프로젝트를 실행했을때와 비교해 변화가 없는 것을 알 수 있다.

그리하여 왜 기본 프로젝트 소스코드에서 이미지 좌표를 줄 때

x값을 전체 너비에서 2를 나눔 하는지 알 수 있다.

sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

이미지 앵커의 기준은 정중앙이기 때문에 반으로 자르면 자동스레 중앙정렬이 되는 것이다.

 

Sprite 생성

    auto sprite = Sprite::create("HelloWorld.png");
    if (sprite == nullptr)
    {
        problemLoading("'HelloWorld.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }

함수 이름만 봐도 직관적이다.

Sprite::create에 이미지 이름을 적고 setPosition으로 위치를 정해준다.

그 후 Sceen에 자식으로 붙여준다. 그게 끝이다.

화면을 확대할 수 도 있다.

this->setPosition(200, 200);

this는 현재 HelloWorldScene.cpp 이다.

화면을 setPosition해주면 화면을 딱 200, 200포지션만큼만 이동하고 자식도 따라 이동한다.

그러니까 100, 0일 때 더 정확히 확인할 수 있는데

부모Sceene이 x좌표 100이동한 상태에서 자식이 0, 0을 그리면

부모Sceene이 x좌표 0인 상태보다 자식들의 x좌표가 100이 이동된 것이다.

Post

cocos2d github에서 cpp-tests 폴더 안에 있는 샘플들은 공부하는데 꽤나 유용해보였다.

그래서 이 샘플 가지고 공부를 하기로 결정!

cocos2d github cpp-tests 프로젝트 빌드 파일 실행하기

cocos2d-x-4\cocos2d-x-4\tests

다운받은 코코스 파일 안에 테스트 파일 있는 거 확인(tests폴더)

그래서 해당 프젝을 옮겨서 cmake로 빌드 파일 만들려고 하니까 에러가 난다.

H:\CocosProject\cpp-tests\build>cmake . -G "Visual Studio 17 2022" -A Win32
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
CMake Error at CMakeLists.txt:17 (include):
  include could not find requested file:

    CocosBuildSet


CMake Error at CMakeLists.txt:18 (add_subdirectory):
  add_subdirectory given source "H:/CocosProject/cpp-tests/../../cocos" which
  is not an existing directory.


CMake Error at CMakeLists.txt:403 (setup_cocos_app_config):
  Unknown CMake command "setup_cocos_app_config".


-- Configuring incomplete, errors occurred!

H:\CocosProject\cpp-tests\build>

관련해서 검색해보니까 같은 이슈 발견

https://github.com/cocos2d/cocos2d-x/issues/18696

 

Missing Cmake references · Issue #18696 · cocos2d/cocos2d-x

Hi! I'm trying to build a cocos2d-x3.17 project on Ubuntu 16.04. What I did: > git clone --recursive https://github.com/cocos2d/cocos2d-x. > cd cocos2d- > python download-deps. > git submodule upda...

github.com

Modules 에 있는 CocosBuildSet.cmake를 복사하라고 한다.

일단 기본프로젝트는 실행이 잘되어서 기본프젝에서 cocosBuildSet 위치를 검색해봤더니

test(프젝)\cocos2d\cmake\Modules에 존재한다.

\test\cocos2d 폴더를 통째로 cpp-tests 폴더에 복사했다.

근데 안된다. 그래서 빌드되는 프로젝트 CMakeLists.txt 와 안되는 프로젝트 CMakeLists.txt의 차이점을 비교함.

cocosBuildSet를 못찾는 거 보니 둘의 기본 경로가 다른 거 같음.

그리고 역시나 경로가 달랐음.

test프로젝트: set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cocos2d)

cpp test 프로젝트: set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..)

그래서 CMakeLists 복사본 만들고 위치를 test프로젝트처럼 수정.

그러니까 sln 프로젝트 파일 만들어짐!!!! 성공 ㅠㅠㅠㅠㅠㅠ

근데 빌드하니까 에러 발생...

그런데 에러들을 보니까...함수 인자 갯수가 맞지 않는다고 하는 걸 보니

이거 설마 최근 함수 적용이 안된건가 싶다;;;끄으응;;;;

이 프로젝트는 그래도 simple sample이 많은 거 같아서 꼭 돌려보고 싶었는데...;;;;

전부 최신화 시켜줘야 돌아가는건가 싶다;; 일단 보니까 빌드 실패해서 exe파일도 bin 폴더에 안만들어져있음.

(수정중)

일단 에러 하나하나 뜯어보기로 했음

에러 목록

1. 'spine/Debug.h'


오류 C1083 포함 파일을 열 수 없습니다. 'spine/Debug.h': No such file or directory

 일단 쓰는 곳이 없어서 주석 처리.

Label::createWithBMFont("fonts/geneva-32.fnt", "And this is Geneva", TextHAlignment::LEFT, 0, Rect(0, 128, 0, 0));

일단 createWithBMFont 함수 레퍼런스 찾아봄.

https://docs.cocos2d-x.org/api-ref/cplusplus/v4x/db/de4/classcocos2d_1_1_label.html#ab9d3a60682e0d77312e2f154a2840647

 

Cocos2d-x: Label Class Reference

Label is a subclass of Node that knows how to render text labels. More... Inherits Node, LabelProtocol, and BlendProtocol. Inherited by TextFieldTTF. virtual void setString (const std::string &text) override  Sets the text that this Label is to display.

docs.cocos2d-x.org

static Label* createWithBMFont ( const std::string &  bmfontPath,
    const std::string &  text,
    const TextHAlignment  hAlignment = TextHAlignment::LEFT,
    int  maxLineWidth = 0,
    const Vec2  imageOffset = Vec2::ZERO 
  )

Allocates and initializes a Label, with a bitmap font file.

Parameters

bmfontPath A bitmap font file, it's a FNT format.
text The initial text.
hAlignment Text horizontal alignment.
maxLineWidth The max line width.
imageOffset  

ReturnsAn automatically released Label object.See alsosetBMFontFilePath setMaxLineWidth

 

Cocos2d-x: Label Class Reference

Label is a subclass of Node that knows how to render text labels. More... Inherits Node, LabelProtocol, and BlendProtocol. Inherited by TextFieldTTF. virtual void setString (const std::string &text) override  Sets the text that this Label is to display.

docs.cocos2d-x.org

5개 인자라서 false 빼주고 rect 대신 vector 해줌. 어차피 밑에서 벡터 set해주길래 그냥 0, 0으로 넣음. 그리고 어차피 실행이 목적이라 아무 값이나 넣거나 주석 처리 ㄱㄱ

auto label2 = Label::createWithBMFont("fonts/geneva-32.fnt", "And this is Geneva", TextHAlignment::LEFT, 0, Vec2(0, 0));

그랬더니 오류 133개가 튀어나왔다 아...........

으앙...더해보고 안되면 뭐 레퍼런스나 다른 프로젝트 참고를 해야겠어ㅠㅠ

근데 일단 에러나는 파일을 보면

SpineTest.h

SpineTest.cpp

CCConsole.h

ccUTF8.h

이 4개라서 이걸 제외하기로 결정. 일단 CCConsole.h, ccUTF8.h는 하나씩만 에러가 나고

몇백개 대부분 에러는 SpineTest.h, SpineTest.cpp에서 발생.

그래서 SpineTest.h, SpineTest.cpp 사용하는 부분 싹 다 주석처리.

갹!!!성공!!!!

다양한 예제가 있었다.

그리고 이제 또 분석하면 된다...

버그해결>분석>버그해결>분석>버그해결>분석

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

Post

cocos-2d 4.0 visual studio 실행

지난번 이야기.

https://dramadramingdays.tistory.com/370

 

cocos-2d 4.0 설치 방법

cocos2d 설치 과정 1. python 설치 cocos-2d는 파이썬2를 지원한다고 한다. 그러므로 먼저 자신의 컴퓨터에 깔린 파이썬 버전을 체크해야한다. cmd를 켜고 python 이라고 명령어를 치면 현재 파이썬 버전을

dramadramingdays.tistory.com

cmake로 빌드 프로젝트 생성하고 visualstudio2022에서 빌드를 했는데...

과연 결과는?

에러입니다!

빌드 실패는 없었는데 왜죠?

근데 test.exe는 잘 만들어졌고 실행도 잘된다......

뭐가 문제죠?

확인해보니 시작프로젝트를 ALL_BUILD가 아니라 현재 프로젝트(나같은 경우는 test)로 바꾸어주어야한다고 한다.

그리고 드디어 성공

(잘못하면 프로젝트 디버그 path, 링커까지 볼 번 했는데 다행이다 ㄷㄷㄷ)

cocos2d 왤케 무섭게 생김 ㄷㄷㄷ

아무튼 cocos2d 오랜만에 봤는데 다들 유니티 써서 커뮤니티 거의 공멸수준ㅠㅠ

c++ 너모 싫고 포인터 너모 싫은데 일단해보고

안되면 flutter해보던가...(하지만 flutter의 그 생소한 문법이 싫어 dart는 그럭저럭이겠지만

자꾸 return 하고 감싸주고??? 그거 너무 이해가 어려움 ㅠㅠ)

아무튼 일단 해보자...하하하ㅏ아항하아하

 

컴파일 속도 단축에 대해서도 찾았다.

게임엔진은 이미 완성되어있기에 오른쪽 창에 최상위 프로젝트 선택후 속성에 들어가서 라이브러리들을 빌드 해제해주면 빌드 속도가 빨라진다고 한다.

https://blog.naver.com/PostView.naver?blogId=soulumsword_kim&logNo=221729691455&parentCategoryNo=184&categoryNo=&viewDate=&isShowPopularPosts=true&from=search

 

[cocos2d-x 3.17.2] 설치 및 신규 프로젝트 생성하기

본 포스팅에서는 cocos2d-x를 본격적으로 사용하기에 앞서서 개발환경을 구축하는 순서에 대해 설명하고자 ...

blog.naver.com

 

 

cocos2d 참조하면 좋은 문서들

cocos2d 문서

https://docs.cocos.com/cocos2d-x/manual/en/about/getting_started.html

 

About Cocos2d-x · GitBook

Where to get Cocos2d-x and what do I get? You can clone the GitHub Repo and follow the steps in the README. You can also download as part of the Cocos package on our download page. No matter if you choose to develop in C++, JavaScript or Lua, everything yo

docs.cocos.com

cocos2d 레퍼런스

https://docs.cocos2d-x.org/api-ref/cplusplus/v4x/

 

Cocos2d-x: cocos2d-x

About cocos2d-x cocos2d-x open source project is designed to be a cross-platform 2D game engine for building 2D games, demos and other graphical/interactive mobile applications. It runs on top of OpenGL 2.0 and OpenGL ES 2.0 and is written in C++. This pro

docs.cocos2d-x.org

cocos2d github

https://github.com/cocos2d/cocos2d-x

cocos2d 튜토리얼

https://gamefromscratch.com/cocos2d-x-c-game-programming-tutorial-series/

cocos2d 샘플 프로젝트

https://docs.cocos2d-x.org/cocos2d-x/v4/en/installation/Windows.html

 

Windows · GitBook

No results matching ""

docs.cocos2d-x.org

Cocos2d-x 4에서 바뀐 함수 이름 등등... 변경점 적혀있음

https://docs.cocos2d-x.org/cocos2d-x/v4/en/apichange/api_change_v4.html

cocos2d-x 포럼

https://discuss.cocos2d-x.org/

 

Cocos Forums

Cocos Official Forums

discuss.cocos2d-x.org

 

▲ top