[common] add GameRecorder and GamePlayer
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
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