お気に入りのゲームをAndroidに移植する

ゲームの作成は、刺激的で有益なプロセスです。 これは、オリジナルのアイデアとキャンペーンに費やされた数十時間に基づいて、「クラシック」を自分でリメイクするときに特に顕著です。 Androidの開発経験はあまりなかったので、最初はタブレット用の「必要な」アプリケーションの作成はかなりぼやけていましたが、それほど魅力的ではありませんでした。 時間と機会があれば、「大きな」解像度のサポートを追加することで、古いゲームのほこりを払拭し、磨いて接着することができます。アルファチャネルのないRGB565パレットでも、市場にレイアウトされている最新の製品よりも悪くないことがわかります。 開発中に静かに横たわる落とし穴や慎重に隠された熊手があると想定しましたが、それらは頭を痛めたので、実際のハードウェアでゲームを開始する価値があります。 ひどく欠けていたのはデバッガーであり、新たな問題は目標を達成したいという欲求を強めただけでした。 カットの下には、それがすべてどのように機能したかについての物語があります。



画像



それはおそらく自転車についての物語であるとすぐに警告する価値があります。私はインターネット上でグーグルではないものを思いついていません。 また、読者が新しいソリューションやメガテクノロジーを目にすることはほとんどありませんが、Android用のSDL1 / 2を使用してアプリケーションを構築するための実証済みの手順が見つかります。



こんにちは

Caesar III©ゲームのリメイクは個別のプロジェクトとしてではなく、イースターエッグと文書化されていない操作モードを求めて、住民数の修正、「大」解像度のサポート、元のゲームの逆コンパイルされたコードの調査を開始しました。 そして、回復したコードの量が合計の半分を超えたときに、ゲームを復元できることが明らかになりました。 SDL1.2はレンダリングライブラリとして選択されました。これは他のプロジェクトで実証されており、学習と使用も簡単です。 最初はリメイク版はLinuxのみでしたが、今年の初めに他のプラットフォーム(Mac、Windows、Haiku)に移行し、 そのようなタブレットを手に入れました。私の頭は時折、「あるLinuxで動作し、別のLinuxで動作するはずです」と思いました。



試行番号1、成功

SDLバージョン1.2の「そのまま」では、Androidで動作する機能はありませんが、環境とスクリプトを使用してAndroidアプリケーションでこのライブラリを使用してコードを収集できる素晴らしいlibsdl-androidプロジェクトがあります。 アセンブルされたアプリケーションは、インターネットからリソースをダウンロードすることも、インストーラーから解凍することもできます。 Libsdl-android自体には、bzip2やさまざまなコーデックからSDL自体やその環境SDL_image、SDL_mixer、ttfなどに至るまで、必要な多数のライブラリが含まれています。 ゲームにプラットフォーム固有のコードがない場合、移植にはいくつかの手順が必要です。

0. adtとしてインストールおよび構成します
#/ bin / bash

ARCH = x86_64;

NDK_VERSION = r9;

SDK_VERSION = 20130729;

[$(TARGET_ARCH)= "i386"] && ARCH = x86;

echo "ndkのダウンロード...";

wget --quiet --continue dl.google.com/android/ndk/android-ndk- $$ NDK_VERSION-linux-$$ ARCH.tar.bz2;

echo "ndkの抽出...";

tar -xjf android-ndk-$$ NDK_VERSION-linux-$$ ARCH.tar.bz2 -C〜/;

echo "sdkをダウンロードしています...";

wget --quiet --continue dl.google.com/android/adt/adt-bundle-linux- $$ ARCH-$$ SDK_VERSION.zip;

echo "sdkの抽出...";

ARCHIVE = `readlink -f adt-bundle-linux-$$ ARCH-$$ SDK_VERSION.zip`;

cd〜;

unzip -o -qq $$ ARCHIVE;

echo "パスの構成...";

echo "export ANDROID_SDK =〜/ adt-bundle-linux-$$ ARCH-$$ SDK_VERSION / sdk" >>〜/ .bashrc;

echo "export ANDROID_NDK =〜/ android-ndk-$$ NDK_VERSION" >>〜/ .bashrc;

echo "export NDK_ROOT = \ $$ ANDROID_NDK" >>〜/ .bashrc;

echo "export PATH = \ $$ PATH:\ $$ ANDROID_NDK:\ $$ ANDROID_SDK / tools:\ $$ ANDROID_SDK / platform-tools" >>〜/ .bashrc;



1. libsdl-androidリポジトリのクローン作成
git clone github.com/pelya/commandergenius



2.アプリケーションソースをlibsdl-androidプロジェクトフォルダーにコピーする
私の場合、git経由でソースコードを複製しています

cd commandergenius /プロジェクト/ jni /アプリケーション

git clone bitbucket.org/dalerank/caesaria



3. libsdl-andlroidを介してゲームを構築するための構成ファイルを作成する


ソースフォルダーで、別のプロジェクトからAndroidAppSettings.cfgファイルを作成またはコピーする必要があります。以下に、構成でその内容を指定しました。

コメントは削除される可能性があり、デフォルト設定も省略しました

#Android libSDLポートのアプリケーション設定

#ユーザーに表示される名前

AppName = "CaesarIA"

#パッケージ名

AppFullName = net.dalerank.caesaria

#アプリケーションの内部バージョン

AppVersionCode = 1740

#このバージョンはユーザーに表示されます

AppVersionName = "0.3.1740"

#ここで、インストール後に解凍されるローカルまたはリモートアーカイブを指定できます

AppDataDownloadUrl = "!!ゲームデータは100 Mb | cache.zip"

#アプリケーションのビルドに使用するライブラリのバージョン(バージョン2.0は機能しません)

LibSdlVersion = 1.2

#画面の向き

ScreenOrientation = h

#色深度、サポートされている16/24/32-16最速、目による違いは目立たない

VideoDepthBpp = 16

#このフラグと次の2つのフラグは、OpenGLをアプリケーションに接続する役割を果たします。

#GLを使用していないため、それらを接続しても意味がありません

NeedDepthBuffer = n

NeedStencilBuffer = n

NeedGles2 = n

#フラグはRAMにテクスチャを保存する役割を果たします。PCで問題が発生しなかった場合、

#このフラグのないアンドロイドではテクスチャが表示されない場合があります

SwVideoMode = y

#マウスエミュレーション、次の2つのフラグが機能するにはフラグが必要

AppUsesMouse = y

#複数の同時クリックの処理

AppUsesMultitouch = y

#マウスの右ボタンを押すエミュレーション、2番目の指をタップ

AppNeedsTwoButtonMouse = y

#カーソル表示

ShowMouseCursor = n

#実際、yesはここにあるはずですが、このフラグがオンになったとき、入力フィールドは削除されませんでした

AppNeedsTextInput = n

#ドライブからの読み取り許可

AccessSdCard = y

#キャッシュがインターネットからプルされる場合、yesに設定する必要があります

AccessInternet = n

#組み込みの仮想SDLボタンの数、GUIを使用するため、ボタンはありません

AppTouchscreenKeyboardKeysAmount = 0

#アプリケーションを開始する前のSDLスプラッシュ画面の遅延

StartupMenuButtonTimeout = 3000

#abiがアプリケーションを構築する場所

MultiABI = armeabi-v7a

#ここで、ライブラリを指定する必要があります。 アプリケーションが機能するために必要なsdlに加えて

CompiledLibraries = "sdl_mixer sdl_ttf lzma ogg"

#追加のコンパイルフラグ、RTTIと例外が有効になっています

AppCflags = '-O2 -finline-functions -frtti -fexceptions'

#ここは、現在のアセンブリに加えて、アセンブリのソースコードを探す必要があるフォルダです。

AppSubdirsBuild = 'dep dep / smk dep / aes dep / lzma dep / bzip2 dep / libpng source source / vfs source / core source / gfx source / game source / gui source / sound source / scene source / pathway source / walker source / objectsソース/良いソース/都市ソース/イベントソース/世界ソース/宗教 '



4.目的のアプリケーションをコンパイルするためのパスの設定


$ rmプロジェクト/ jni /アプリケーション/ src

$ ln -s caeasariaプロジェクト/ jni / application / src



5. APKアセンブリ


$。/ changeAppSettings.sh -a

$ android update project -p project

$。/ build.sh



6. Androidへのアプリケーションの署名とインストール


すべてが正常にコンパイルされると、MainActivity- [release | debug] -unsigned.apkファイルがcommandergenius / project / binフォルダーに表示されます。これはデバイスに署名してインストールする必要があります。



$ keytool -genkey -v -keystore rs.keystore -alias caesaria -keyalg RSA -keysize 2048 -validity 10000

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore rs.keystore〜/ projects / commandergenius / project / bin / MainActivity-release-unsigned.apk caesaria

$ mv〜/ projects / commandergenius / project / bin / MainActivity-release-unsigned.apk〜/ projects / caesaria.apk

$ adb uninstall net.dalerank.caesaria

$ adb install〜/ projects / caesaria.apk





落とし穴

0.環境の定義:最初に、Windows、Linux、またはLinux Androidが動作する環境を決定する必要があります。

解決策:ANDROID / __ ANDROID__定義を確認します。



1.ログ: abd logcatを使用してエラーメッセージやその他の出力を見ることができますが、stdout / printfなどの標準ツールが機能しないことがわかったため、もちろんログの出力をファイルに使用して既に見ることができますが、もっと使い慣れたデバッグが必要でした。

解決策:Androidログのヘッダーファイル#include <android / log.h>を含め 、関数を使用してメッセージを表示します

__android_log_print(ANDROID_LOG_DEBUG, CAESARIA_PLATFORM_NAME, "%s", str.c_str() );







通常のprintf構文を使用します。



2. OpenGLの使用:誰かがOpenGLを必要とする場合、彼の親しいGLESはモバイルプラットフォームに住んでいます。

解決策:標準ヘッダーファイル<GLES / gl.h>と<GLES / glext.h>の代わりに接続しますが、テクスチャとレンダリングの使用にはわずかな違いがありますが、基本的にコード(私が使用した単純なコード)はほとんど変わりません。



3.イベント処理:画面上で指を動かすと、SDL_MOUSEBUTTONUPイベントが消えます。これはlibsdl-androidライブラリ自体の欠陥であるか、どこかで紛失した可能性があります。 使用するアクションに対するインターフェイス要素の反応がない場合に、それが現れることがあります。たとえば、移動後にボタンで停止しました。理論的には、マウスカーソルがその上にある場合は状態になります。

解決策:特に私のアプリケーションの場合-アンドロイド用にアセンブルするとき、カーソルの下の要素の状態の強制更新が、後者が移動しているときに追加されました。



4.小さいインターフェイス:現代のモバイルデバイスの画面解像度は、10〜15年前に使用されていたモニターの解像度と同等またはそれ以上ですが、物理的寸法ははるかに小さいため、ユーザーインターフェイス要素自体は小さく見えるため、常に使用すると便利ではありません。

解決策:インターフェースの変更はかなり面倒な作業であり、元の外観を常に維持できるとは限りません。





1回の動きは2回の火災に相当します (民俗の知恵)

すべては、コミッターの1人がリンクを開発ブランチに送信し、比較的新しいSDL2ライブラリを使用してゲームを正常に起動し、その前にバージョンSDL1.2-2008リリースが使用されたという事実から始まりました。 特に変更リストを表示した後、私自身が新しいバージョンに切り替える可能性を検討していたと言わなければなりません。これは、「箱から出して」と呼ばれるMacとAndroidの通常のサポートを約束しました。 それから、職場でミニ休暇があり、大きな ガイドと大きなコーヒーを備えたハンマーを取り、私はリメイクを新しい「エンジン」に移し始めました。

移動の技術的な詳細を読者に退屈させたくありません。ハードウェアサポートが出現したまさにその図書館で、仕事のイデオロギーが変化しました。 この動きは1週間の夜続き、最後には残りの欠陥とグラフィックアーティファクトの修正でした。 libsdl-androidは通常SDL1.2で動作するようになっているため、変更は完了し、「大規模」OS用のアセンブリが準備されました。また、Androidのアプリケーションを構築するためのマニュアルを読み直す必要がありました。 readmeに書き込みます)

非表示のテキスト
libsdl.orgに公式のSDL 1.3 Androidポートが追加されました。これはより新しく、

新しいアプリケーションを最初から作成するのに適しています。このポートは主に焦点を合わせています

SDL 1.2および既存のアプリケーションのコンパイルでは、どちらのポートが優れているかを判断するのはユーザー次第です。

また、このポートは非​​常にゆっくりと開発されていますが、公式のポートにも同じことが言えます。




libsdl-androidを介して古い構成でポートを起動しようとして数時間を費やしたときに、このテキストの信ver性に気付きました。 まあ、否定的な経験は経験でもあります:私は利用可能なツールを使用します。



2番目の試み、完全に成功したわけではない

SDL2には、Android用のアプリケーションを構築するために必要なすべての構成が既に含まれています。公式Webサイトで推奨されている記事を読んだ後、何かを収集してみてください。 繰り返しますが、adtのインストールと構成を除いて、いくつかのステップがあります。

0. SDL2配信からサンプルをコピーする
$ git clone bitbucket.org/dalerank/caesaria

$ hg clone hg.libsdl.org/SDL

$ mkdir caesaria /アンドロイド

$ cp sdl / android-project caesaria / android

$ mkdir caesaria / android / libs

$ mkdir caesaria / android / data

$ cp SDL caesaria / android / libs



なぜこれらすべてのコピーが作成されるのですか??? ライブラリの相対パスを読みやすくします。 android / libsフォルダーにはSDLと会社があり、android / dataフォルダーにはアプリケーションアイコンがあります。



1.プロジェクトのフォルダー構造を作成する
android / android-project / jniフォルダーで、アプリケーションコンポーネントへのシンボリックリンクを作成します。



$ ln -s ../../libs/SDL SDL

$ ln -s ../../libs/SDL_mixer SDL_mixer

$ ln -s ../../libs/SDL_net SDL_net

$ ln -s ../../src/dep/aes aes

$ ln -s ../../src/source application

$ ln -s ../../src/dep/bzip2 bzip2

$ ln -s ../../src/dep/freetype freetype

$ ln -s ../../src/dep/libpng libpng

$ ln -s ../../src/dep/lzma lzma

$ ln -s ../../src/dep/smk smk

$ ln -s ../../src/dep/src src

$ ln -s ../../src/dep/ttf ttf

$ ln -s ../../src/dep/zlib zlib



私がここに書いたことについて少し:

zlibはfreetypeを構築するために必要です。freetypeはSDL_ttfに必要であり、フォントのレンダリングを担当します。

smackライブラリはsmack形式のビデオを再生するために必要です。元のゲームのビデオはこの形式で作成されます。

zipアーカイブを操作するには、Bzip、lzma、およびaesが必要です。

libpngは、ゲームのテクスチャをロードするために必要です。

SDL、SDL_mixer、SDL_netは、それぞれ描画とサウンドとネットワークの操作を担当します。

アプリケーションには、ゲーム自体のソースコードが含まれており、libapplication.soライブラリにコンパイルされます。

srcフォルダーにはlibmain.soライブラリーのソースがありますが、そのためにCコードの上にjava呼び出しのレースがすでに書き込まれているため、ユーザーが正常に起動し、明るい画像でユーザーを満足させることができます。

NDKのプロジェクト設定と構成は、SDL2の作成者によって既に親切に提供されています



2.ゲームコンポーネントをアセンブルするための構成を記述する
ビルドシステムがどのライブラリを動作させてアセンブルする必要があるかを確認するには、Makefileのようなそれらのコンフィグを作成する必要があります。 Android.mkは、ライブラリリポジトリに既に存在する可能性が高いか、インターネット上で見つけることができます。 ゲームとlibsmkライブラリのビルド構成を追加する必要がありました。



libsmkのAndroid.mkは非常にシンプルで、Androidプログラミングに関係のない人でも理解できるでしょう。

#smk / Android.mk

LOCAL_PATH:= $(my-dirを呼び出す)



含む$(CLEAR_VARS)



LOCAL_MODULE:= smk

LOCAL_SRC_FILES:= $(subst $(LOCAL_PATH)/ ,, \

$(ワイルドカード$(LOCAL_PATH)/ *。c))



インクルード$(BUILD_SHARED_LIBRARY)



configには、現在のフォルダーで見つかった.c拡張子を持つすべてのファイルをコンパイルするための指示が含まれています(libsmkの場合、jni / smkになります)



同様に、ゲーム自体を表すライブラリを構築するために構成が書き込まれます。



#application / Android.mk

LOCAL_PATH:= $(my-dirを呼び出す)

含む$(CLEAR_VARS)



LOCAL_MODULE:=アプリケーション



SDL_PATH:= ../../libs/SDL

SDL_MIXER_PATH:= ../../libs/SDL_mixer

SDL_NET_PATH:= ../../libs/SDL_net

GAME_PATH:= $(LOCAL_PATH)

DEP_PATH:= ../dep



LOCAL_C_INCLUDES:= \

$(LOCAL_PATH)/ $(SDL_PATH)/ include \

$(LOCAL_PATH)/ $(SDL_MIXER_PATH)\

$(LOCAL_PATH)/ $(SDL_NET_PATH)/ include \

$(LOCAL_PATH)/ $(FREETYPE_PATH)/ include \

$(LOCAL_PATH)/ $(GAME_PATH)\

$(LOCAL_PATH)/ $(DEP_PATH)\

$(LOCAL_PATH)/ $(DEP_PATH)/ libpng



#ここにアプリケーションのソースファイルを追加します...

LOCAL_SRC_FILES:= $(subst $(LOCAL_PATH)/ ,, \

$(ワイルドカード$(GAME_PATH)/ *。cpp)\

$(ワイルドカード$(GAME_PATH)/ core / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ vfs / *。cpp)\

$(ワイルドカード$(GAME_PATH)/オブジェクト/ *。cpp)\

$(ワイルドカード$(GAME_PATH)/ gui / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ city / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ gfx / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ events / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ world / *。cpp)\

$(ワイルドカード$(GAME_PATH)/パスウェイ/ *。cpp)\

$(ワイルドカード$(GAME_PATH)/ walker / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ good / *。cpp)\

$(ワイルドカード$(GAME_PATH)/宗教/ *。cpp)\

$(ワイルドカード$(GAME_PATH)/ scene / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ sound / *。cpp)\

$(ワイルドカード$(GAME_PATH)/ game / *。cpp))



LOCAL_SHARED_LIBRARIES:= SDL2 SDL2_mixer SDL2_net sdl_ttf pnggo lzma bzip2 aes smk

LOCAL_CPP_FEATURES + =例外

LOCAL_CPP_FEATURES + = rtti

LOCAL_LDLIBS:= -lGLESv1_CM -llog



インクルード$(BUILD_SHARED_LIBRARY)



また、LOCAL_C_INCLUDESにはヘッダーファイルを探す必要があるパスを追加し、LOCAL_SRC_FILESにはソースコード付きのファイルを追加し、

LOCAL_SHARED_LIBRARIESには、アプリケーションの依存関係を記述します。



フラグrtti、例外はRTTIと例外の使用を担当します。





3.組み立て
$ cd android-project

$ android update project -p。 -t android-15

$ ndk-build V = 1

$ ant [リリース|デバッグ]

$ ant install [r | d]





理論的には、接続されたデバイスまたはエミュレータで説明されている手順を実行すると、インストールされたアプリケーションが表示されます。





すくい

1.リソースの検索場所???

リソースの場所は特定のOS実装によって異なりますが、ほとんどの場合、アプリケーションは/ sdcard / Android / data / package_name / filesフォルダーにアクセスできます。パスを直接使用すると、アクセスエラーまたはファイル検索エラーが発生する可能性があります。

アプリケーションディレクトリへのフルパスは、SDL_system.hファイルで定義されているSDL_AndroidGetExternalStoragePath()関数を介して取得できます。

2.ウィンドウ作成フラグを使用します。

組み合わせSDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESSはすべてのデバイスで機能するわけではありません。SDL_WINDOW_OPENGLまたはSDL_WINDOW_BORDERLESSを削除し、どのフラグがプログラムをクラッシュさせるかを確認してください。 この行動が何に関連しているのか説明できません。 フラグSDL_WINDOW_SHOWNを使用すると、すべてのフラグと同様に、ログに沿って1対1でログが記録されますが、クラッシュの可能性ははるかに低くなります。

3.音声チャンネルが多すぎます。

SDL_mixer :: Mix_AllocateChannels(N> 16)関数を呼び出すと、サウンドを初期化できないというエラーでクラッシュします。 要求されたチャネル数を減らすことで、この方法でこの問題をどのように正しく解決できるかはわかりません。

4. stlport対gnustl

stlportを使用するとクラッシュし、Nexus 7エミュレーター(Android 4.0.3)でイテレーターを使用してベクターをトラバースすると、このバグが発生しました。 繰り返しますが、このエラーの事実を説明することはできません。アプリケーションをビルドするときにgnustlを使用することにしました。

5.私のカンフーはあなたのものよりも強いです。

すでにシステムにあるライブラリの名前に似た名前のライブラリを使用すると、他の誰かのライブラリがロードされ、必要な機能がない場合があります。 libpng.soのバージョンをビルドしていたためエラーが発生しました。ソリューションはstackoverflowで見つかりました。ライブラリ名libpng.solibpnggo.soに置き換えることで修正されました



結論として...

動作します! BBとほとんど変わりません! 満足していますか そうでもない!



事実、私はクリヴォルイの屋根ふきフェルトで、スキーのフェルトは動きませんが、タブレットではアプリケーションの動作が非常に遅いことがわかりました(非常に単純な画像の場合は10-12 fps、結果は鈍い)、ここでの欠点は手と機器の無知にあると思います。 SDLは両方の生まれ変わりにおいて優れたライブラリであり、多くの非常に優れたゲームがそれを使用しており、 androidに移植されています。



ポートの作成に費やした時間は確かに残念ではありません。ゲームが始まったとき、いくらかの経験と多くの肯定的な感情が得られました。 まだ試しているかどうかを検討している人のために、間違いなくそれを試してください、後で遅らせないでください!



Z.Y. ここでプロジェクトの開発をいつでも見ることができます






All Articles