From ab02460b11e77c2f14f19665e9c3b146bab7cf66 Mon Sep 17 00:00:00 2001 From: shmyga Date: Tue, 30 Apr 2019 17:26:54 +0300 Subject: [PATCH] [common] add GameRecorder and GamePlayer --- .../haxe/ru/m/tankz/view/common/GameFrame.hx | 6 ++- .../haxe/ru/m/tankz/game/record/EventItem.hx | 6 +++ .../haxe/ru/m/tankz/game/record/GamePlayer.hx | 53 +++++++++++++++++++ .../ru/m/tankz/game/record/GameRecorder.hx | 40 ++++++++++++++ 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/common/haxe/ru/m/tankz/game/record/EventItem.hx create mode 100644 src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx create mode 100644 src/common/haxe/ru/m/tankz/game/record/GameRecorder.hx diff --git a/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx index 05b3d30..b60c8a3 100644 --- a/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx @@ -1,6 +1,5 @@ package ru.m.tankz.view.common; -import ru.m.tankz.game.GameTracer; import flash.events.Event; import haxe.ds.Option; import haxework.view.frame.FrameSwitcher; @@ -10,6 +9,7 @@ import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameRunner; import ru.m.tankz.game.GameState; import ru.m.tankz.game.IGame; +import ru.m.tankz.game.record.GameRecorder; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.render.Render; import ru.m.tankz.sound.SoundManager; @@ -32,6 +32,7 @@ class GameFrame extends GroupView implements GameListener { private var game:IGame; private var runner:GameRunner; + private var recorder:GameRecorder; private function get_render():Render { throw "Not implemented"; @@ -54,6 +55,8 @@ class GameFrame extends GroupView implements GameListener { game.connect(panel); } //game.connect(new GameTracer()); + recorder = new GameRecorder(); + game.connect(recorder); runner = new GameRunner(game); runner.start(state); content.addEventListener(Event.ENTER_FRAME, _redraw); @@ -76,6 +79,7 @@ class GameFrame extends GroupView implements GameListener { public function onGameEvent(event:GameEvent):Void { switch event { case GameEvent.COMPLETE(state, winner): + L.w("RECORD", Std.string(recorder.data)); result = state; this.state = switch runner.next() { case Some(s): diff --git a/src/common/haxe/ru/m/tankz/game/record/EventItem.hx b/src/common/haxe/ru/m/tankz/game/record/EventItem.hx new file mode 100644 index 0000000..686d643 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/record/EventItem.hx @@ -0,0 +1,6 @@ +package ru.m.tankz.game.record; + +typedef EventItem = { + frame:Int, + event:GameEvent +} diff --git a/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx b/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx new file mode 100644 index 0000000..8e599a5 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx @@ -0,0 +1,53 @@ +package ru.m.tankz.game.record; + +import flash.events.Event; +import flash.Lib; + +class GamePlayer { + + private var frame:Int; + private var game:IGame; + private var data:Array; + + public function new(game:IGame, data:Array) { + frame = 0; + this.game = game; + this.data = data; + } + + public function onGameEvent(event:GameEvent):Void { + switch event { + case GameEvent.COMPLETE(_, _): + stop(); + } + } + + public function start():Void { + frame = 0; + Lib.current.stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + public function stop():Void { + Lib.current.stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + private function onEnterFrame(event:Event):Void { + frame++; + var events = 0; + for (event in data) { + if (event.frame <= frame) { + events++; + game.gameEventSignal.emit(event.event); + switch event { + case GameEvent.COMPLETE(_, _): + stop(); + } + } else { + break; + } + } + if (event > 0) { + data = data.slice(events); + } + } +} diff --git a/src/common/haxe/ru/m/tankz/game/record/GameRecorder.hx b/src/common/haxe/ru/m/tankz/game/record/GameRecorder.hx new file mode 100644 index 0000000..2f3a860 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/record/GameRecorder.hx @@ -0,0 +1,40 @@ +package ru.m.tankz.game.record; + +import flash.events.Event; +import flash.Lib; +import ru.m.tankz.game.Game.GameListener; + +class GameRecorder implements GameListener { + + private var frame:Int; + public var data(default, null):Array; + + public function new() { + frame = 0; + data = []; + } + + public function onGameEvent(event:GameEvent):Void { + switch event { + case GameEvent.START(_): + start(); + case GameEvent.COMPLETE(_, _): + stop(); + case _: + } + data.push({frame: frame, event: event}); + } + + public function start():Void { + frame = 0; + Lib.current.stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + public function stop():Void { + Lib.current.stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + private function onEnterFrame(event:Event):Void { + frame++; + } +}