달력

4

« 2025/4 »

  • 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

- cocos2d-x 개발 환경 필수 요소

cocos2d-x 폴더

NDK



1) cocos2d-x 설치

cocos2d-x.org에서 최신 버전을 다운받아서 압축을 풀면 바로 사용 가능.

별도의 실행파일이나 설치과정이 존재하지 않음.

alpha/beta/rc등의 이름이 붙은 버전은 불안정한 테스트버전이니 왠만하면 피하도록.

(작성일 기준 3.2버전)


압축 해제된 폴더의 하위 폴더 설명

- cocos : 실질적인 기능들을 담은 코드들이 존재.

 audio : 하드웨어의 특성을 타는 오디오 특성상 다양한 플랫폼에 대응하는 폴더가 존재.

 deprecated : 나중에 지원하지 않을지도 모르는 기능들. 여기 있는 것들은 되도록 사용하지 않는 것을 권장함.

editor-support : 에디터와 연동할 수 있도록 하는 부분. 

- extention : cocos2d-x 자체에 추가된 새로운 기능들.

- external : 기존에 있던 다른 기능들을 가져다 쓸 수 있게 하는 부분.


2) Python 설치

cocos2d-x용 프로젝트 생성을 위해 Python을 설치해야함.

https://www.python.org -> downloads -> windows -> python2.7.8

cocos2d-x용 프로젝트 생성에 사용할 뿐, Python언어를 이용한 코딩은 하지 않음.

설치 후, 환경변수의 Path에 Python이 설치된 폴더의 경로를 추가.

(시스템->고급 시스템 설정->고급 탭의 환경변수->하단의 시스템 변수의 Path를 편집)


+ 환경 변수의 상단 '사용자 변수'는 현재 로그온 중인 유저가 접근 가능/하단의 시스템 변수는 글로벌



opengameart.org - 게임과 관련된 오픈 리소스들이 모여있는 사이트



- 초기 설정

명령 프롬프트에서 cocos2d-x가 있는 폴더로 이동 후, 'python setup.py' 입력



- 프로젝트 생성

cocos2d-x 폴더로 이동

cocos new [프로젝트 명] -p [패키지명] -l [개발언어] 

[프로젝트 명]: 프로젝트의 이름

[패키지 명]: 어플리케이션의 고유 ID와 같음. 이걸로 어플리케이션 간 구분을 함. 이게 중복되는 것은 마켓에 등록 불가. 대개 [단체형태].[단체이름].[프로젝트명] 형식으로 구성.ex)com.3plab.test2014

[개발언어]: 개발에 이용할 언어를 선택. 대개 cocos2d-x의 경우 cpp로 대동단결.

이렇게 해서 생성에 성공한 프로젝트는 cocos2d-x 폴더 내부에 프로젝트 명과 같은 폴더에 위치한다.


- 프로젝트 폴더 분석

Classes :  유저가 직접 수정할 코드 파일들이 있는 위치.

Resources : 코딩할 때 사용할 리소스들이 있는 위치.

cocos2d : cocos 폴더 내에 있던 것들이 그대로 복사되어 옴.

2.x버전에서는 cocos폴더를 링크하여 사용했기 때문에 프로젝트 폴더를 옮기면 경로가 바뀌어 컴파일이 안됨. 3.x에서는 cocos폴더를 그대로 가져오기때문에 프로젝트 폴더를 옮겨도 그대로 실행 가능.


 



:
Posted by 웽웽

- What is cocos2d-x?

cocos2d-x는 중국의 추콩chukong에서 서포트하는 게임 엔진.


iOS기반의 cocos2d 엔진을 왕저Zhe Wang가 개조해서 멀티플랫폼을 지원하는 cocos2d-x를 만듦.


중국에서 출시 게임 중 50%이상의 점유율을 가짐.


최근 3D기능까지 추가하고 있으며, 2D에 집중중인 Unity와 필연적으로 한판 붙게 될 듯.


cocos라는 이름으로 Unity같이 완전한 하나의 개발툴로 만들어질... 지도 모른다.


무료 엔진이기 때문에 test를 위한 버전들이 올라 올 수도 있다.(Beta/rc가 붙어있는건 가급적 받지마라)




- About cocos2d-x

cocos2d-x는 C++ 11버전을 따르고 있다.

가볍다.(동일 게임을 cocos2d-x/Unity3D로 각각 개발하면 cocos2d-x기반이 훨씬 작고 가볍다)

그러니까 빠르다.


2D 엔진이긴 하지만 OpenGL을 이용한 3D가 기반이다.

(OpenGL은 화면평면을 기준으로 유저쪽으로 가까워질수록 좌표값이 증가/DirectX는 반대)


cocos2d-x가 c++보다 쉽다 - 기본 기능만으로도 충분히 결과를 낼 수 있다.


Code IDE (Lua + js 개발환경 통합). C++도 추가할 계획.


Cocos Studio - UI, Animation 등등의 에디터들을 제공.


 엥간히 잘 모르는 상황에 대해서는 cocos2d-x 공홈의 forum쪽에 가서 검색해보면 다 나온다.



+ etc

MacOS에 익숙해지는 것이 좋다.

대부분의 모바일 게임 회사에서는 Mac을 선호한다.

Mac에서는 android/iOS 다 개발 가능하지만, iOS는 Mac에서만 가능하기 때문.

또한 Mac은 하드웨어만 사면 대부분의 관련 software들이 공짜.


컴투스/게임빌은 현재 카톡런칭을 하지않고 글로벌 진출을 하고 있음.

(서머너즈 워가 한달 200억 가량 찍음)


요즘은 대부분 Skeleton Animation을 사용(비용이 적게 들고 편하기 때문)


놀랍게도 모두의 마블도  cocos2d-x로 만들어졌다.

:
Posted by 웽웽

- Orientation by Injakaun

 

작년 기능성 게임 경진대회에서는 전화번호 입력 게임이 1등

(치매예방 기능 어쩌구)

그러니까 이왕이면 기능성 게임을 만드는 쪽으로

 

공채에서 신입은 대부분 스펙이다.

컴퓨터가 서류1차 필터해줌..

 

게임회사에서는 신입을 별로 반가워하지 않는다.

큰 회사가 아닌 이상 교육을 하기 힘들기 때문.

그래서 2-5년차를 가장 선호한다. 그래서 이때가 이직의 황금기다.

 

신념이 확고한 사람들은 창업을 하는 것도 좋다.

하지만 분명 시행착오도 많을 것이다.

 

취업을 원하는 사람들은 어디든 들어가는게 장땡.

엔씨/넥슨/게임빌/스마일게이트 등은 거의 삼성전자 급으로 들어가기 힘들다.

연봉이 높다고는 하지만 생각보다 높지도 않고, 복지 또한 작은 회사가 생각보다 좋을 수도 있다.

개발자가 가장 연봉이 높은 쪽이며, 게임 쪽에서는 대기업이나 일반 기업이나 500정도밖에 차이 안난다고 생각.

 

1년 준비해서 큰 기업에 들어가느니 차라리 당장 어디든 들어가서 경력을 쌓은 뒤 점점 높이는 게 좋다.

신입 때 1-200 더받는거는 나중에 세월이 지났을 때 아무것도 아니니까 멀리 보라.

 

지금 이 6주간의 수업 기간은 절대 짧지 않은 시간이다.

기본이 없는 상태에서도 충분히 결과물을 낼 수 있는 기간.

 

요즘은 Unity 3D가 대세. 3D가 유행하기 때문.

하지만 Unity는 신입을 잘 안뽑음. 쉬운 엔진이기 때문에 포트폴리오 제작이 어렵지 않음.

우리나라만 유독 Unity의 점유율이 높음. 중국의 경우는 9%가량 밖에 안됨.

왜냐면 우리나라가 디바이스/환경적 스펙이 높아서 3D RPG 류가 유행할 수 있음.

벝뜨, 외국은 통신 상황/디바이스 정도가 다 천차만별. 그래서 게임이 용량이 많거나 통신을 계속 쓰는 게임은 다운도 잘 안함.


C++, JAVA가 엄청 중요했으나 요즘은 자바가 많이 죽음.

C같은 구조적 프로그래밍 등의 기본이 있어야 더욱 쉽게 실력을 쌓을 수 있다.

 

현업에서는 하루에 평균 10시간씩 코딩하기도 한다.

대학교때 수업들으면서 설렁설렁 3-4시간 코딩하던 거랑은 차원이 다름.

 

(동년배 중)지금까지 현업에 있는 사람들은 대부분 창업한 상태.

열심히 하면 추천해주실 수도 있음.

:
Posted by 웽웽

1. 교육용


1) 동화책 player

- 동화책을 읽어주면서 특정 대목(주요 장면)에서 직접 액션(끌어다 놓기, 클릭하기)을 하는 방식

- 몰입도 증대, 동화에 대한 흥미 유발 



2) 분리수거 게임

- 다양한 형태의 생활쓰레기를 분리수거하는 것에 초점

- 일반쓰레기 / 음식물 / 재활용 을 분리하고, 재활용은 또 그 안에 미니게임 방식을 도입

- 페트/종이/캔 등에 따라 터치등을 이용한 미니게임 방식

- 분리수거에 대한 자연스러운 인지 및 도덕성 함양



3) 그리고 놀기Draw & Play

- 도형/공/막대기 등의 사물을 만들고 그걸로 자유롭게 물리효과를 통해 놀기

- 각 도형마다 성질/특성 등을 자유롭게 변경 가능

- 환경(중력, 마찰력)을 조절하여 현실에서 불가능한 물리효과를 느낄 수 있게 함



4) Tiny Physix

- 다양한 특성을 갖는 재질을 골라서 캐릭터를 완성

- 캐릭터들로 격투하는 액션

- 서로간의 상성관계 존재



5) 뿌리기

- 물/모기약 등의 액체를 뿌리는 액션

- 물은 시들어가는 잔디에 물을 주는 방식

- 약은 여러 종류가 있으며 모기/바퀴 등 벌레 종류에 따라 바꿔가며 뿌려야함



6) 색깔맞추기 Bit Revolution?

- 위에서 랜덤하게 특정 색상(또는 모양)의 물체들이 날아감

- 일치하는 색상(또는 모양)의 버튼을 누르면 애들이 사라짐

- 없는 색상을 누르거나 지나갈때까지 못누르면 HP차감

- 0되면 종료. 콤보 이을 시 더 높은 점수 획득

- 노트에 색깔과 방향이 있어서 노트가 떨어지면 해당하는 노트의 색깔을 터치후 방향으로 드래그해서 맞추는 식으로

- 겁나 옛날 게임 감성으로만들기

(kof초기작 오프닝같은거 참고)

:
Posted by 웽웽
2014. 10. 21. 23:38

[STL] List / Map DATA_OLD/C/C++2014. 10. 21. 23:38

리스트List란

 - 이중 연결 리스트로 구현된 컨테이너

 - 노드끼리는 서로 링크되어 요소 간 논리적인 순서를 기억

 - 인접한 메모리에 배치되어있지 않아도 무관하며, 삽입/삭제가 빠름

 - 리스트 내 요소를 찾으려면 첫 노드부터 순차적으로 찾으므로 읽기 속도는 느림


헤더 파일

 #include <list>


선언 방식

 list<T> name;

//name이라는 이름의 T타입 리스트를 생성


사용 메소드

push_front()                //리스트 앞에 요소 추가

push_back()                //리스트 뒤에 요소 추가

pop_front()                 //리스트 앞의 요소 제거

pop_back()                //리스트 뒤의 요소 제거



///////////////////////////////////


맵Map이란

 - 두 개씩 짝을 이루는 데이터를 저장하는 컨테이너. 첫 번째는 인덱스(first), 두 번째는 데이터(second)로 구성.

 - 항상 정렬된 위치에 데이터를 삽입하므로 이진 탐색이 가능하여 빠른 검색이 가능.

 - 대량의 데이터를 신속하게 검색할 필요가 있을 경우 주로 사용.

 - 인덱스를 이용하여 접근하거나 iterator를 이용한 접근 둘 다 가능.(iterator->first/iterator->second)


선언 방식

#include <map>

list<인덱스 타입/데이터 타입> name;

//name이라는 이름의 맵 생성. 맵의 구조는 <인덱스/스트링> 형식.



'DATA_OLD > C/C++' 카테고리의 다른 글

[C++] const의 쓰임새  (0) 2014.11.11
[C++] 범위 기반 for문  (0) 2014.11.11
[C++] switch문 내에서 변수 선언에 대해  (0) 2014.11.11
[STL]Vector  (0) 2014.10.21
[C++] 입력받은 수를 2진수로 출력하기  (0) 2014.10.08
:
Posted by 웽웽
2014. 10. 21. 22:07

[STL]Vector DATA_OLD/C/C++2014. 10. 21. 22:07

벡터Vector란 


 - 배열처럼 요소에 직접 접근 가능한 배열 같은 기능

 - 요소의 개수에 맞게 자동으로 메무리를 재할당하여 크기를 늘릴 수 있는 동적 배열

 - 템플릿 기반이므로 원하는 타입으로 사용 가능(유저가 선언한 클래스나 구조체도 가능)

 - 읽기 속도가 빠르므로 정렬/이진 탐색등의 알고리즘에 효율적

 - 삽입/삭제 시에는 메모리를 밀고 당기는 처리가 필요하기 때문에 느림



헤더 파일

 #include <vector> 



선언 방식

 vector<T> example(5);

 //T 타입의 크기 5짜리 example이라는 배열 선언



example[index] 방식으로 해당 index에 있는 배열 원소에 바로 접근 가능



사용 메소드

push_back(5)            //맨 뒤에 5를 추가

size()                        //원소의 갯수 반환

begin()                    //벡터의 첫 번째 원소의 주소 반환

end()                        //벡터의 마지막 원소의 주소 반환

front()                       //벡터의 첫번째 원소 반환

back()                        //벡터의 마지막 원소 반환

insert( 주소, 원소 )        //해당 주소에 원소 삽입(배열 갯수 1 증가)

erase( iterator )            //iterator가 위치한 주소의 원소 삭제

resize( 값 )                    //값만큼 벡터 갯수를 재조정. 값 이상일 경우 뒤는 잘림

empty()                        //비어있으면 1, 차있으면 0 반환

at( index )                    //index위치에 있는 원소 값 반환

clear()                          //모든 원소 제거


'DATA_OLD > C/C++' 카테고리의 다른 글

[C++] const의 쓰임새  (0) 2014.11.11
[C++] 범위 기반 for문  (0) 2014.11.11
[C++] switch문 내에서 변수 선언에 대해  (0) 2014.11.11
[STL] List / Map  (0) 2014.10.21
[C++] 입력받은 수를 2진수로 출력하기  (0) 2014.10.08
:
Posted by 웽웽

입력받은 데이터를 32비트라 가정했을 때

31비트만큼 >>연산 후 출력-> 첫 번째 비트

30비트만큼 >>연산 후 출력->두 번째 비트

...

0비트만큼 >>연산 후 출력->마지막 비트


void PrintBits(int number)

{

int bit = 31;

for ( bit; bit >=0 ; --bit )

{

printf("%d", (number>>bit)&1 );

if ( bit%4 == 0 ) //4비트마다 띄워줌

{

printf(" ");

}

}

printf("\n");

}


'DATA_OLD > C/C++' 카테고리의 다른 글

[C++] const의 쓰임새  (0) 2014.11.11
[C++] 범위 기반 for문  (0) 2014.11.11
[C++] switch문 내에서 변수 선언에 대해  (0) 2014.11.11
[STL] List / Map  (0) 2014.10.21
[STL]Vector  (0) 2014.10.21
:
Posted by 웽웽
2014. 7. 7. 12:41

140707_IOCP 예제 분석 DATA_OLD/Server Study2014. 7. 7. 12:41

CTestSession     - CPacketSession을 상속받은 클래스.

접속한 클라이언트 각각의 개체를 관리하는 클래스

소켓을 받아서 Accept

즉, 접속 성공 시 / 접속 종료 시 처리해야 할 작업들이 존재.



CTestIOCP     - CIocp 클래스를 상속받은 클래스.

private:

CTestSession *mListenSession                    // 서버의 listen을 담당할 개체.

CTestSession *mTestSessions[MAX_NUM]   // 접속한 개체들을 관리하는 배열.

:
Posted by 웽웽

IOCP란?

실제 서버에서 사용하는 소켓 IO 관리 기법. 소켓 뿐 아니라 일반 파일에도 적용 가능. 

IO가 발생하는 것을 WorkerThread들이 감지하여 처리하는 방식. 한 스레드가 작업을 처리하는 동안 다른 작업도 처리하기 위해 WorkerThread들은 ThreadPool이라는 기법을 통해 제작됨.

이벤트 방식은 초당 64개 이상의 처리를 하기 힘들고, 하나의 메시지 처리 시에 많은 리소스 소모.

IOCP는 입/출력 핸들이 작업을 시켜놓으면 IOCP가 나중에 결과를 알려주는 비동기 처리 방식.

즉, 메인 프로세스는 입/출력 진행 과정을 알 필요 없이, 해당 작업의 결과만을 통보받는다는 의미.


완료된 작업의 종류를 구분하기 위해, IOCP 등록 시 DWORD형의 Completion Key를 같이 등록.

Queue에 완료된 작업들의 결과를 저장하여 처리하고, 이 Queue를 검사하는 것이 WorkerThread의 역할이다.


CIOCP() - 생성자.

mIOCPHandle    : IOCP 관리 핸들 값. 기본 IOCP 생성 및 소켓 핸들의 IOCP 등록에 사용.

mWorkerThreadCount    : 사용할 WorkerThread 개수.

 mStartupEventHandle    : 시작 관리 이벤트

Begin() - IOCP 사용을 위한 기본 준비. 

- GetSystemInfo()    : 시스템의 정보를 가져오는 함수. SYSTEM_INFO 형식의 변수를 파라미터로 받아서 해당 변수에 시스템의 여러 정보를 멤버로 갖는 구조체를 담는다. 이 중 CPU의 정보를 이용하여 대개 CPU의 2배 만큼의 WorkerThread를 생성한다.


- CreateIoCompletionPort()    : IOCP 핸들 생성 함수. 


- CreateEvent()     : 시작 관리 이벤트 생성. 



- mWorkerThreadVector    : 생성한 WorkerThread들을 관리하는 벡터. for문을 이용하여 CreateThread()로 WorkerThread 생성 후 리턴값으로 받은 해당 스레드의 핸들 값을 push_back()을 통해 벡터에 넣어주고 WaitForSingleObect를 통해 스레드가 완전히 생성될때까지 대기한다.(아니면 WaitForSingleObject에 파라미터로 받는 mStartupEventHandle에 이벤트가 발생할때까지 대기?)

     Q. WaitForSingleObject가 정확히 어떨때 어떤 역할을 하는지?



End() - 생성해둔 WorkerThread를 종료하고, mIocpHandle을 초기화하여 WorkerThread들을 관리하던 Vector를 초기화해줌. 

- PostQueuedCompletionStatus()    : 첫번째 파라미터로 받는 IOCP 핸들에 강제적으로 신호를 발생시키는 함수. 2~4번째 파라미터로 받는 데이터를 신호에 담아 그대로 WorkerThread에 보낸다.



RegisterSocketToIocp() - 소켓/파일 핸들을 IOCP에 등록하는 함수. 소켓이나 파일을 등록해두지 않으면 WSARecv, WSASend를 아무리 호출해도 IOCP에서 신호를 찾을 수 없음.

- 이 함수 내에서 이루어지는 CreateIoCompletionPort()함수의 파라미터는 소켓 핸들, 메인 IOCP 핸들, Completion Key등을 넣어주고, 이 리턴값을 다시 메인 IOCP핸들에 덮어쓴다. 이 과정을 통해서 소켓/파일 핸들이 IOCP에 등록된다.

Q. 왜 처음에 기본 IOCP핸들을 선언해주고 다시 메인 핸들에 덮어쓰는지?



WorkerThreadCallback() - GetQueuedCompletionStatus()함수를 통해 받은 파라미터의 모든 것을 판단하고 처리. 

- 어떠한 IO가 발생했을 때 항상 Overlapped가 넘어오게 된다. 윈도우OS 레벨에서 Overlapped 구조체를 메모리에 계속 유지하면서, IO가 발생했을 때 해당 이벤트와 짝지어 넘겨주기 때문에 이를 통해 넘어온 이벤트의 종류를 알 수 있음.


- NetworkSession 클래스에서 Accept, Read, Write 각각에 대한 Overlapped를 만들어두고 그에 대한 IoType을 해당 작업에 맞는 것으로 설정해 둠으로써 어떤 작업의 IO인지를 알 수 있음.


- Overlapped_Ex->Object 필드는 신호를 보낸 접속자를 구분하기 위해 만든 필드. 하나의 접속자마다 NetworkSession 클래스가 1개씩 할당되는데, 이 NetworkSession클래스가 초기화될 때 위에서 언급한 Accept, Read, Write에 대한 각각의 Overlapped클래스의 Object에 this를 넣어줌으로써 어떤 접속자가 보낸 것인지 구분할 수 있다.



- GetQueuedCompletionStatus()    : 대기하다가 큐에서 신호를 가져오는 함수. 입력 파라미터로 사용할 IOCP 핸들 값과 대기 시간을 받고, 출력 파라미터로 발생한 IO의 데이터 크기, 키 값, Overlapped 값을 WorkerThreadCallback() 시작 시 선언한 세 변수에 저장한다. 

이 함수를 통해 받은 값들을 분석하여 각각의 IO 형태에 맞는 가상함수들을 처리해준다.








:
Posted by 웽웽

EventSelect 클래스

클라이언트에서 많이 쓰이는 방식이자 일반적인 소켓 사용 방법.

스레드를 하나 생성하여 그 스레드 안에서 지정한 소켓의 모든 이벤트(Read, Write등)를 검출해내는 구조로 구성.


CEventSelect() - 생성자. 이벤트와 스레드를 관리하는 여러 핸들들과 소켓 핸들을 초기화시킴. 그 중에서도 mSelectEventHandle이 모든 소켓이벤트의 중심이 되는 중요한 역할을 함.

mSelectThreadHandle    : 소켓 이벤트를 관리할 스레드 핸들

mDestroyEventHandle    : 스레드 종료 이벤트 핸들

mStartupEventHandle    : 스레드 시작 이벤트 핸들



Begin() - 소켓 이벤트 관리 스레드 생성 및 WSAEventSelect를 이용해 사용할 소켓 이벤트 등록.

- 소켓 이벤트 관리 이벤트 / 스레드 종료 이벤트 / 스레드 시작 이벤트 /소켓 이벤트 관리 스레드 생성


- WSAEventSelect()    : 사용할 소켓 이벤트들을 등록하여 해당 소켓의 이벤트를 검출함.

해당 소켓에 등록한 이벤트가 발생되었을 경우 mSelectThreadHandle에 SelectThreadCallback함수가 등록된 스레드가 생성되어 해당 이벤트에 대한 처리가 이루어짐.


- WaitForSingleObject()    : 스레드 생성 완료까지 대기 후, 스레드가 Wait될 때까지 시간을 벌어줌. 스레드가 생성되면서 등록한 이벤트 핸들(mStartupEventHandle)에 이벤트가 발생하면 함수 종료.



End() - 이벤트 변수들의 초기화 및 스레드 종료 이벤트를 발생시켜 해당 스레드가 종료될 때까지 대기함.



SelectThreadCallBack() - 소켓 이벤트를 관리하는 스레드. 실제 소켓 관련 이벤트가 발생했을 때 처리하는 스레드. 

- WaitForMultipleObjects    : 임시 핸들 배열에 저장해둔 mDestroyEventHandle과 mSelectEventHandle 두개의 핸들에 이벤트가 발생할 때까지 대기. 이벤트 발생 시, 해당 코드는 EventID에 등록된다. EventID에 들어간 값에 대한 switch문으로 각각의 케이스에 따른 작업 수행.


- WSAEnumNetworkEvents()    : 소켓에 관련된 이벤트가 발생했을 때 해당 이벤트를 받아오는 함수. NETWORKEVENTS 형식인 NetworkEvents 변수에다가 소켓에 발생한 네트워크 이벤트를 받음. 각각의 이벤트에 따라 가상함수를 호출함.

* 여기서 가상함수를 사용하는 이유는, 이 EventSelect 클래스를 그대로 사용하지 않고, 이를 상속받는 클래스들이 각각의 기능에 맞게 해당 부분을 재정의 하여 사용할 수 있도록 하기 위함임.



:
Posted by 웽웽