Upgrade to Pro — share decks privately, control downloads, hide ads and more …

よくわかんないけど最近つくってるゲームで RxJava つかってみてる

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

よくわかんないけど最近つくってるゲームで RxJava つかってみてる

社内RxJava勉強会で発表した時の資料です。

Avatar for Tomohiro Moro

Tomohiro Moro

March 18, 2015
Tweet

More Decks by Tomohiro Moro

Other Decks in Programming

Transcript

  1. ೖྗΠϕϯτ • touchDown -> δϟϯϓ४උ • tap -> δϟϯϓ •

    fling -> ࠨӈҠಈ • panStop -> δϟϯϓΩϟϯηϧ
  2. // Input PublishSubject<GameMaster.Action> subject = PublishSubject.create(); ! @Override public boolean

    touchDown(float x, float y, int pointer, int button) { subject.onNext(GameMaster.Action.CHARACTER_PREPARE_JUM return false; } ! @Override public boolean tap(float x, float y, int count, int button) { subject.onNext(GameMaster.Action.CHARACTER_JUMP); return false; } ! … ! public Observable<GameMaster.Action> getActions() {return subject;}
  3. // GameMaster public enum Action { CHARACTER_MOVE_LEFT, CHARACTER_MOVE_RIG ! public

    GameMaster(Observable<Action> input) { this.input = input; this.character = new Character(input); … ! // Character public enum Action { MOVE_LEFT, MOVE_RIGHT, JUMP, … } public Character(Observable<GameMaster.Action> input) { this.input = input; } ! public Observable<Action> getActions() { return input.map(new ActionConverter()); } !
  4. // Character private class ActionConverter implements Func1<GameMaster.Action, Action> { !

    @Override public Action call(GameMaster.Action action) { Action result = null; switch (action) { case CHARACTER_MOVE_LEFT: result = Action.MOVE_LEFT; break; case CHARACTER_MOVE_RIGHT: result = Action.MOVE_RIGHT; break; case CHARACTER_PREPARE_JUMP: result = Action.PREPARE_JUMP; break; … } return result; }
  5. Model Instance • LibGDX (3D) Ͱඳը͢ΔϞσϧΛ දݱ͢ΔΫϥε • xyz࠲ඪ ճస

    εέʔϧ ͳͲΛࢦఆ͢Δ • ύϥϝʔλΛม͑ΔΞχϝʔγϣϯΛ࣮ߦ͢Δ
  6. ҠಈͱΞχϝʔγϣϯ • δϟϯϓ४උ -> ্͔Βԡ͞ΕͨΑ͏ʹͭͿΕΔ • δϟϯϓ -> ͭͿΕΛ໭্ͭͭ͠ԼҠಈ •

    ࠨӈҠಈ -> ࠨӈʹඳըҐஔΛҠಈ • δϟϯϓΩϟϯηϧ -> ͭͿΕΛ໭͢
  7. // CharacterModelInstance public CharacterModelInstance(Model model, Character character) { super(model); …

    character.getActions().subscribe(new Action1<Character.Action>() { @Override public void call(Character.Action action) { switch (action) { case MOVE_LEFT: transform.translate(GroundBlockModel.SIZE, 0.0f, 0.0f); break; case MOVE_RIGHT: transform.translate(-GroundBlockModel.SIZE, 0.0f, 0.0f); break; case PREPARE_JUMP: animationController.animate("shrink", 0.0f); break; …
  8. // CameraMan public CameraMan(final OrthographicCamera camera, Character character) { this.camera

    = camera; this.character = character; character.getActions().subscribe(new Action1<Character.Action>() { @Override public void call(Character.Action action) { switch (action) { case MOVE_LEFT: Tween.to(camera, CameraTween.POSITION_X, cameraMoveDuration) .targetRelative(-GroundBlockModel.SIZE) .ease(TweenEquations.easeOutExpo) .start(tweenManager); break; …
  9. 0.12 0.32 0.14 0.21 update update update update 0.12 0.44

    0.58 0.79 Observable<Float> timeline = updates.scan((t1, t2) -> return t1 + t2);
  10. // GameMaster private PublishSubject<Action> actions = PublishSubject.create(); public GameMaster(Observable<Action> input)

    { this.input = input; this.character = new Character(input); this.groundGenerator = new GroundGenerator(); this.groundLineEmitter = new GroundLineEmitter(timeline, GROUND_LINE_SPAWN_INTERVAL); actions .mergeWith(input) .mergeWith(groundLineEmitter.getEmits()) .subscribe(new ActionProcessor());
  11. Ground Generator Ground Ground Layouter Ground Line #MPDL #MPDL #MPDL

    #MPDL *OTUBODF #MPDL *OTUBODF #MPDL *OTUBODF getNewLines() putLine(line) Layout next()