Skip to content

ロケットの最寄りの星を探す

つまみ edited this page Dec 17, 2020 · 3 revisions

次のような方法でロケットの最寄りの星を探すことができます。 この例ではロケットに最も近いEventStar(ミニゲームなどのシーンを持った星、まだ作ってない)を探し、そのシーンに遷移します。

class NearestStarSearchExample extends GameController {
    
    private Rocket rocket;
    private ExampleGameModel model;
    private ExampleGameView view;
    private Timer eventStarSearcher;
    
    public NearestStarSearchExample(ExampleGameModel model, ExampleGameView view) {
     	super(model, view);
        this.model = model;
        this.view  = view;
        this.rocket = model.getRocket();
        eventStarSearcher = new Timer(100, e -> searchEventStar());
    }
                  
    private void searchEventStar() {
        SpaceMap2D map = model.getRocketFloorMap();
        
        // ロケットの当たり判定の長方形を取得する
        Rectangle searchRange = rocket.getHitJudgeRectangle();

        // 探索範囲を広げるために一回り大きくする
        searchRange.grow(100, 100);
        
        Optional<EventStar> nearestEventStar = 
            	// 探索範囲に存在するシンボルのStreamを得る
                map.rangeSymbolStream(searchRange)
            	// EventStar(まだ作ってないけどシーン遷移する星)でなければ排除
                .filter(e -> e instanceof EventStar)
            	// その星が接触していなければ排除
                .filter(e -> rocket.isTouched(e))
            	// ロケットから最も近いものを選択
                .min(Comparator.comparingDouble(
                        o -> rocket.getPoint().distance(o.getPoint())));
        
        // そのようなものが見つからなかったら終了
        if(nearestEventStar.isEmpty()) return;
        
        GameScene scene = nearestEventStar.get().getScene();
        
       	// SceneManagerのインスタンスを取得してシーンを追加
	SceneManager.getInstance().push(scene);
    }
    
    
    // タイマーの停止/再開の処理
    @Override
    public void suspend() {
		eventStarSearcher.stop();
    }

    @Override
    public void resume() {
        eventStarSearcher.start();
    }
}

補足

  • Optional<E>
    • nullかもしれない値が入る
    • isEmpty() でnullチェック、get() で値の取得ができる
  • Rectangle#grow
    • grow(h, v) で今の長方形を中心に h だけ横に伸ばし、v だけ縦に伸ばす
  • Comparator#comparingDouble
    • なんかIDEAが提案してきたのでよくわからん、doubleを比較できるおまじない
  • instanceof 演算子
    • このクラスですか?または継承していますか?というのを判定できる演算子
  • Symbol#isTouched
    • シンボルの接触判定ができる
  • Suspendable#suspend Suspendable#resume
    • SceneManagerのスタックの最上部に来ると resume() が呼び出される
    • SceneManagerのスタックの最上部から下にうつると suspend() が呼び出される