SlideShare a Scribd company logo
어쩌다보니
Cocos2d-x 사용하게 된 이야기
작성자 : 쪼꼬두유
소속 : Netmarble N2(모두의 마블 카카오파트)
발표일 : 2016. 02. 20
Cocos2d - X
12
3
Cocos2d-x12
1
기원
기본적으로는 Cocos2d의 연장선상
Cocos2d는 기본적으로 IOS에서 사용하는 Objective-C 로 작성
Cocos2d-x는 범용성이 좋은 C++로 포팅해서 여러 플랫폼을 지원
하도록 만든 라이브러리형 엔진
4
Cocos2d-x12
1 Python 설치
2 NDK 설치
3 SDK 설치
4 Cocos2d-x 설치
5
Cocos2d-x12
6
Cocos2d-x12
7
Cocos2d-x12
8
Cocos2d-x12
Cocos2d-x
Scene
Unity3d
Scene
Layer Layer
Node GameObject
9
Cocos2d-x12
Cocos2d-x
1
CCDirector
Unity의 GameManager같은 애
기본적으로 Unity는 GameManager를
제공하지 않지만 Cocos2d-x 는 제공함
화면을 띄우거나 앱을 Pause 하거나
Resume등의 기능이 있다
10
Cocos2d-x12
Cocos2d-x
1
CCScene
Unity의 Scene과 비슷
하나의 Scene은 여러 개의 Layer를 참조
11
Cocos2d-x12
Cocos2d-x
1
CCLayer
Unity에서는 딱히 부르는 개념은 없는듯
하나의 묶음으로 묶어서 관리 함
Layer에 어떤 행동을 가하면
다 같이 적용 받음.
12
Cocos2d-x12
Cocos2d-x
1
CCNode
Unity의 GameObject
대부분의 클래스는 Node를 상속 받고
Node는 Ref 함수를 상속받아 메모리 관
리를 해준다.
1 Sprite
2 Label
3 MenuItem
4 AtlasNode
5 Camera
6 Light
7 ParticleSystem
8 Skybox
9 Sprite3D
10 Terrain
11 SpriteBatchNode
13
Cocos2d-x12
1
기본좌표계
보통 다른 2d 엔진은 왼쪽 위가 기준점
Cocos2d-x는 왼쪽 아래
이유는 OpenGL 기반이기 때문
OpenGL은 왼쪽 아래가 기준점
14
Cocos2d-x12
1
앵커 포인트(Anchor)
화면 출력 기본 기준점
Cocos2d-x의 default는 가운데
Node->setAnchorPoint(Point(x, y))
이런식으로 사용
15
Cocos2d-x12
1
Sprite & Texture
Image는 두가지 방식으로 만들 수 있는
데 Texture방식과 Sprite방식으로 만들
수 있다.
Texture는 불러온 이미지를 변경할 수
없지만 Sprite는 이미지를 변경할 수
있다.
16
Cocos2d-x12
1
Label
Text를 출력하기 위한 방법
SystemFont, 외부 폰트파일, BM폰트
(이미지폰트와 좌표정보를 가진 파일로
이루어짐), CharMap(이미지폰트)로
만들수 있다
17
Cocos2d-x12
1
Menu
Button을 Cocos2d-x에서는 메뉴라고
부르고 Menu는 Menu를 구성하는
MenuItem으로 이루어져 있다.
MenuItem은 Label Sprite 등으로 만
들 수 있다.
18
Cocos2d-x12
Cocos2d-x Menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//메뉴 버튼 스프라이트
auto play_normal = Sprite::create("6/menu/play-0.png");
auto play_select = Sprite::create("6/menu/play-1.png");
auto help_normal = Sprite::create("6/menu/help-0.png");
auto help_select = Sprite::create("6/menu/help-1.png");
auto option_normal = Sprite::create("6/menu/option-0.png");
auto option_select = Sprite::create("6/menu/option-1.png");
auto quit_normal = Sprite::create("6/menu/quit-0.png");
auto quit_select = Sprite::create("6/menu/quit-1.png");
//메뉴 버튼
auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
playmenuItem->setTag(TAG_MENUITEM_PLAY);
helpmenuItem->setTag(TAG_MENUITEM_HELP);
optionmenuItem->setTag(TAG_MENUITEM_OPTION);
quitmenuItem->setTag(TAG_MENUITEM_QUIT);
//메뉴
auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL);
menu->alignItemsVerticallyWithPadding(20);
this->addChild(menu);
19
Cocos2d-x12
Cocos2d-x Menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//메뉴 버튼 스프라이트
auto play_normal = Sprite::create("6/menu/play-0.png");
auto play_select = Sprite::create("6/menu/play-1.png");
auto help_normal = Sprite::create("6/menu/help-0.png");
auto help_select = Sprite::create("6/menu/help-1.png");
auto option_normal = Sprite::create("6/menu/option-0.png");
auto option_select = Sprite::create("6/menu/option-1.png");
auto quit_normal = Sprite::create("6/menu/quit-0.png");
auto quit_select = Sprite::create("6/menu/quit-1.png");
//메뉴 버튼
auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
playmenuItem->setTag(TAG_MENUITEM_PLAY);
helpmenuItem->setTag(TAG_MENUITEM_HELP);
optionmenuItem->setTag(TAG_MENUITEM_OPTION);
quitmenuItem->setTag(TAG_MENUITEM_QUIT);
//메뉴
auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL);
menu->alignItemsVerticallyWithPadding(20);
this->addChild(menu);
20
Cocos2d-x12
Cocos2d-x Menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//메뉴 버튼 스프라이트
auto play_normal = Sprite::create("6/menu/play-0.png");
auto play_select = Sprite::create("6/menu/play-1.png");
auto help_normal = Sprite::create("6/menu/help-0.png");
auto help_select = Sprite::create("6/menu/help-1.png");
auto option_normal = Sprite::create("6/menu/option-0.png");
auto option_select = Sprite::create("6/menu/option-1.png");
auto quit_normal = Sprite::create("6/menu/quit-0.png");
auto quit_select = Sprite::create("6/menu/quit-1.png");
//메뉴 버튼
auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
playmenuItem->setTag(TAG_MENUITEM_PLAY);
helpmenuItem->setTag(TAG_MENUITEM_HELP);
optionmenuItem->setTag(TAG_MENUITEM_OPTION);
quitmenuItem->setTag(TAG_MENUITEM_QUIT);
//메뉴
auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL);
menu->alignItemsVerticallyWithPadding(20);
this->addChild(menu);
21
Cocos2d-x12
Cocos2d-x Menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//메뉴 버튼 스프라이트
auto play_normal = Sprite::create("6/menu/play-0.png");
auto play_select = Sprite::create("6/menu/play-1.png");
auto help_normal = Sprite::create("6/menu/help-0.png");
auto help_select = Sprite::create("6/menu/help-1.png");
auto option_normal = Sprite::create("6/menu/option-0.png");
auto option_select = Sprite::create("6/menu/option-1.png");
auto quit_normal = Sprite::create("6/menu/quit-0.png");
auto quit_select = Sprite::create("6/menu/quit-1.png");
//메뉴 버튼
auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
playmenuItem->setTag(TAG_MENUITEM_PLAY);
helpmenuItem->setTag(TAG_MENUITEM_HELP);
optionmenuItem->setTag(TAG_MENUITEM_OPTION);
quitmenuItem->setTag(TAG_MENUITEM_QUIT);
//메뉴
auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL);
menu->alignItemsVerticallyWithPadding(20);
this->addChild(menu);
22
Cocos2d-x12
Cocos2d-x Menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void MenuScene::menuCallback(Ref* sender)
{
auto item = (MenuItem*)sender;
switch (item->getTag())
{
//Help 버튼
case TAG_MENUITEM_HELP:
CCLOG("Help Button Click");
break;
//Option 버튼
case TAG_MENUITEM_OPTION:
CCLOG("Option Button Click");
break;
//Play 버튼
case TAG_MENUITEM_PLAY:
//안묶으면 에러남
{
auto GameScene = TransitionCrossFade::create(3.0, GameScene::createScene());
Director::getInstance()->replaceScene(GameScene);
}
break;
//종료버튼
case TAG_MENUITEM_QUIT:
Director::getInstance()->end();
}
}
23
Cocos2d-x12
Cocos2d-x Menu
auto playmenuItem = MenuItemSprite::create(play_normal,
play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
create(Node* normalSprite, Node* selectedSprite, const ccMenuCallback& callback)
CC_CALLBACK_N은 menuCallBack에 자동으로
넘어가는 매개변수의 개수에 따라 N이 정해짐
bool onTouchBegan(Touch* touch, Event* unused_event);
24
Cocos2d-x12
Cocos2d-x 메모리 관리
Sprite
Node
Ref
25
Cocos2d-x12
Cocos2d-x 메모리 관리
Sprite
Node
Ref
1
Object-C의 메모리 관리
objc의 메모리 관리는 기본적으로 레퍼런스 카운팅 방식이다.
모든 objc의 클래스는 NSObject를 상속받는다. retain,
release를 적절히 써서 레퍼런스 카운팅 쌍을 맞춰주면 적절
히 메모리가 관리된다. autorelease를 사용하면
NSAutoreleasePool에 생성된 객체가 등록된다. 이후
NSAutoreleasePool이 해제되면 풀에 등록된 모든 객체에
대해서 release를 수행한다.
2
C++의 메모리 관리
C++에는 기본적으로는 저런기능이 존재하지 않는다. new로
객체를 생성하고 delete로 객체를 해제한다. (물론 이제는 표
준이된 std::shared_ptr, 일부컴파일러에서는
std::tr1::shared_ptr라는 이름으로 레퍼런스 카운팅이 되긴
한다.) 하지만 cocos2dx는 cocos2d를 거의 비슷하게 베끼
려보니까 cocos2dx를 보면 CCObject라는 클래스로 objc에
있는 메모리 모델을 비슷하게 만들어놧다.
26
Cocos2d-x12
Cocos2d-x 메모리 관리
Ref Class
27
Cocos2d-x12
Cocos2d-x 메모리 관리
auto playmenuItem = MenuItemSprite::create(play_normal,
play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
28
Cocos2d-x12
Cocos2d-x 메모리 관리
auto playmenuItem = MenuItemSprite::create(play_normal,
play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
29
Cocos2d-x12
Cocos2d-x 메모리 관리
30
Cocos2d-x12
Cocos2d-x 메모리 관리
31
Cocos2d-x12
Cocos2d-x 메모리 관리
32
Cocos2d-x12
Cocos2d-x Assertion Failed
잘못된 주소 참조라든지 포인터의 범위를 넘어갔다든지 하는..
논리적인 문제일 가능성이 많습니다.
그 말은.. 코딩하시는 과정중에 미쳐 생각을 못했거나 함수의 인
자로 잘못된 값을 넣어 줬다든지 하는
거의 코딩하는 사람의 실수 입니다.
33
Cocos2d-x12
Cocos2d-x Assertion Failed
1.프로그램을 실행하시구요 어썰션 페일이 나면
2.다시 시도를 누르세요.
그러면 디버거는 에러가 난곳에 커서를 가져다 주는데요. 어썰션 처리가 되어
있는곳은 프로그래머가 코딩해주지 않은 부분이 많으므로 콜스택으로 거슬
러 올라 가면서 의심되는 부분을 찾습니다.
콜스택의 단축키는 alt+7 입니다.
3. 어썰션 처리가 되어 있는 부분에서 alt+7 을 누르고
4.최근항목부터 오래된 항목으로 거슬러 올라가는데
5.프로그래머가 코딩해준 부분을 더블클릭해줍니다.(콜스택을 보고 있으면
많이 본 부분이 자신이 코딩해준 부분입니다.)
6.화살표가 가리키고 있는 윗줄 또는 그 윗줄에서 얼마 가지 않아 의심되는
부분이 나올겁니다.
7.포인터나 메모리 연산등을 잘 살펴 보세요.
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardI
D=50&MAEULNo=20&no=501484&ref=501475
34
Cocos2d-x12
Cocos2d-x Assertion Failed
35
Cocos2d-x12
Cocos2d-x Assertion Failed
흔한 결론
13
37
Cocos2d-x12
Cocos2d-x 말고 Unity 쓰세요
Q&A
13
THANK YOU
14

More Related Content

PPTX
Cocos2d x v3.0 무엇이 달라졌나? (20140426)
PDF
동국대 앱창작터 1일차:Cocos2d-X 소개, 환경설정, 주요개념
PDF
[NDC2014] 친구들아 도와줘 - 다양한 툴을 이용해서 Cocos2d-x 생산성 높이기 (함동기)
PPTX
Cocos2d x a to z (상)
PDF
동국대 앱창작터 4일차:Cocos2d-X 고급기능
PDF
Cocos2d 기초
PPTX
Cocos2dx와 c++11를 이용한 게임 개발
PPTX
Cocos2d x a to z (하)
Cocos2d x v3.0 무엇이 달라졌나? (20140426)
동국대 앱창작터 1일차:Cocos2d-X 소개, 환경설정, 주요개념
[NDC2014] 친구들아 도와줘 - 다양한 툴을 이용해서 Cocos2d-x 생산성 높이기 (함동기)
Cocos2d x a to z (상)
동국대 앱창작터 4일차:Cocos2d-X 고급기능
Cocos2d 기초
Cocos2dx와 c++11를 이용한 게임 개발
Cocos2d x a to z (하)

What's hot (17)

PDF
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
PDF
게임개발 Cocos2d-x : 소프트웨어씽킹연구소
PDF
동국대 앱창작터 5일차:Cocos2d-X 확장기능
PDF
동국대 앱창작터 2일차:Cocos2d-X 기본기능
PPTX
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
PDF
17. cocos2d 기초
PPTX
[NHN_NEXT] DirectX Tutorial 강의 자료
PDF
2D games with iOS or Corona
PPTX
Direct x 11 입문
PPTX
[150523] live2d 그녀들을 움직이게 하는 기술
PDF
Ccx03.cocos builder
PDF
Coco2d x
PPTX
3 d 그래픽 엔진 비교
PPTX
Cocos2d x
PPTX
NVIDIA GPU CLOUD로 시작하는 딥러닝 환경설정
PDF
빌드관리 및 디버깅 (2010년 자료)
PPTX
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
게임개발 Cocos2d-x : 소프트웨어씽킹연구소
동국대 앱창작터 5일차:Cocos2d-X 확장기능
동국대 앱창작터 2일차:Cocos2d-X 기본기능
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
17. cocos2d 기초
[NHN_NEXT] DirectX Tutorial 강의 자료
2D games with iOS or Corona
Direct x 11 입문
[150523] live2d 그녀들을 움직이게 하는 기술
Ccx03.cocos builder
Coco2d x
3 d 그래픽 엔진 비교
Cocos2d x
NVIDIA GPU CLOUD로 시작하는 딥러닝 환경설정
빌드관리 및 디버깅 (2010년 자료)
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
Ad

Viewers also liked (20)

PDF
C++ 미정의 행동(undefined behavior)
PDF
2015.12.05 쪼꼬두유 방황기
PDF
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
PDF
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
PDF
2015.08.01 회사원쪼꼬두유
PPTX
C++ stl
PPTX
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
PDF
Composer
PDF
Anatomy of an android
PPTX
A brief guide to android gradle
KEY
The Git - (#1/2)
PDF
Butter android views
PDF
PDF
Tensorflow 101
PPTX
페차쿠차2014 1
PDF
Actionbar and fragment
PDF
[0602 박민근] Direct2D
PDF
3D Graphics 101
PDF
좋은 뷰, 나쁜 뷰, 이상한 뷰
PDF
Modern android
C++ 미정의 행동(undefined behavior)
2015.12.05 쪼꼬두유 방황기
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2015.08.01 회사원쪼꼬두유
C++ stl
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
Composer
Anatomy of an android
A brief guide to android gradle
The Git - (#1/2)
Butter android views
Tensorflow 101
페차쿠차2014 1
Actionbar and fragment
[0602 박민근] Direct2D
3D Graphics 101
좋은 뷰, 나쁜 뷰, 이상한 뷰
Modern android
Ad

Similar to 2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용 (20)

PDF
Html5+js with game engine cocos2d-html5 분석 @KGC2012
PPTX
devon2013_cocostudio
PDF
iOS7 Sprite Kit을 이용한 게임 개발
PDF
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
PPTX
SiegeMode! C++ Advanced Project Ver
PDF
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
PDF
[NDC17] Protocol:hyperspace Diver 개발 포스트모템
PDF
모바일환경에서의 크로스 플랫폼_3D_렌더링엔진_제작과정
PPTX
[IGC 2017] 엔지메이킹 이대희 - 이제는 웹에서 게임을 만들 수 있는 환경 'Construct3를 바탕으로'
PPTX
Cocos2d x-6장 이준환
PPTX
[KGC2014] DX9에서DX11로의이행경험공유
PDF
포트폴리오 조동현
KEY
내 손에 픽셀을 쥐어다오
PDF
Make a shooting game using unity
PPTX
초코파이 엔진 프로토타입 기능
PDF
Direct x 12 초기화
PDF
Cocos2 d 모바일 게임 개발하기 & 게임 서비스 준비를 위한 tip
PDF
16회 오픈업/Unity3d vs cocos2dx_윤경옥테크PM
PPTX
Ndc2013 정리(upload버전)
PDF
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
Html5+js with game engine cocos2d-html5 분석 @KGC2012
devon2013_cocostudio
iOS7 Sprite Kit을 이용한 게임 개발
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
SiegeMode! C++ Advanced Project Ver
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[NDC17] Protocol:hyperspace Diver 개발 포스트모템
모바일환경에서의 크로스 플랫폼_3D_렌더링엔진_제작과정
[IGC 2017] 엔지메이킹 이대희 - 이제는 웹에서 게임을 만들 수 있는 환경 'Construct3를 바탕으로'
Cocos2d x-6장 이준환
[KGC2014] DX9에서DX11로의이행경험공유
포트폴리오 조동현
내 손에 픽셀을 쥐어다오
Make a shooting game using unity
초코파이 엔진 프로토타입 기능
Direct x 12 초기화
Cocos2 d 모바일 게임 개발하기 & 게임 서비스 준비를 위한 tip
16회 오픈업/Unity3d vs cocos2dx_윤경옥테크PM
Ndc2013 정리(upload버전)
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템

2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용

  • 1. 어쩌다보니 Cocos2d-x 사용하게 된 이야기 작성자 : 쪼꼬두유 소속 : Netmarble N2(모두의 마블 카카오파트) 발표일 : 2016. 02. 20
  • 3. 3 Cocos2d-x12 1 기원 기본적으로는 Cocos2d의 연장선상 Cocos2d는 기본적으로 IOS에서 사용하는 Objective-C 로 작성 Cocos2d-x는 범용성이 좋은 C++로 포팅해서 여러 플랫폼을 지원 하도록 만든 라이브러리형 엔진
  • 4. 4 Cocos2d-x12 1 Python 설치 2 NDK 설치 3 SDK 설치 4 Cocos2d-x 설치
  • 9. 9 Cocos2d-x12 Cocos2d-x 1 CCDirector Unity의 GameManager같은 애 기본적으로 Unity는 GameManager를 제공하지 않지만 Cocos2d-x 는 제공함 화면을 띄우거나 앱을 Pause 하거나 Resume등의 기능이 있다
  • 11. 11 Cocos2d-x12 Cocos2d-x 1 CCLayer Unity에서는 딱히 부르는 개념은 없는듯 하나의 묶음으로 묶어서 관리 함 Layer에 어떤 행동을 가하면 다 같이 적용 받음.
  • 12. 12 Cocos2d-x12 Cocos2d-x 1 CCNode Unity의 GameObject 대부분의 클래스는 Node를 상속 받고 Node는 Ref 함수를 상속받아 메모리 관 리를 해준다. 1 Sprite 2 Label 3 MenuItem 4 AtlasNode 5 Camera 6 Light 7 ParticleSystem 8 Skybox 9 Sprite3D 10 Terrain 11 SpriteBatchNode
  • 13. 13 Cocos2d-x12 1 기본좌표계 보통 다른 2d 엔진은 왼쪽 위가 기준점 Cocos2d-x는 왼쪽 아래 이유는 OpenGL 기반이기 때문 OpenGL은 왼쪽 아래가 기준점
  • 14. 14 Cocos2d-x12 1 앵커 포인트(Anchor) 화면 출력 기본 기준점 Cocos2d-x의 default는 가운데 Node->setAnchorPoint(Point(x, y)) 이런식으로 사용
  • 15. 15 Cocos2d-x12 1 Sprite & Texture Image는 두가지 방식으로 만들 수 있는 데 Texture방식과 Sprite방식으로 만들 수 있다. Texture는 불러온 이미지를 변경할 수 없지만 Sprite는 이미지를 변경할 수 있다.
  • 16. 16 Cocos2d-x12 1 Label Text를 출력하기 위한 방법 SystemFont, 외부 폰트파일, BM폰트 (이미지폰트와 좌표정보를 가진 파일로 이루어짐), CharMap(이미지폰트)로 만들수 있다
  • 17. 17 Cocos2d-x12 1 Menu Button을 Cocos2d-x에서는 메뉴라고 부르고 Menu는 Menu를 구성하는 MenuItem으로 이루어져 있다. MenuItem은 Label Sprite 등으로 만 들 수 있다.
  • 18. 18 Cocos2d-x12 Cocos2d-x Menu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //메뉴 버튼 스프라이트 auto play_normal = Sprite::create("6/menu/play-0.png"); auto play_select = Sprite::create("6/menu/play-1.png"); auto help_normal = Sprite::create("6/menu/help-0.png"); auto help_select = Sprite::create("6/menu/help-1.png"); auto option_normal = Sprite::create("6/menu/option-0.png"); auto option_select = Sprite::create("6/menu/option-1.png"); auto quit_normal = Sprite::create("6/menu/quit-0.png"); auto quit_select = Sprite::create("6/menu/quit-1.png"); //메뉴 버튼 auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); playmenuItem->setTag(TAG_MENUITEM_PLAY); helpmenuItem->setTag(TAG_MENUITEM_HELP); optionmenuItem->setTag(TAG_MENUITEM_OPTION); quitmenuItem->setTag(TAG_MENUITEM_QUIT); //메뉴 auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL); menu->alignItemsVerticallyWithPadding(20); this->addChild(menu);
  • 19. 19 Cocos2d-x12 Cocos2d-x Menu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //메뉴 버튼 스프라이트 auto play_normal = Sprite::create("6/menu/play-0.png"); auto play_select = Sprite::create("6/menu/play-1.png"); auto help_normal = Sprite::create("6/menu/help-0.png"); auto help_select = Sprite::create("6/menu/help-1.png"); auto option_normal = Sprite::create("6/menu/option-0.png"); auto option_select = Sprite::create("6/menu/option-1.png"); auto quit_normal = Sprite::create("6/menu/quit-0.png"); auto quit_select = Sprite::create("6/menu/quit-1.png"); //메뉴 버튼 auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); playmenuItem->setTag(TAG_MENUITEM_PLAY); helpmenuItem->setTag(TAG_MENUITEM_HELP); optionmenuItem->setTag(TAG_MENUITEM_OPTION); quitmenuItem->setTag(TAG_MENUITEM_QUIT); //메뉴 auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL); menu->alignItemsVerticallyWithPadding(20); this->addChild(menu);
  • 20. 20 Cocos2d-x12 Cocos2d-x Menu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //메뉴 버튼 스프라이트 auto play_normal = Sprite::create("6/menu/play-0.png"); auto play_select = Sprite::create("6/menu/play-1.png"); auto help_normal = Sprite::create("6/menu/help-0.png"); auto help_select = Sprite::create("6/menu/help-1.png"); auto option_normal = Sprite::create("6/menu/option-0.png"); auto option_select = Sprite::create("6/menu/option-1.png"); auto quit_normal = Sprite::create("6/menu/quit-0.png"); auto quit_select = Sprite::create("6/menu/quit-1.png"); //메뉴 버튼 auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); playmenuItem->setTag(TAG_MENUITEM_PLAY); helpmenuItem->setTag(TAG_MENUITEM_HELP); optionmenuItem->setTag(TAG_MENUITEM_OPTION); quitmenuItem->setTag(TAG_MENUITEM_QUIT); //메뉴 auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL); menu->alignItemsVerticallyWithPadding(20); this->addChild(menu);
  • 21. 21 Cocos2d-x12 Cocos2d-x Menu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //메뉴 버튼 스프라이트 auto play_normal = Sprite::create("6/menu/play-0.png"); auto play_select = Sprite::create("6/menu/play-1.png"); auto help_normal = Sprite::create("6/menu/help-0.png"); auto help_select = Sprite::create("6/menu/help-1.png"); auto option_normal = Sprite::create("6/menu/option-0.png"); auto option_select = Sprite::create("6/menu/option-1.png"); auto quit_normal = Sprite::create("6/menu/quit-0.png"); auto quit_select = Sprite::create("6/menu/quit-1.png"); //메뉴 버튼 auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto helpmenuItem = MenuItemSprite::create(help_normal, help_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto optionmenuItem = MenuItemSprite::create(option_normal, option_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); auto quitmenuItem = MenuItemSprite::create(quit_normal, quit_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); playmenuItem->setTag(TAG_MENUITEM_PLAY); helpmenuItem->setTag(TAG_MENUITEM_HELP); optionmenuItem->setTag(TAG_MENUITEM_OPTION); quitmenuItem->setTag(TAG_MENUITEM_QUIT); //메뉴 auto menu = Menu::create(playmenuItem, helpmenuItem, optionmenuItem, quitmenuItem, NULL); menu->alignItemsVerticallyWithPadding(20); this->addChild(menu);
  • 22. 22 Cocos2d-x12 Cocos2d-x Menu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 void MenuScene::menuCallback(Ref* sender) { auto item = (MenuItem*)sender; switch (item->getTag()) { //Help 버튼 case TAG_MENUITEM_HELP: CCLOG("Help Button Click"); break; //Option 버튼 case TAG_MENUITEM_OPTION: CCLOG("Option Button Click"); break; //Play 버튼 case TAG_MENUITEM_PLAY: //안묶으면 에러남 { auto GameScene = TransitionCrossFade::create(3.0, GameScene::createScene()); Director::getInstance()->replaceScene(GameScene); } break; //종료버튼 case TAG_MENUITEM_QUIT: Director::getInstance()->end(); } }
  • 23. 23 Cocos2d-x12 Cocos2d-x Menu auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this)); create(Node* normalSprite, Node* selectedSprite, const ccMenuCallback& callback) CC_CALLBACK_N은 menuCallBack에 자동으로 넘어가는 매개변수의 개수에 따라 N이 정해짐 bool onTouchBegan(Touch* touch, Event* unused_event);
  • 25. 25 Cocos2d-x12 Cocos2d-x 메모리 관리 Sprite Node Ref 1 Object-C의 메모리 관리 objc의 메모리 관리는 기본적으로 레퍼런스 카운팅 방식이다. 모든 objc의 클래스는 NSObject를 상속받는다. retain, release를 적절히 써서 레퍼런스 카운팅 쌍을 맞춰주면 적절 히 메모리가 관리된다. autorelease를 사용하면 NSAutoreleasePool에 생성된 객체가 등록된다. 이후 NSAutoreleasePool이 해제되면 풀에 등록된 모든 객체에 대해서 release를 수행한다. 2 C++의 메모리 관리 C++에는 기본적으로는 저런기능이 존재하지 않는다. new로 객체를 생성하고 delete로 객체를 해제한다. (물론 이제는 표 준이된 std::shared_ptr, 일부컴파일러에서는 std::tr1::shared_ptr라는 이름으로 레퍼런스 카운팅이 되긴 한다.) 하지만 cocos2dx는 cocos2d를 거의 비슷하게 베끼 려보니까 cocos2dx를 보면 CCObject라는 클래스로 objc에 있는 메모리 모델을 비슷하게 만들어놧다.
  • 27. 27 Cocos2d-x12 Cocos2d-x 메모리 관리 auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
  • 28. 28 Cocos2d-x12 Cocos2d-x 메모리 관리 auto playmenuItem = MenuItemSprite::create(play_normal, play_select, CC_CALLBACK_1(MenuScene::menuCallback, this));
  • 32. 32 Cocos2d-x12 Cocos2d-x Assertion Failed 잘못된 주소 참조라든지 포인터의 범위를 넘어갔다든지 하는.. 논리적인 문제일 가능성이 많습니다. 그 말은.. 코딩하시는 과정중에 미쳐 생각을 못했거나 함수의 인 자로 잘못된 값을 넣어 줬다든지 하는 거의 코딩하는 사람의 실수 입니다.
  • 33. 33 Cocos2d-x12 Cocos2d-x Assertion Failed 1.프로그램을 실행하시구요 어썰션 페일이 나면 2.다시 시도를 누르세요. 그러면 디버거는 에러가 난곳에 커서를 가져다 주는데요. 어썰션 처리가 되어 있는곳은 프로그래머가 코딩해주지 않은 부분이 많으므로 콜스택으로 거슬 러 올라 가면서 의심되는 부분을 찾습니다. 콜스택의 단축키는 alt+7 입니다. 3. 어썰션 처리가 되어 있는 부분에서 alt+7 을 누르고 4.최근항목부터 오래된 항목으로 거슬러 올라가는데 5.프로그래머가 코딩해준 부분을 더블클릭해줍니다.(콜스택을 보고 있으면 많이 본 부분이 자신이 코딩해준 부분입니다.) 6.화살표가 가리키고 있는 윗줄 또는 그 윗줄에서 얼마 가지 않아 의심되는 부분이 나올겁니다. 7.포인터나 메모리 연산등을 잘 살펴 보세요. http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardI D=50&MAEULNo=20&no=501484&ref=501475