5

バックグラウンド

最近、私は Android 用のゲームを作りたいと思っており、それを支援する優れたライブラリを探し始めました。LibGDX はすべての適切なチェックボックスにヒットしました。しかし、いつものように (当然のことながら)、すべてのドキュメントは Eclipse と ADT の使用についてのみ言及しています。以前は、Ant を使用して Android プロジェクトをビルドしていたので、それを使用できると思っていましたが、プロジェクトをビルドするためのコマンドがそれほど多くないことを考えると、Ant を学ぶのは少し難しいように思えました。

質問

では、Eclipse、Ant、またはその他の IDE/ビルド ツールを使用せずに、少なくともデスクトップおよび Android プラットフォームを対象とする LibGDX プロジェクトを作成、コンパイル、および実行するには、どのような手順を実行する必要がありますか?

私は自分の質問に答えるつもりですが、最終製品を作成するために使用する方法は最善ではない可能性があるため、批判は大歓迎です.

4

1 に答える 1

11

以下は、すべてのコードと情報を含む、私が作成した 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 チュートリアル

于 2012-12-29T07:42:31.580 に答える