Slide 1

Slide 1 text

Α͘Θ͔Μͳ͍͚Ͳ ࠷ۙͭͬͯ͘ΔήʔϜͰ RxJava ͔ͭͬͯΈͯΔ RxJavaษڧձ 2015.3.17 @slightair

Slide 2

Slide 2 text

※ Android ͷ࿩͸ग़·ͤΜ

Slide 3

Slide 3 text

ήʔϜͭͬͯ͘·͢

Slide 4

Slide 4 text

͜Μͳ΍ͭ

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

஍໘͕ྲྀΕͯ͘Δ ϑϦοΫͰࠨӈʹಈ͘ λοϓ͢ΔͱͭͿΕΔ ͸ͳ͢ͱδϟϯϓ͢Δ Ωϟϥʹ߹Θͤͯ Χϝϥ͕ಈ͘

Slide 7

Slide 7 text

LibGDX + RxJava

Slide 8

Slide 8 text

1. Input

Slide 9

Slide 9 text

ೖྗΠϕϯτ • touchDown -> δϟϯϓ४උ • tap -> δϟϯϓ • fling -> ࠨӈҠಈ • panStop -> δϟϯϓΩϟϯηϧ

Slide 10

Slide 10 text

GameMaster Input Character ը໘͕ λοϓ͞ΕͨΜ͕ͩ ͪΐͬͱ δϟϯϓͯ͠ΈΖ

Slide 11

Slide 11 text

GameMaster Input Character ը໘͕ λοϓ͞ΕͨΜ͕ͩ ͪΐͬͱ δϟϯϓͯ͠ΈΖ

Slide 12

Slide 12 text

GameMaster Input Character ήʔϜʹؔ܎ͦ͠͏ͳ Πϕϯτ؂ࢹ͠·͢ ͍ͭδϟϯϓ͢Ε͹͍͍͔ ؂ࢹ͠·͢ ͍ͬͯ͏͔Πϕϯτ શ෦؂ࢹͤͯ͞ observable͘Ε observable͘Ε

Slide 13

Slide 13 text

// Input PublishSubject 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 getActions() {return subject;}

Slide 14

Slide 14 text

// GameMaster public enum Action { CHARACTER_MOVE_LEFT, CHARACTER_MOVE_RIG ! public GameMaster(Observable input) { this.input = input; this.character = new Character(input); … ! // Character public enum Action { MOVE_LEFT, MOVE_RIGHT, JUMP, … } public Character(Observable input) { this.input = input; } ! public Observable getActions() { return input.map(new ActionConverter()); } !

Slide 15

Slide 15 text

// Character private class ActionConverter implements Func1 { ! @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; }

Slide 16

Slide 16 text

2. Character ModelInstance

Slide 17

Slide 17 text

Model Instance • LibGDX (3D) Ͱඳը͢ΔϞσϧΛ දݱ͢ΔΫϥε • xyz࠲ඪ ճస εέʔϧ ͳͲΛࢦఆ͢Δ • ύϥϝʔλΛม͑ΔΞχϝʔγϣϯΛ࣮ߦ͢Δ

Slide 18

Slide 18 text

ҠಈͱΞχϝʔγϣϯ • δϟϯϓ४උ -> ্͔Βԡ͞ΕͨΑ͏ʹͭͿΕΔ • δϟϯϓ -> ͭͿΕΛ໭্ͭͭ͠ԼҠಈ • ࠨӈҠಈ -> ࠨӈʹඳըҐஔΛҠಈ • δϟϯϓΩϟϯηϧ -> ͭͿΕΛ໭͢

Slide 19

Slide 19 text

Character CharacterModelInstance getActions() Observable ΩϟϥΫλʔʹى͖ͨ ΞΫγϣϯΛ؂ࢹ

Slide 20

Slide 20 text

// CharacterModelInstance public CharacterModelInstance(Model model, Character character) { super(model); … character.getActions().subscribe(new Action1() { @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; …

Slide 21

Slide 21 text

3. Camera

Slide 22

Slide 22 text

ΧϝϥͷҠಈ • ΩϟϥΫλʔʹ߹Θͤͯಈ͘ • ඍົʹΞχϝʔγϣϯೖͬͯΔ • Exponential Ease Out • TweenEngine Ͱ࣮૷

Slide 23

Slide 23 text

Character CameraMan getActions() Observable ΩϟϥΫλʔʹى͖ͨ ΞΫγϣϯΛ؂ࢹ

Slide 24

Slide 24 text

// CameraMan public CameraMan(final OrthographicCamera camera, Character character) { this.camera = camera; this.character = character; character.getActions().subscribe(new Action1() { @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; …

Slide 25

Slide 25 text

4. Ground Blocks

Slide 26

Slide 26 text

஍໘ϒϩοΫ • ԞʹϒϩοΫΛൃੜͤ͞Δ • खલʹྲྀΕͯ͘Δ • खલͷϥΠϯ͕ফ͑ͯ͘ • ͜Εͷ܁Γฦ͠ • ήʔϜϧʔϓͰGameMasterͷupdate() Λఆظతʹୟ͍ͯϒϩοΫੜ੒

Slide 27

Slide 27 text

0.12 0.32 0.10 0.21 update update update update

Slide 28

Slide 28 text

0.12 0.32 0.14 0.21 update update update update 0.12 0.44 0.58 0.79 Observable timeline = updates.scan((t1, t2) -> return t1 + t2);

Slide 29

Slide 29 text

// GameMaster private PublishSubject actions = PublishSubject.create(); public GameMaster(Observable 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());

Slide 30

Slide 30 text

0.12 0.44 0.58 0.79 timeline emits.onNext(Action.GROUND_SPAWN_NEW_LINE); GroundLineEmitter ActionProcessor GroundGenerator#next()

Slide 31

Slide 31 text

Ground Generator Ground Ground Layouter Ground Line #MPDL #MPDL #MPDL #MPDL *OTUBODF #MPDL *OTUBODF #MPDL *OTUBODF getNewLines() putLine(line) Layout next()

Slide 32

Slide 32 text

No content