Singleton, Main y Escena Base

Aquí con el amor peludo de mi vida en mi internet café preferido, codificando singleton, Main y escena base para Theolium

Es tiempo de modificar la clase Main.java y crear el Singleton principal GM.java (Game Manager) junto con la primera escena.

public class GM {

    public static final float SHORT_WORLD_DIM   = 1080;
    public static final float LARGE_WORLD_DIM   = 1920;

    public Main GAME;

    private static final GM INSTANCE = new GM();

    public static GM get() {
        return INSTANCE;
    }

    public void Init(Main game) {
        this.GAME = game;
    }

    public void dispose() {
    }

}

Una característica que voy a implementar, es la habilidad de adaptarse a cualquier orientación o tamaño de pantalla. En cualquier momento, si deseas girar el teléfono, no afectaría nada. 

Las lineas 3 y 4 solo indican la disponibilidad garantizada en pixeles pero si ese aspecto (16:9) resulta no igual al dispositivo pues simplemente se añaden mas pixeles para llenar la pantalla. 

La razón de llamarlas “Short” (pequeña) y “Large” (Grande) es porque cada una puede ser alto o ancho dependiendo de la orientación actual. 

Lo demás es la estructura típica de un Singleton que garantiza una sola instancia.

public class Main extends com.badlogic.gdx.Game {
   
    public Main (CommunicationInterface communicationInterface) {
        GM.get().Init(this);
    }

    @Override
    public void create () {
      
    }

    @Override
    public void dispose () {
        getScreen().dispose();
        GM.get().dispose();

    }
}

Linea 4 inicia el singleton GM y en la línea 9 insertamos la primera escena cuando esté lista.

Para organizar y simplificar, divido la escena en dos partes. La base, que incluye código básico para todas las escenas, y de esta base extendemos todas las demás.

public abstract class BaseScreen implements Screen, InputProcessor {

    private final Vector3 mTmp;
    private final Vector2 mScreenTouch;

    protected Stage mStage;

    public BaseScreen(Color clearColor) {

        mClearColor = clearColor;

        mTmp = new Vector3().setZero();
        mScreenTouch = new Vector2().setZero();

        mStage = new Stage(new ExtendViewport(GM.LARGE_WORLD_DIM, GM.SHORT_WORLD_DIM));
    }

    @Override
    public void show() {
        
        Gdx.input.setInputProcessor(new InputMultiplexer(mStage, this));
        Gdx.input.setCatchKey(Input.Keys.BACK, true);
    }

    @Override
    public void render(float delta) {

        Gdx.gl.glClearColor(mClearColor.r, mClearColor.g, mClearColor.b, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        mStage.draw();
        mStage.act(delta);

    }

    @Override
    public void resize(int width, int height) {

        ExtendViewport stageViewport = (ExtendViewport) mStage.getViewport();

        if (width < height) {
            stageViewport.setMinWorldWidth(GM.SHORT_WORLD_DIM);
            stageViewport.setMinWorldHeight(GM.LARGE_WORLD_DIM);
        } else {
            stageViewport.setMinWorldWidth(GM.LARGE_WORLD_DIM);
            stageViewport.setMinWorldHeight(GM.SHORT_WORLD_DIM);
        }

        stageViewport.update(width, height, true);

        resetActors();
    }

    protected void resetActors() {}

    @Override
    public void dispose() {
        mStage.dispose();
    }

    @Override
    public void pause() {}

    @Override
    public void resume() {}

    @Override
    public void hide() {
        dispose();
    }

    @Override
    public boolean keyDown(int keycode) {
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        return false;
    }

    @Override
    public boolean touchCancelled(int screenX, int screenY, int pointer, int button) {
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {

        mTmp.set(mStage.getCamera().unproject(mTmp.set(screenX, screenY, 0)));

        mScreenTouch.set(mTmp.x, mTmp.y);
        onStageTouchDown(mScreenTouch, pointer, button);

        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {

        mTmp.set(mStage.getCamera().unproject(mTmp.set(screenX, screenY, 0)));

        mScreenTouch.set(mTmp.x, mTmp.y);
        onStageTouchUp(mScreenTouch, pointer, button);

        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {

        mTmp.set(mStage.getCamera().unproject(mTmp.set(screenX, screenY, 0)));

        mScreenTouch.set(mTmp.x, mTmp.y);
        onStageDragged(mScreenTouch);

        return false;
    }

    protected void onStageTouchDown(Vector2 touch, int pointer, int button) {}

    protected void onStageTouchUp(Vector2 touch, int pointer, int button) {}

    protected void onStageDragged(Vector2 touch) {}

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        return false;
    }

    @Override
    public boolean scrolled(float amountX, float amountY) {
        return false;
    }
}

Las líneas 41 a la 47 es el código que modifica las dimensiones disponibles cuando el dispositivo cambia de orientación y se adapta a cualquier dimensión. El método «resetActors» en la línea 54 es solo para separar el código que voy a usar para reposicionar lo necesario cuando ocurra cualquier cambio de dimensión.

Los métodos de contacto «touchDown», «touchUp» y «touchDragged» los reemplazo con métodos que ya calculan la posición del evento tomando en consideración la cámara. De ahora en adelante, solo necesito los métodos «onStageTouchDown», «onStageTouchUp» y «onStageDragged».

Proximo Sábado, si Dios lo permite, preparo la primera escena «Intro».

AVISO: PARTES O LA TOTALIDAD DE ESTA PUBLICACION PUEDEN O NO SER FICTICIAS Y ESTAN DESTINADAS UNICAMENTE A FINES DE ENTRETENIMIENTO.

Únete a otros 35 suscriptores

Deja una respuesta

Anuncios


Anuncios