over 5 years ago

scene2dは2Dグラフィックス用のコンポーネントで、図形を描写したり、描写した図形に対して発生したイベントの制御ができる。これを利用してUIウィジェットを扱えるようにしたものが、scene2duiである。

scene2duiはテーブルレイアウトやボタン、チェックボックス、リストなどの色々なウィジェットをサポートしており、ゲームの設定画面を作ったりするのに向いている。また、スキンを変えることで色々な見栄えを表現できる。基本的なウィジェットは大体揃っているのでこれを使ってゲーム以外のアプリケーションを作成することもできるだろう。Android標準コンポーネントを使用してアプリを作った場合、移植性が無いが、libGDXならばそれも容易になるはず。

package com.badlogic.drop;

import aurelienribon.tweenengine.Timeline;
import aurelienribon.tweenengine.Tween;
import aurelienribon.tweenengine.TweenManager;
import aurelienribon.tweenengine.equations.Bounce;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.SpriteDrawable;

public class GameLoopScreen extends DropScreen {
    private int width = 800;
    private int height = 480;
    Texture dropImage;
    SpriteBatch batch;
    OrthographicCamera camera;
    Sprite raindrop;
    TweenManager tweenManager;
    Stage stage;

    public GameLoopScreen() {
        dropImage = new Texture(Gdx.files.internal("droplet.png"));
        camera = new OrthographicCamera();
        camera.setToOrtho(false, width, height);
        batch = new SpriteBatch();
        raindrop = new Sprite(dropImage);
        raindrop.setX(0);
        raindrop.setY(height);
        Tween.registerAccessor(Sprite.class, new RainDropAccessor());
        tweenManager = new TweenManager();
        Timeline.createSequence()
        .beginParallel()
            .push(Tween.to(raindrop, RainDropAccessor.POSITION_Y, 1.5f).target(0,0).ease(Bounce.OUT))
        .end()
        .start(tweenManager);

        stage = new Stage();
        Gdx.input.setInputProcessor(stage);
        Skin skin = new Skin(Gdx.files.internal("data/uiskin.json"));

        Table table = new Table();
        stage.addActor(table);
        table.setSize(260, 195);
        table.setPosition(190, 142);
        // table.align(Align.right | Align.bottom);

        table.debug();

        ImageButton button = new ImageButton(new SpriteDrawable(new Sprite(dropImage)));
//      TextButton button = new TextButton("Button 1", skin);
        button.addListener(new InputListener() {
            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                System.out.println("touchDown 1");
                raindrop.setY(height);
                tweenManager.killAll();
                Timeline.createSequence()
                .beginParallel()
                    .push(Tween.to(raindrop, RainDropAccessor.POSITION_Y, 1.5f).target(0,0).ease(Bounce.OUT))
                .end()
                .start(tweenManager);
                return true;
            }
        });
        table.add(button);
        // table.setTouchable(Touchable.disabled);

        Table table2 = new Table();
        stage.addActor(table2);
        table2.setFillParent(true);
        table2.bottom();

        TextButton button2 = new TextButton("Button 2", skin);
        button2.addListener(new ChangeListener() {
            public void changed (ChangeEvent event, Actor actor) {
                System.out.println("2!");
            }
        });
        button2.addListener(new InputListener() {
            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                System.out.println("touchDown 2");
                return false;
            }
        });
        table2.add(button2);
    }

    @Override
    public void update(float delta) {
        tweenManager.update(delta);
    }

    @Override
    public void draw(float delta) {
        Gdx.gl.glClearColor(0, 0, 0.2f, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        camera.update();
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        batch.draw(dropImage, raindrop.getX(), raindrop.getY());
        batch.end();
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();
        Table.drawDebug(stage);
    }

    @Override
    public void resize(int width, int height) {
        stage.setViewport(width, height, true);
    }

    @Override
    public void dispose() {
        stage.dispose();
        dropImage.dispose();
        batch.dispose();
    }

}

詳細はscene2dui
scene2dui.zip

← 非同期処理をIntentServiceで行う libGDX - タイルマップ →