2. 개발환경(C++): Linux + shell

이 챕터에서는 Linux 명령행에서 C++ 로 게임을 만드는 개발 환경에 대해 설명합니다.

2.1. 새 프로젝트 만들기

터미널 상에서 다음 명령을 입력하면 my_project 라는 새로운 project 가 생성됩니다.

$ funapi_initiator my_project

새로 만들어진 프로젝트는 끝에 -source 가 붙은 디렉터리로 존재합니다. 예를 들어 위의 경우는 my_project-source 라는 이름이 됩니다. 게임 개발팀에서는 이 디렉터리를 SVN 저장소나 GIT 저장소에 넣고 공유할 수 있습니다.

2.2. Source 디렉터리 구조

funapi_initiator 명령으로 생성한 프로젝트의 -source 디렉터리는 다음에 설명하는 파일들을 포함합니다.

  • VERSION: 프로젝트의 버전 숫자를 기록합니다. 이 파일은 서버 관리 Part 3: 서버 패키징 에서 설명한 것처럼 게임 프로젝트의 패키지를 생성할 때, 식별 번호로 사용합니다.
  • DEBIAN: 게임 프로젝트의 Debian 패키지 (.deb) 를 생성할 때에 필요한 내용들을 기술합니다. 게임 프로젝트가 의존하는 외부 라이브러리가 있다면, 이 파일 안의 Depends 항목에 의존성 정보를 명시합니다.
  • README: 게임 프로젝트의 구조, 실행 방법, 소스코드 등의 설명을 자유로운 형식의 글로 남길 때 사용합니다.
  • LICENSE: 프로젝트에 적용할 라이선스 정보를 기재할 때 사용할 수 있습니다.
  • setup_build_environment: source 디렉터리를 이용해서 빌드 디렉터리를 생성하는 스크립트입니다. 옵션에 따라서 Linux command line 개발 환경 또는 Linux CLion 개발 환경 을 선택 할 수 있습니다.
  • CMakeLists.txt: 프로젝트를 빌드하는데에 사용하는 CMake 파일입니다. 프로젝트의 패키징 방식, Flavor 설정, 리소스 디렉터리 등을 이 곳에서 설정할 수 있습니다.
  • src/: 소스코드를 비롯한 프로젝트를 구성하는 파일들은 이 디렉터리에서 관리합니다.

    • CMakeLists.txt: 프로젝트를 구성하는 소스들을 정의하는 CMake 파일입니다. C++ 파일 및 헤더는 ADDITIONAL_CPP_SOURCES 에, protobuf 관련 파일들은 ADDITIONAL_PROTO_SOURCES 에, 그리고 프로젝트가 의존하는 외부 라이브러리 경로를 ADDITIONAL_LIBRARIES 에 지정할 수 있습니다. 외부 라이브러리 경로를 지정할 때는 find_library 명령어와 함께 사용하는 게 좋습니다.

    • my_project_types.h: 기본적으로 생성되는 파일 중 하나로 프로젝트에서 사용할 타입들을 정의합니다.

    • my_project_loggers.json: 프로젝트의 activity logger 정의 파일입니다. Activity logger 에 대한 자세한 설명은 여기 를 참고하세요.

    • my_project_server.cc: 프로젝트의 시작과 끝을 구성하는 주요 함수들(Install, Start, Stop)을 정의한 파일입니다. 이 파일에서 프로젝트 인스턴스의 라이프사이클을 관리할 수 있습니다. Component model 에서 설명하는 것처럼 아이펀 엔진 프로젝트는 main 함수 대신 Install, Start, Stop 함수들과 콤포넌트들로 구성되어 있습니다.

    • event_handlers.h: my_project_server.cc 는 실행 중 처리할 Event 와 클라이언트로부터 수신한 메시지를 처리하기 위한 핸들러들을 등록합니다. message 들을 위한 핸들러들을 등록합니다. 이런 핸들러는 개발자가 임의의 위치에 정의해도 되지만, funapi_initiator 를 이용해서 게임을 만드는 경우는 핸들러들의 선언은 event_handlers.h 안에 기록됩니다. C++ 규약에 의해서 원하는대로 파일 이름을 바꾸거나 여러 파일로 나눌 수 있습니다.

    • event_handlers.cc: event_handelrs.h 에 정의한 핸들러들의 구현 내용을 포함합니다.

    • MANIFEST.json: my_project_server.cc 에 정의된 서버 콤포넌트를 포함해서 각 컴포넌트들의 의존성 및 설정을 정의합니다. 이 파일에 프로젝트 실행 시의 프로토콜, 서비스 포트, 스레드 갯수 등과 같은 다양한 설정을 정의할 수 있습니다. MANIFEST.json 에 대한 자세한 설명은 여기 를 참고해주세요.

    • object_model/: 아이펀 ORM 오브젝트를 정의한 파일들을 담는 디렉터리입니다. 자세한 내용은 여기를 참고해 주세요.

      • example.json: 아이펀 ORM 오브젝트를 정의하는 파일입니다. 자세한 내용은 여기를 참고해 주세요.
  • mono/: 소스코드를 비롯한 프로젝트를 구성하는 파일들은 이 디렉터리에서 관리합니다.
    • my_project.csproj: 프로젝트를 구성하는 소스들을 정의하는 C# 프로젝트 파일입니다. Monodevelop 등의 IDE를 사용하여 프로젝트를 열 때 이 파일을 열면 됩니다. 파일을 추가 삭제하는 것은 <Compile Include="file_name.cs" /> , 그리고 <Reference Include="..." /> 변수를 추가하거나 수정하면 됩니다.
    • server.cs: 프로젝트의 시작과 끝을 구성하는 주요 함수들(Install, Start, Stop)을 정의한 파일입니다. Component model 에서 설명하는 것처럼 아이펀 엔진 프로젝트는 main 함수 대신 Install, Start, Stop 함수들과 콤포넌트들로 구성되어 있습니다. 또한 실행 중 처리할 Event 와 클라이언트로부터 수신한 메시지를 처리하기 위한 핸들러들을 등록합니다. 이런 핸들러는 개발자가 임의의 위치에 정의해도 되지만, funapi_initiator 를 이용해서 게임을 만드는 경우에 핸들러들의 선언은 server.cs 안에 기록되게 됩니다. C++ 규약에 의해서 원하는대로 파일 이름을 바꾸거나 여러 파일로 나눌 수 있습니다.
    • ActivityLog/: Activity Logger 정의 및 자동 생성 클래스가 위치하는 디렉터리입니다. Activity logger 에 대한 자세한 설명은 여기 를 참고하세요.
      • my_project_loggers.json: 게임 프로젝트의 activity logger 정의 파일입니다.
      • my_project_logger.cs: logger 정의를 통해 자동 생성되는 activity logger 클래스입니다.
    • ObjectModel/: 아이펀 ORM 오브젝트를 정의한 파일들을 담는 디렉터리입니다. 자세한 내용은 여기를 참고해주세요.
      • my_project_object.cs: 아이펀 ORM 오브젝트 정의에 해당하는 클래스를 자동 생성합니다.
      • example.json: 아이펀 ORM 오브젝트를 정의하는 파일입니다.
    • Protobuf/: protobuf 메시지 정의 및 자동 생성 클래스를 담는 디렉터리입니다.
      • my_project_messages.proto: protobuf 메시지를 정의하는 파일입니다.
      • my_project_messages.cs: .proto 파일을 통해 자동 생성되는 클래스 파일입니다.
      • my_project_protobuf_helper.cs: protobuf 클래스의 헬퍼 클래스로 자동 생성됩니다.
    • Manifest/:
      • MANIFEST.json: my_project_server.cs 에 정의된 서버 콤포넌트를 포함해서 각 콤포넌트들의 의존성 및 설정을 정의합니다. 이 파일에 서버 실행시의 프로토콜, 서비스 포트, 스레드 갯수 등과 같은 다양한 설정을 정의할 수 있습니다. MANIFEST.json 에 대한 자세한 설명은 여기 를 참고해주세요.

Attention

앞서 설명한 Activity Logger , Object Model , Protobuf 의 정의 파일(.json , .proto )과 MANIFEST.json 파일은 실제로는 my_project-source/src/ 하위에 존재합니다. Monodevelop IDE 가 아닌 다른 환경에서 개발 하실 때에는 해당 폴더를 열어 정의 파일을 수정해야합니다.

2.3. 빌드 디렉토리 만들기

다음처럼 실행하시면 됩니다.

$ my_project-source/setup_build_environment --type=makefile

2.4. 빌드하기

위 명령을 실행하면 my_project-build 라는 directory 를 생성하게 됩니다. 이 directory 에는 debug 빌드와 release 빌드를 위한 하위 디렉토리가 있습니다. 원하는 directory 안에 들어가서 make 를 입력하시면 됩니다. debug 빌드를 하시려면 다음과 같이 입력합니다.

$ cd my_project-build/debug
$ make