[common] add GameRecorder and GamePlayer
This commit is contained in:
@@ -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):
|
||||
|
||||
6
src/common/haxe/ru/m/tankz/game/record/EventItem.hx
Normal file
6
src/common/haxe/ru/m/tankz/game/record/EventItem.hx
Normal file
@@ -0,0 +1,6 @@
|
||||
package ru.m.tankz.game.record;
|
||||
|
||||
typedef EventItem = {
|
||||
frame:Int,
|
||||
event:GameEvent
|
||||
}
|
||||
53
src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx
Normal file
53
src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
40
src/common/haxe/ru/m/tankz/game/record/GameRecorder.hx
Normal file
40
src/common/haxe/ru/m/tankz/game/record/GameRecorder.hx
Normal 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++;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user