SlideShare a Scribd company logo
1 of 39
어쩌다보니
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

What's hot

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

What's hot (17)

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

Viewers also liked

C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)은아 정
 
2015.12.05 쪼꼬두유 방황기
2015.12.05 쪼꼬두유 방황기2015.12.05 쪼꼬두유 방황기
2015.12.05 쪼꼬두유 방황기은아 정
 
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"은아 정
 
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"은아 정
 
2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유은아 정
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park
 
페차쿠차2014 1
페차쿠차2014 1페차쿠차2014 1
페차쿠차2014 1은아 정
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 
좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰Leonardo YongUk Kim
 

Viewers also liked (20)

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

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

Html5+js with game engine cocos2d-html5 분석 @KGC2012
Html5+js with game engine   cocos2d-html5 분석 @KGC2012Html5+js with game engine   cocos2d-html5 분석 @KGC2012
Html5+js with game engine cocos2d-html5 분석 @KGC2012Chanho Song
 
13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder 13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder merry7
 
망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법종인 전
 
Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)fefe7270
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
Flappy bird 만들기 세미나 자료(유니티 4.3버전)
Flappy bird 만들기 세미나 자료(유니티 4.3버전)Flappy bird 만들기 세미나 자료(유니티 4.3버전)
Flappy bird 만들기 세미나 자료(유니티 4.3버전)Changwon National University
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 
Android+init+process
Android+init+processAndroid+init+process
Android+init+processHong Jae Kwon
 

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

Html5+js with game engine cocos2d-html5 분석 @KGC2012
Html5+js with game engine   cocos2d-html5 분석 @KGC2012Html5+js with game engine   cocos2d-html5 분석 @KGC2012
Html5+js with game engine cocos2d-html5 분석 @KGC2012
 
13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder 13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder
 
망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법
 
190821 delphi
190821 delphi190821 delphi
190821 delphi
 
Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
Flappy bird 만들기 세미나 자료(유니티 4.3버전)
Flappy bird 만들기 세미나 자료(유니티 4.3버전)Flappy bird 만들기 세미나 자료(유니티 4.3버전)
Flappy bird 만들기 세미나 자료(유니티 4.3버전)
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Android+init+process
Android+init+processAndroid+init+process
Android+init+process
 

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