LoginSignup
6
5

More than 5 years have passed since last update.

ゲーム開発日記 ~libGDXAPI解説3 Spriteクラス~

Last updated at Posted at 2014-08-07

今回のコード

MyGdxGame.java
package com.me.mygdxgame;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class MyGdxGame implements ApplicationListener {
    private OrthographicCamera camera;
    private SpriteBatch batch;
    private Texture texture;
    private Sprite sprite;

    @Override
    public void create() {
        float w = Gdx.graphics.getWidth();
        float h = Gdx.graphics.getHeight();
         camera = new OrthographicCamera(1,  h/w);
        batch = new SpriteBatch();
        texture = new Texture(Gdx.files.internal("data/libgdx.png"));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

        TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);

        sprite = new Sprite(region);
        sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
        sprite.setOrigin(sprite.getWidth() / 2, sprite.getHeight() / 2);
        sprite.setCenter(.2f, .2f);
        sprite.setRotation(45);
        sprite.setScale(.5f);
        sprite.setColor(Color.RED);
//      sprite.setPosition(-sprite.getWidth() / 2, -sprite.getHeight() / 2);
    }

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

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        sprite.draw(batch);
        batch.end();
    }

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

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}

Spriteクラス

さて、前回はSpriteBatch、TextureRegionを使用して描画しました。
今回は、Spriteクラスを使用して描画を行っていきます。

そもそも「スプライト」とは、簡単に言うと、プレイヤーとかアイテムとか敵キャラとか、ゲーム内のオブジェクトのことです。
このスプライトの座標を変更することで、キャラを移動させたりします。
こちらにもう少し詳しいことが書いてあるので興味ある方は見てみて下さい。

ひとまず、サンプルコード内でどの用にSpriteを使用しているか見てみましょう。
Spriteを使用している箇所を抜き出してみました。

// create()内
sprite = new Sprite(region);
sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
sprite.setOrigin(sprite.getWidth() / 2, sprite.getHeight() / 2);
sprite.setPosition(-sprite.getWidth() / 2, -sprite.getHeight() / 2);
...

// render()内
sprite.draw(batch);
...

このサンプルコード内でSpriteを使用しているのは以上となっております。
まず、TextureRegionから、スプライトインスタンスを生成しています。
次に、Spriteの縦、横のサイズを設定し、原点、左下角の座標を設定しています。
上記で、座標等のパラメータを持つと言いましたが、確かにそのような設定をしていることが分かります。
camera.position.set(camera.viewportWidth / 2,camera.viewportHeight / 2, 0);
camera.update();
そして、render()メソッド内では、前回取り上げたSpriteBatchを使用し描画を行っているように見えます。

とりあえず実行してみます。

スクリーンショット 2014-08-01 01.36.07.png

画面のど真ん中に画像が描画されました。
まだカメラの位置を修正していないのに中央に綺麗に表示されているのは、位置の設定で画像の中心がちょうど(0, 0)に来る用にしてあるからです。

// 左下角を(-幅/2, -高さ/2)にしている。
sprite.setPosition(-sprite.getWidth() / 2, -sprite.getHeight() / 2);

さらっと書きましたが、
Spriteはオブジェクト個別のパラメータを持つ
という特徴があります。

つまり、Spriteオブジェクトに座標、回転、スケールなど設定することで、指定した通りの状態で描画してくれるようになります。

前回のSpriteBatchで描画した際にはテクスチャをレンダリングする度に座標を指定しなければならなかったのですが、今回はその様なことはしておりません。

この性質を使用して、2Dゲームのキャラクターの移動等を実装していく様になります。

それでは、試しにオブジェクトのパラメータを変更してみます。

sprite.setCenter(.2f, .2f);
sprite.setRotation(45);
sprite.setScale(.5f);
        sprite.setColor(Color.RED);

スプライトの中心を(0.2, 0.2)に、角度を45°に、スケールを半分にして、カラーを赤にしてみました。

スクリーンショット 2014-08-07 19.12.17.png

設定したパラメータがレンダリングに反映されています。
実は、Spriteに回転やスケーリングを適用すると、想定外の事が起こることもあります。
libGDXのSprite座標の謎に詳細が書かれています。

だいぶ端折りましたが、以上でSpriteクラスとlibGDXハローワールドの説明を終わりとし、次回からは私が制作したゲームを基に解説をしていきたいと思います。

まだ触れていないこともたくさんありますので、気になる方は公式Wikiを見たり、自分で試しに色々いじってみてください


libGDX公式サイト
公式Wiki
APIリファレンス

私が制作したゲーム

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5