-
Notifications
You must be signed in to change notification settings - Fork 0
ロケットの最寄りの星を探す
つまみ 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()
が呼び出される
- SceneManagerのスタックの最上部に来ると