[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

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