[common] add GameRecorder and GamePlayer

This commit is contained in:
2019-04-30 17:26:54 +03:00
parent fc18e2e0b7
commit ab02460b11
4 changed files with 104 additions and 1 deletions

View File

@@ -1,6 +1,5 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import ru.m.tankz.game.GameTracer;
import flash.events.Event; import flash.events.Event;
import haxe.ds.Option; import haxe.ds.Option;
import haxework.view.frame.FrameSwitcher; 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.GameRunner;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.game.IGame; import ru.m.tankz.game.IGame;
import ru.m.tankz.game.record.GameRecorder;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.render.Render; import ru.m.tankz.render.Render;
import ru.m.tankz.sound.SoundManager; import ru.m.tankz.sound.SoundManager;
@@ -32,6 +32,7 @@ class GameFrame extends GroupView implements GameListener {
private var game:IGame; private var game:IGame;
private var runner:GameRunner; private var runner:GameRunner;
private var recorder:GameRecorder;
private function get_render():Render { private function get_render():Render {
throw "Not implemented"; throw "Not implemented";
@@ -54,6 +55,8 @@ class GameFrame extends GroupView implements GameListener {
game.connect(panel); game.connect(panel);
} }
//game.connect(new GameTracer()); //game.connect(new GameTracer());
recorder = new GameRecorder();
game.connect(recorder);
runner = new GameRunner(game); runner = new GameRunner(game);
runner.start(state); runner.start(state);
content.addEventListener(Event.ENTER_FRAME, _redraw); content.addEventListener(Event.ENTER_FRAME, _redraw);
@@ -76,6 +79,7 @@ class GameFrame extends GroupView implements GameListener {
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case GameEvent.COMPLETE(state, winner): case GameEvent.COMPLETE(state, winner):
L.w("RECORD", Std.string(recorder.data));
result = state; result = state;
this.state = switch runner.next() { this.state = switch runner.next() {
case Some(s): case Some(s):

View File

@@ -0,0 +1,6 @@
package ru.m.tankz.game.record;
typedef EventItem = {
frame:Int,
event:GameEvent
}

View File

@@ -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<EventItem>;
public function new(game:IGame, data:Array<EventItem>) {
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);
}
}
}

View File

@@ -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<EventItem>;
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++;
}
}