C++ 예제 (Qt Android 게임개발)

개요

약 3년 전 C++언어로 Qt, Android 개발환경 구축을 소개한 글이 있었습니다.

참조 : C++, Qt Android App 개발 (이전 글)

 

세월이 지나 최근 C++ Qt 환경에서 Android 배포용 앱을 만들다 보니 기존과 변경된 부분이 있어 정리해두고자 합니다.

이 글은 Windows 11에서  Qt Creator, C++, Cross Platform 을 활용해 Android Device 용 앱을 개발하고 업로드하는 과정을 담고 있습니다.

대상 App은 크롬브라우저의 인터넷이 끊기면 실행되는 T-Rex Game 입니다.

(공룡, 선인장 이미지들을 이용해 C++로 직접 만든 코드입니다.)

소스코드는 아래에 공유해 두었으니 참조바랍니다.

[실제 개발 환경]
 

실제 빌드 동영상 1

 

실제 빌드 동영상 2


 

개발 환경

  • Windows 11 Pro 64bit

  • Qt Creator 11.0.2 based on Qt 6.5.2, C++

  • Android Qt 6.5.2 Clang arm64-v8a (Kit)

  • JDK 20

  • Android Studio Giraffe, 2022.3.1, NDK 25.2.9519653

  • LG V50S (Android 12, SDK 31)

     

일단 Qt Android 개발환경 구성 결과를 캡쳐해 먼저 살펴보고 이후,  그 과정을 자세히 소개하겠습니다.

그럼 개발환경이 완료된 Qt Creator를 우선 요약해 살펴보겠습니다.

Qt Android Setting 화면입니다.

[JDK, Android SDK, NDK]
 

Qt Android Physical Device 입니다.

[Test Device]

Android Studio 에 설치된 SDK 입니다. (각자 필요한 부분만 설치)

[Android SDK]


설치 순서

그럼 처음부터 설치과정을 진행해 보겠습니다.

개발에 필요한 구성요소들의 설치 순서는 별로 중요하지 않지만 저는 아래의 순서로 진행했습니다.

참고로 이어지는 구성요소들을 모두 설치하고 Android SDK 몇 가지를 설치하니 전체 설치 용량이 20GB 이상이 필요합니다.


1. JDK 설치

JAVA 환경에서 실행되는 App 개발에 필요한 구성요소들을 모아놓은 패키지.

링크 : https://www.oracle.com/kr/java/technologies/downloads/#jdk20-windows


 

2. Android Studio 설치 및 SDK 다운로드

Android App 개발을 위한 통합개발환경.

링크 : https://developer.android.com/studio 


 

3. Android NDK 다운로드 

Android NDK는 C 및 C++와 같은 언어를 사용하여 네이티브 코드로 앱의 일부를 구현할 수 있게 하는 도구 모음

링크 : https://developer.android.com/ndk/downloads?hl=ko


 

4. Qt 설치

C++ Class를 이용한 크로스플랫폼 기반의 통합개발환경.

링크 : https://www.qt.io/download-open-source

Qt 설치중 Android 체크


이제 필요한 구성요소의 설치는 모두 끝난 상태입니다.

 

설치를 모두 마치고 Qt Creator 를 실행합니다.

Menu-Edit-Preferences 를 선택, KitDevice 를 설정합니다.

최근의 Qt Creator는 JDK, Android SDK, NDK 설치도 이곳에서 지원하지만 우리는 위 과정에서 이미 설치를 마쳤으므로 설치된 경로가 맞는지 확인합니다.


만약 실제 Android Device가 아닌 AVD가 필요한 경우는 아래와 같이 추가합니다.

이제 Qt Android 개발환경 구성이 완료되었습니다.

남은 일은 Qt Android Project 를 생성, 

C++을 이용해 App을 작성한 후,

개발자 모드로 Android Device 배포 or 에뮬레이터에서 테스트하면 됩니다.

 

Qt Android Project 생성

Qt 실행, Android Project를 생성.

프로젝트 위치 설정

빌드 시스템 설정

QWidget 을 기반으로 App 생성

언어번역 설정

개발 Kit 설정

프로젝트 관리 설정

프로젝트 생성 완료!


이제 이 코드를 배포할 Target Device 를 정해야 합니다.

Menu-Edit-Preferences-Devices 에서 등록해둔 장치를 선택합니다.

(Physical Android Device or AVD Emulator)

 

이제 빌드후 배포하면 해당 장치에서 앱이 실행됩니다. 하지만 아직 코드가 없어 빈 위젯만 덩그러니 실행될 것입니다.

하지만 빈 위젯의 앱이 Android 장치에서 잘 실행된다는 것은 우리가 앞선 개발환경을 잘 구성하였다는 의미이므로 축하할 일입니다.😃

이젠 근사한 앱을 직접 만들어서 배포해도 좋지만, 기존에 만들어진 C++코드를 조금 수정해 시간을 절약하겠습니다.

 

T-Rex Game 소스코드

이 C++ 코드는 예전에 만들어둔 Windows Platform 기반 코드를 Android에서 실행되도록 최소한만 Customized 된 코드입니다.

링크 : Windows 용 T-Rex Game 글

 

예를 들면 변경사항은, 

Windows 기반에서 Keyboard Event (공룡 점프 처리)로 처리된 코드가  여기서는 Touch Event 처리로 변경. 

QWidget의 Touch Event 처리는, 

아래와 같이 QWidget의 Evnet FunctionOverride 해서 처리합니다.

// Widget.h
bool event(QEvent *e);

/ Widget.cpp
bool Widget::event(QEvent *e)
{
    qDebug() << "Event Filter";
    if (e->type() == QEvent::TouchBegin)
    {
        if(pGame)
            pGame->touch();
    }

    return QWidget::event(e);
}

 

또한 이미지 파일의 경로를 읽어오는 부분, 총 2가지가 변경되었습니다.

따라서 변경사항이 반영된 코드를 다운로드해 사용하기 바라며, 코드 설명은 위 링크된 이전 게시물을 참조하기 바랍니다.

아래는 Android용으로 배포하기 위한 변경사항이 반영된 소스코드 입니다.

링크 : Android 용 T-Rex Game 소스코드

프로젝트 파일 구성은 다음과 같습니다.

*.pro 파일이 Qt 의 Project 파일이며, 더블클릭시 프로젝트가 열립니다.

이 과정에서 *.configuration 파일이 없어서 Kit Selection 창이 뜨면 아래와 같이 선택하면 됩니다.


 

프로젝트 파일을 오픈 한 후 주의할 점이 2가지 있습니다.

1. Android Permission 설정

이미지파일 접근 권한 설정을 위해 AndroidManifest.xml 파일을 생성하는 과정을 진행합니다.

(Qt에서 Android App 배포시 이 파일을 참조해 권한 등을 설정)

 

왼쪽 Projects 아이콘 선택

Build Android APK 클릭

Create Templates 클릭

AndroidManifest.xml 생성 및 경로 확인

Qt Creator에서 Add 버튼으로 2가지 권한 추가

(XML 파일을 직접 열어 수정하지 않아도 됩니다)

프로젝트 폴더에 Android 폴더 생성확인

경로 Project/Android/AndroidManifest.xml 확인

XML 파일 열어보면 권한부여 확인가능


 

2. Android Image file 경로 설정

게임에 필요한 이미지 파일을 실행파일 리소스에 포함시킬수도 있지만, 실행파일 크기가 커지므로 아래 이미지 파일들을 Android Device에 저장하고 불러오는 방식으로 진행.

향후 QPixmap으로 파일경로를 불러와서 사용예정.

(선인장 4개, 공룡 왼발, 오른발 2개)

Android Device 개발자모드 연결 및 USB Debugging ON


경로 Android/data/org.qtproject.example 이동

Android/data/org.qtproject.example/files/Pictures/image 폴더 생성하고 이미지 복사

사용된 이미지는 프로젝트 파일의 Image 폴더에 있음.


실제 코드에서 이미지를 불러오는 부분은, 

game_element.h 에 아래와 같이 구현

namespace ocs
{
    class Images
    {
    public:
        Images(const QStringList< sl, int r) : list(sl), ratio(r) {}
        ~Images(){};
    public:
        void loadImage()
        {
            for (int i=0;i<list.size();i++)
            {
                QString fn (list[i]);
                QString path = QStandardPaths::writableLocationQStandardPaths::PicturesLocation);
                path = path + "/image/" + fn;
                QPixmap img = QPixmap(path);
                
                img = img.scaled(img.width()/ratio, img.height()/ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation);
                imgs.push_back(img);
            }
        }
        //생략...
  
    };


    class TRex
    {
    // 생략...   
    };


    class Cactus
    {
    // 생략...   
    };
}

여기서 QStandardPaths 를 이용해 경로를 읽어오는 방식을 사용했습니다.

 

마무리

"Building Android Apps with C++ Qt"  개발환경을 구성하는 동안 몇 가지 시행착오가 있었습니다.

모두 Android OS 에 대한 이해도가 부족해 발생한 문제였으며, 위에서 설명한 권한(Permission)과 내부파일 경로(File Path)를 이해하고 프로그래밍하는 것에 많은 시간을 소비하였습니다.

특히, Android 내부 이미지 경로를 직접 지정해서는 동작하지 않았습니다.

 

Reference

1. https://doc.qt.io/qt-6/qstandardpaths.html


이상으로 모든 설명을 마칩니다. 감사합니다.

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)