[common] refactor ControlFactory

This commit is contained in:
2019-05-28 21:50:05 +03:00
parent 31cb20bf85
commit 74297dd9c7
18 changed files with 117 additions and 83 deletions

View File

@@ -10,8 +10,6 @@ import ru.m.tankz.bundle.ConfigBundle;
import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.bundle.LevelBundle;
import ru.m.tankz.control.ClientControlFactory;
import ru.m.tankz.control.IControlFactory;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.pack.Request;
import ru.m.tankz.proto.pack.Response;
@@ -32,7 +30,6 @@ class Init {
@:provide static var recordStorage:RecordStorage;
@:provide static var soundManager:SoundManager;
@:provide static var networkManager:NetworkManager;
@:provide static var controlFactory:IControlFactory;
@:provide static var popupManager:PopupManager;
@:provide static var connection:IConnection<Request, Response>;
@@ -58,7 +55,6 @@ class Init {
gameStorage = new GameStorage();
recordStorage = new RecordStorage();
soundManager = new SoundManager();
controlFactory = new ClientControlFactory();
popupManager = new PopupManager();
popupManager.showAnimateFactory = function(v) return new UnFadeAnimate(v, 100);

View File

@@ -2,7 +2,7 @@ package ru.m.tankz.control;
import ru.m.tankz.Type;
class ClientControlFactory extends BaseControlFactory {
class LocalControlFactory extends BaseControlFactory {
override private function buildHuman(id:PlayerId, index:Int):Control {
return new HumanControl(id, index);

View File

@@ -3,11 +3,11 @@ package ru.m.tankz.control;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.control.Control;
class ClientNetworkControl extends HumanControl {
class NetworkControl extends HumanControl {
@:provide private var network:NetworkManager;
override public function action(action:TankAction):Void {
network.action(action);
network.action(tankId, action);
}
}

View File

@@ -0,0 +1,10 @@
package ru.m.tankz.control;
import ru.m.tankz.Type;
class NetworkControlFactory extends BaseControlFactory {
override private function buildHuman(id:PlayerId, index:Int):Control {
return new NetworkControl(id, index);
}
}

View File

@@ -0,0 +1,28 @@
package ru.m.tankz.game;
import ru.m.tankz.control.LocalControlFactory;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.record.GameRecorder;
import ru.m.tankz.storage.RecordStorage;
class LocalGame extends GameRunner {
@:provide var recordStorage:RecordStorage;
private var recorder:GameRecorder;
public function new(state:GameState) {
super(state);
controlFactory = new LocalControlFactory();
recorder = new GameRecorder();
connect(recorder);
}
override public function onGameEvent(event:GameEvent):Void {
super.onGameEvent(event);
switch event {
case GameEvent.COMPLETE(_, _):
disconnect(recorder);
recordStorage.save(recorder.record);
case _:
}
}
}

View File

@@ -0,0 +1,33 @@
package ru.m.tankz.game;
import haxe.Unserializer;
import ru.m.tankz.control.NetworkControlFactory;
import ru.m.tankz.game.Game;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.pack.GameEventResponse;
class NetworkGame extends Game {
private var network:NetworkManager;
public function new(network:NetworkManager) {
super(new GameState(network.game.type, 0, network.game.level));
this.network = network;
this.controlFactory = new NetworkControlFactory();
network.gameEventSignal.connect(onGameEventProto);
}
private function onGameEventProto(game:GameEventResponse):Void {
var frame = game.frame;
var eventStr = game.event;
var event:GameEvent = Unserializer.run(eventStr);
gameEventSignal.emit(event);
}
override public function dispose():Void {
super.dispose();
network.gameEventSignal.disconnect(onGameEventProto);
}
}

View File

@@ -1,25 +0,0 @@
package ru.m.tankz.network;
import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.game.GameState;
import ru.m.tankz.game.Game;
class NetworkGame extends Game {
private var network:NetworkManager;
public function new(network:NetworkManager) {
super(new GameState(network.game.type, 0, network.game.level));
this.network = network;
network.gameSignal.connect(onGameChange);
}
private function onGameChange(game:GameProto):Void {
}
override public function dispose():Void {
super.dispose();
network.gameSignal.disconnect(onGameChange);
}
}

View File

@@ -1,7 +1,6 @@
package ru.m.tankz.network;
import ru.m.tankz.game.IGame;
import haxe.Unserializer;
import haxe.Serializer;
import haxework.signal.Signal;
import ru.m.connect.IConnection;
import ru.m.tankz.control.Control;
@@ -10,6 +9,8 @@ import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.proto.core.UserProto;
import ru.m.tankz.proto.game.GameChangeProto;
import ru.m.tankz.proto.pack.CreateGameRequest;
import ru.m.tankz.proto.pack.GameEventRequest;
import ru.m.tankz.proto.pack.GameEventResponse;
import ru.m.tankz.proto.pack.JoinGameRequest;
import ru.m.tankz.proto.pack.LeaveGameRequest;
import ru.m.tankz.proto.pack.ListGameRequest;
@@ -41,16 +42,17 @@ class NetworkManager {
public var listGameSignal:Signal<Array<GameProto>>;
public var gameSignal:Signal<GameProto>;
public var gameUpdateSignal:Signal<Array<GameChangeProto>>;
public var gameEventSignal:Signal<GameEventResponse>;
@:provide private var connection:ClientConnection;
@:provide private var storage:MultiplayerStorage;
@:provide private var _game:IGame;
public function new() {
stateSignal = new Signal();
listGameSignal = new Signal();
gameSignal = new Signal();
gameUpdateSignal = new Signal();
gameEventSignal = new Signal();
updateState(OFFLINE);
connection.handler.connect(onConnectionEvent);
connection.receiveHandler.connect(onResponse);
@@ -103,8 +105,10 @@ class NetworkManager {
connection.send(new Request().setStartGame(new StartGameRequest()));
}
public function action(action:TankAction):Void {
// ToDo: network
public function action(tankId:Int, action:TankAction):Void {
connection.send(new Request().setGameEvent(new GameEventRequest().setFrame(0).setEvent(
Serializer.run(GameEvent.ACTION(tankId, action))
)));
}
private function onConnectionEvent(event:ConnectionEvent):Void {
@@ -153,10 +157,7 @@ class NetworkManager {
game = packet.startGame.game;
gameSignal.emit(game);
} else if (packet.hasGameEvent()) {
var frame = packet.gameEvent.frame;
var eventStr = packet.gameEvent.event;
var event:GameEvent = Unserializer.run(eventStr);
_game.gameEventSignal.emit(event);
gameEventSignal.emit(packet.gameEvent);
}
}
}

View File

@@ -6,13 +6,10 @@ import haxework.view.VGroupView;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
import ru.m.tankz.game.IGame;
import ru.m.tankz.game.record.GamePlayer;
import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.game.record.GameRecorder;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.storage.RecordStorage;
import ru.m.tankz.Type;
import ru.m.tankz.view.game.GameView;
@@ -30,10 +27,8 @@ import ru.m.tankz.view.game.GameView;
@:provide("next") var nextState:GameState;
@:provide var switcher:FrameSwitcher;
@:provide var gameStorage:GameStorage;
@:provide var recordStorage:RecordStorage;
@:provide var game:IGame;
private var recorder:GameRecorder;
public function onShow():Void {
gameView.type = game.type;
@@ -44,11 +39,6 @@ import ru.m.tankz.view.game.GameView;
if (gameView.panel != null) {
game.connect(gameView.panel);
}
// ToDo:
if (!Std.is(game, GamePlayer)) {
recorder = new GameRecorder();
game.connect(recorder);
}
game.connect(this);
game.start();
}
@@ -64,10 +54,6 @@ import ru.m.tankz.view.game.GameView;
public function onGameEvent(event:GameEvent):Void {
switch event {
case GameEvent.COMPLETE(state, winner):
// ToDo:
if (recorder != null) {
recordStorage.save(recorder.record);
}
this.state = state;
nextState = switch next(winner) {
case Some(s):
@@ -100,7 +86,6 @@ import ru.m.tankz.view.game.GameView;
public function onHide():Void {
stop();
soundManager.stopAll();
recorder = null;
}
public function close():Void {

View File

@@ -7,9 +7,9 @@ import haxework.view.LabelView;
import haxework.view.VGroupView;
import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameRunner;
import ru.m.tankz.game.GameState;
import ru.m.tankz.game.IGame;
import ru.m.tankz.game.LocalGame;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.Type;
import ru.m.tankz.view.popup.LevelPopup;
@@ -36,7 +36,7 @@ import ru.m.tankz.view.popup.LevelPopup;
private function start(level:LevelConfig, preset:GamePreset):Void {
state.levelId = level.id;
state.presetId = preset.id;
game = new GameRunner(state);
game = new LocalGame(state);
switcher.change(GameFrame.ID);
}

View File

@@ -6,7 +6,7 @@ import haxework.view.list.VListView;
import haxework.view.TextView;
import haxework.view.VGroupView;
import ru.m.tankz.game.IGame;
import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.game.NetworkGame;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.proto.core.GameStateProto;