tutorial studio games android libgdx

studio - Cómo agregar libgdx como una subvista en Android



libgdx wiki (4)

Tengo main.xml de la siguiente manera:

<RelativeLayout> ... <FrameLayout android:id="@+id/panel_sheet" android:layout_width="match_parent" android:layout_height="match_parent"> <com.libgdx.Sheet3DViewGdx android:id="@+id/m3D" android:layout_width="1000dp" android:layout_height="600dp" /> </FrameLayout> ... </RelativeLayout>

Y mi principal clase de actividad es la siguiente:

public class Test extends Activity { MainActivity m3DActivity; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); } }

Mi clase GDX es la siguiente que amplía la clase ApplicationListener en lugar de Ver.

public class Sheet3DViewGdx implements ApplicationListener{ @Override public void create() { InputStream in = Gdx.files.internal("data/obj/Human3DModel.obj").read(); model = ObjLoader.loadObj(in); } @Override public void dispose() { } @Override public void pause() { } @Override public void render() { Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); model.render(GL10.GL_TRIANGLES); } @Override public void resize(int arg0, int arg1) { float aspectRatio = (float) arg0 / (float) arg1; } @Override public void resume() { } }

Ahora, ¿cómo debo agregar Sheet3DViewGdx como una subvista en mi diseño principal?


El uso de un proyecto libgdx como una vista dentro de una aplicación de Android ahora se documenta claramente, con un código de ejemplo, en el wiki de libgdx, implementado como un Fragmento (la mejor práctica para las aplicaciones modernas de Android):

  1. Agregue la biblioteca de soporte de Android V4 al proyecto -android y su ruta de compilación si aún no lo ha agregado. Esto es necesario para extender FragmentActivity más adelante.
  2. Cambie la actividad de Android Launcher para extender FragmentActivity, no AndroidApplication
  3. Implementar AndroidFragmentApplication.Callbacks en la actividad AndroidLauncher
  4. Cree una clase que amplíe AndroidFragmentApplication, que es la implementación de fragmentos para Libgdx.
  5. Agregue el código initializeForView () en el método onCreateView del Fragmento.
  6. Finalmente, reemplace el contenido de la actividad de Android Launcher con el Fragmento Libgdx.

He creado un programa Hello World en github para libgdx que se ejecuta en un fragmento con Android Studio 2.1. Sigue las instrucciones en el wiki oficial de libgdx .

Clase AndroidLauncher:

import android.os.Bundle; import android.support.v4.app.FragmentActivity; import com.badlogic.gdx.backends.android.AndroidFragmentApplication; public class AndroidLauncher extends FragmentActivity implements AndroidFragmentApplication.Callbacks { @Override public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); // Create libgdx fragment GameFragment libgdxFragment = new GameFragment(); // Put it inside the framelayout (which is defined in the layout.xml file). getSupportFragmentManager().beginTransaction(). add(R.id.content_framelayout, libgdxFragment). commit(); } @Override public void exit() { } }

La clase GameFragment:

import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.badlogic.gdx.backends.android.AndroidFragmentApplication; public class GameFragment extends AndroidFragmentApplication{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // return the GLSurfaceView on which libgdx is drawing game stuff return initializeForView(new MyGdxGame()); } }

layout.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content_framelayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2"> </FrameLayout> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#FF0000" android:textColor="#00FF00" android:textSize="40dp" android:text="I''m just a TextView here with red background :("/> </LinearLayout>

Clase MyGdxGame:

import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private BitmapFont font; @Override public void create () { batch = new SpriteBatch(); img = new Texture("badlogic.jpg"); font = new BitmapFont(); font.setColor(Color.BLUE); } @Override public void render () { Gdx.gl.glClearColor(0, 0, 0, 0); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); //batch.draw(img, 0, 0); font.getData().setScale(6.0f); font.draw(batch, "Hello World from libgdx running in a fragment! :)", 100, 300); batch.end(); } @Override public void dispose () { batch.dispose(); img.dispose(); } }

Asegúrate de haber agregado lo siguiente:

compile "com.android.support:support-v4:24.1.1"

A la secuencia de comandos de proyecto en la sección "dependencias {.}" Dentro de la sección proyecto (": android").


La clase AndroidApplication (que extiende la actividad) tiene un método llamado initializeForView(ApplicationListener, AndroidApplicationConfiguration) que devolverá una View que puede agregar a su diseño.

Por lo tanto, su clase de prueba puede extender la aplicación Android en lugar de la actividad para que pueda llamar a ese método y agregar la vista a su diseño.

Si esa no es una opción, por alguna razón, eche un vistazo a lo que hace el código fuente de AndroidApplication e imite eso.


@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); cfg.useGL20 = false; //initialize(new LoveHearts(), cfg); LinearLayout lg=(LinearLayout)findViewById(R.id.game); lg.addView(initializeForView(new LoveHearts(), cfg)); }