以下は、すべてのコードと情報を含む、私が作成した github のプロジェクトから取得したものです。
紙飛行機
これは、プロジェクトのビルドに Eclipse または Ant を使用せずに libgdx 開発をテストするための単純なアプリケーションです。主な焦点は、libgdx を Ant を使用しないコマンドラインのみの開発環境に統合することです。
プロセス
Ant や Eclipse を使用せずに libgdx プロジェクトをセットアップする方法を調査して収集した知識を組み込む単純なプロジェクトを、最初から実行可能なビルドを取得するまで、実行します。一般的なプロセスは後から考えると簡単ですが、これを書いているのは、特に android ビルドをターゲットにするために、オンラインで答えを見つけるのに苦労したためです。
このガイドでは、「TestGameLibGdx」と入力するよりも優れているという理由だけで、プロジェクト名をPaperPlanesとします。プロジェクト コードは、読み込まれたテクスチャをクリック/タッチ ポイントに移動することで構成されます。アプリ自体はほとんど無関係です。私が使用した手順をテストするためのコードを見つける手順を誰かが節約するだけです。
Ant または Eclipse を使用して Android アプリケーションをビルドおよびデプロイするための環境が既にセットアップされていることを前提としています。現在、Java 1.7 を使用して Android 用にコンパイルする際に問題があるように見えるため、Java 1.6も必要になります。
ディレクトリ構造を作る
最初に、libgdx を使用する場合は通常どおり、さまざまなターゲット用のフォルダーを作成します。後で各フォルダーを個別に扱います。iOS または HTML5 ターゲットのディレクトリはまだ作成していないため、ありません。
mkdir -v PaperPlanes
cd PaperPlanes
mkdir -v main desktop android assets
メインディレクトリのセットアップ
これは、コードの大部分が移動する場所です。
cd main
mkdir -pv libs src/com/jeff/paperplanes
デスクトップディレクトリのセットアップ
メインと同じですが、bin
ディレクトリがあります。
cd desktop
mkdir -pv bin/classes libs src/com/jeff/bucket
Android ディレクトリのセットアップ
ツールによって生成されたスケルトン プロジェクトを使用して android ディレクトリを構築しandroid
ます。または、ソース セクションで提供されているガイドに従って、ディレクトリ構造を自分で作成することもできます。--target
およびフラグ--path
は、セットアップに固有のものであるため、注意してください。
cd android
android create project --target 1 --name PaperPlanes --path /home/jeff/playground/PaperPlanes/android --activity PaperPlanesActivity --package com.jeff.paperplanes
mkdir -pv bin/classes bin/lib
不要なファイルを削除します。このプロジェクトでは必要ないため、progaur ファイルを削除しました。
rm build.xml local.properties project.properties ant.properties proguard-project.txt
libgdxライブラリ ファイルの取得
libgdx を毎晩ダウンロードし、必要なライブラリを関連するディレクトリに配置します。以下のスニペットは、ライブラリを更新する方法です。
LIBGDX_ZIP="libgdx-nightly-latest.zip"
wget http://libgdx.badlogicgames.com/nightlies/$LIBGDX_ZIP
unzip -o $LIBGDX_ZIP gdx.jar gdx-natives.jar gdx-backend-android.jar gdx-backend-lwjgl.jar gdx-backend-lwjgl-natives.jar extensions/gdx-tools.jar 'armeabi/*' 'armeabi-v7a/*'
rm -v $LIBGDX_ZIP
mv -v gdx.jar main/libs/
cp -Rv extensions main/libs
mv -v gdx-natives.jar gdx-backend-lwjgl.jar gdx-backend-lwjgl-natives.jar desktop/libs/
mv -v gdx-backend-android.jar android/libs/
cp -Rv armeabi-v7a armeabi android/libs/
rm -rf extensions armeabi armeabi-v7a
apk には、areabi*
インストール時にディレクトリを含める必要があります。bin/lib
そのため、ディレクトリ内にそれらのフォルダーへのリンクをいくつか作成します。実際のフォルダーをコピーすることもできますが、libs は libs ディレクトリに移動します。
cd android/bin/lib
ln -s ../../libs/armeabi
ln -s ../../libs/armeabi-v7a
アセットを取得する
Android アプリで共有するとアセットがおかしい。
デスクトップ アプリケーションは、アプリケーションのルート ディレクトリからアセットを検索するため、次のようにアセットを参照します。
Gdx.files.internal( "assets/plane.png" )
ただし、Android アプリケーションは、assets
ディレクトリから始まるアセットを探します。したがって、上記のコードにより、フォルダ内のファイルが検索されますROOT/assets/assets/plane.png
。
そのため、すべてのアセットをルート ディレクトリに分散させるか、単にROOT/assets
内のフォルダへのリンクを作成することができますROOT/android/bin/assets/
。ばかげているように見えますが、プラットフォーム全体でアセット参照の一貫性を保っています。
これを行うにはもっと良い方法があると確信していますが、うまくいきます。
とにかく、このアプリは というテクスチャを 1 つだけ使用しassets/plane.png
ます。
コードを書く
libgdxリポジトリで多くの例を見つけることができます。以下に、このガイドを書いたときにテストに使用したコードをダンプします。
main/src/.../PaperPlanesGame.java
package com.jeff.paperplanes;
import com.badlogic.gdx.Game;
public class PaperPlanesGame extends Game {
private MainScreen ms;
@Override
public void create() {
ms = new MainScreen( this );
this.setScreen( ms );
}
}
main/src/.../MainScreen.java
package com.jeff.paperplanes;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.Screen;
public class MainScreen implements Screen {
PaperPlanesGame g;
Texture planeImage;
Rectangle planeRect;
SpriteBatch spb;
Vector3 touchPos;
OrthographicCamera cam;
public MainScreen( PaperPlanesGame g ) {
this.g = g;
// load assets
planeImage = new Texture( Gdx.files.internal( "assets/plane.png" ) );
// initialize rectangle
planeRect = new Rectangle();
// initialize spritebatch for drawing
spb = new SpriteBatch();
// initialize our camera
cam = new OrthographicCamera();
cam.setToOrtho( false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight() );
cam.update( true );
// touch location
touchPos = new Vector3();
}
@Override
public void show() {
}
@Override
public void render( float delta ) {
// clear screen
Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT );
// update camera
cam.update();
// begin draw
spb.setProjectionMatrix( cam.combined );
spb.begin();
// move our plane and center it
spb.draw( planeImage, planeRect.x - ( planeImage.getWidth() / 2 ) , planeRect.y - ( planeImage.getHeight() / 2 ) );
//spb.draw( planeImage, planeRect.x, planeRect.y );
spb.end();
// update touch position
if( Gdx.input.isTouched() ) {
touchPos.set( Gdx.input.getX(), Gdx.input.getY(), 0 );
// only unproject if screen is touched duh!
cam.unproject( touchPos );
// converts the coord system of the touch units ( origin top left ) to camera coord ( origin bottom left )
planeRect.x = touchPos.x;
planeRect.y = touchPos.y;
}
Gdx.app.log( "X + Y", planeRect.x + " + " + planeRect.y );
}
@Override
public void resize( int width, int height ) {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
}
Android/src/.../PaperPlanesActivity.java
package com.jeff.paperplanes;
import android.app.Activity;
import android.os.Bundle;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
public class PaperPlanesActivity extends AndroidApplication {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration cf = new AndroidApplicationConfiguration();
cf.useGL20 = true;
cf.useAccelerometer = true;
cf.useCompass = false;
initialize( new PaperPlanesGame(), cf );
}
}
デスクトップ/src/.../PaperPlanesDesktop.java
package com.jeff.paperplanes;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
public class PaperPlanesDesktop {
public static void main( String[] args ) {
LwjglApplicationConfiguration cf = new LwjglApplicationConfiguration();
cf.title = "PaperPlanes";
cf.useGL20 = true;
cf.width = 800;
cf.height = 480;
new LwjglApplication( new PaperPlanesGame(), cf );
}
}
レビューするアンドロイドターゲットを扱うときは覚えておいてくださいAndroidManifest.xml
。
デスクトップ用にコンパイル
これは簡単なビットです。ROOT
ディレクトリからコンパイルコマンドを実行しています。
# Compile
javac -verbose -classpath "desktop/libs/*:main/libs/*:desktop/bin/classes" -sourcepath desktop/src/com/jeff/paperplanes:main/src/com/jeff/paperplanes -d desktop/bin/classes desktop/src/com/jeff/paperplanes/*.java main/src/com/jeff/paperplanes/*.java
# Run
java -classpath "desktop/libs/*:main/libs/*:desktop/bin/classes" com.jeff.paperplanes.PaperPlanesDesktop
Android をコンパイルする
デスクトップよりも少し複雑です。私は主にこの男が行った仕事を盗んでいます。このガイドは非常に役に立ち、以下で説明する各ステップの説明を読む価値があります。
android
ディレクトリからコマンドを実行しています。
最初に R.java を作成します。その中にあるアセットは実際には使用しません。これは、クロス プラットフォームのポイントに勝るものではありませんが、実行時にエラーが発生せずに削除することはできないようです。
aapt package -v -f -m -M AndroidManifest.xml -I /opt/android-sdk/platforms/android-10/android.jar -S res -J src/
次に、ソース ファイルをコンパイルします。-classpath
ライブラリの場所と一致していることを確認してください。
javac -verbose -d bin/classes -classpath "bin/classes:/opt/android-sdk/platforms/android-10/android.jar:bin/lib/*:../main/libs/*:libs/*" -target 1.6 `find ./src -iname "*.java"` `find ../main/src -iname "*.java"`
次に、Dalvik バイトコードを作成します。コードで使用されるすべてのライブラリ ファイルを含めます。
dx --dex --output bin/classes.dex bin/classes libs/gdx-backend-android.jar ../main/libs/gdx.jar
ここで、署名されていない apk ファイルを作成します。
aapt package -v -f -M AndroidManifest.xml -S res -I /opt/android-sdk/platforms/android-10/android.jar -F bin/paperplanes.unsigned.apk bin/
そして、鍵で署名します。
jarsigner -verbose -keystore debugkey.keystore -storepass debug123 -keypass debug123 -signedjar bin/paperplanes.signed.apk bin/paperplanes.unsigned.apk debugkey
キーを持っていない場合は、キーを生成できます。作成方法は次のとおりです(私があまりにも頻繁に言及したガイドから抜粋):
JAVA_HOME/bin/keytool
-genkeypair
-validity 10000
-dname "CN=company name,
OU=organisational unit,
O=organisation,
L=location,
S=state,
C=country code"
-keystore DEV_HOME/AndroidTest.keystore
-storepass password
-keypass password
-alias AndroidTestKey
-keyalg RSA
-v
最後に、zipalign を実行してデバイスにインストールします。
zipalign -v -f 4 bin/paperplanes.signed.apk bin/paperplanes.apk
# First time install
adb -d install bin/paperplanes.apk
# Reinstall
adb -d install -r bin/paperplanes.apk
ソース
コマンドラインでの Android プログラムのビルド
私を怒らせたSOからの答え
LibGDX github ページ
PaperPlanes (このプロジェクト) github ページ
LibGDX API
アプリ作成時に参考にしたLibGDXのチュートリアル
アプリを作成するときに参照した別の LibGDX チュートリアル