今日のlibGDX(20150526):E. 開発記 2 ターゲット(的)

今日のlibGDX目次

http://snoopopo.hatenablog.com/entry/2015/04/27/220545

今日のテーマ:E. 開発記 2 ターゲット(的)

今回はゲームのゴール条件である的を作っていきます.

とりあえず作るソース

的クラスを作っていきます.これも的の情報を保持したjavabeansなクラスをとりあえず作る.

・Target.java

public class Target {
    private Image image = null;
    private int x = 2;
    private int y = 2;

    public Target(Image image){
        this.image = image;
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public int getX() {
        return x;
    }
    
    public void setX(int x) {
        this.x = x;
    }
    
    public int getY() {
        return y;
    }
    
    public void setY(int y) {
        this.y = y;
    }
}

的を表示する

・MainLisner.java

   @Override
    public void create() {
        stage = new Stage();
        boll = new Boll(new Image(new Texture("img/boll.gif")));
        target = new Target(new Image(new Texture("img/target.png")));
        stage.addActor(target.getImage());
        stage.addActor(boll.getImage());
    }

ボールのときとなんらかわりませんが、 stage.addActorする順番で画像が手前に表示されるか、後ろに表示されるかが変わるみたいです。

後にaddした方が手前に表示されます。

今回はボールのほうが手前に表示されたいので、後にaddしました。

的を複数表示する

的を複数表示するために、的クラスを持ったリストを作ります。

インスタンス生成したときに、座標を設定し、Actor.setPosition()までするようにTargetのコンストラクタを変更しました。

・MainLisner.java

List<Target> targetList = new ArrayList<Target>();

@Override
public void create() {
    targetList.add(new Target(200, 400, new Image(new Texture("img/target_red.png"))));
    targetList.add(new Target(400, 400, new Image(new Texture("img/target_blue.png"))));
    targetList.add(new Target(600, 400, new Image(new Texture("img/target_green.png"))));
    targetList.forEach(target -> stage.addActor(target.getImage()));
}

・Target,java

public Target(int x, int y, Image image){
    this.x = x;
    this.y = y;
    this.image = image;

    image.setPosition(this.x, this.y);
}

的とボールがあたる時の判定

ボール1つと複数の的それぞれを見ないといけないので、ここでもstream APIを使います。

・MainLisner.java

//的の動作
targetList.stream()
    .filter(target -> boll.getX() == target.getX())
    .filter(target -> boll.getY() == target.getY())
    .forEach(target -> target.disappear());

とりあえずボールの座標と、的の座標が一致することで当たり判定しています。

これだと実際は、左下の頂点しかみていないので、画像が重なってもあたり判定に引っかからないので、だめですね。 画像の大きさ分の判定が必要になりそうですが、そのあたりは後回しにします。

的がボールとあたったときの動作

的とボールがぶつかったら的が消えてほしいです。

Stage クラスにaddしているので、削除するようなメソッドがあるのかと思いましたが、すぐにわからなかったので、 今回は、画像を縮小して消えたように見せることにします。

的クラスに、消滅したときの動作を定義しておきます。

・Target.java

public void disappear(){
    image.setScale(0); //0まで縮小して消えた風に見せてる箇所
    setDisappear(); //消滅フラグON
}

f:id:snoopopo:20150526124443p:plain

このあと

次回は、タイトル画面→ゲーム→ゴール判定して、ゴールだった→タイトル画面へ戻る までを作者さんのプロジェクト見ながらやっていきます。(そういう動きがあるようなので)