[network] update

This commit is contained in:
2019-05-31 15:47:16 +03:00
parent 7115ea8ac2
commit fb9a28c126
29 changed files with 274 additions and 221 deletions

View File

@@ -17,6 +17,7 @@ class NetworkGame extends Game {
this.network = network;
this.controlFactory = new NetworkControlFactory();
network.gameEventSignal.connect(onGameEventProto);
network.stateSignal.connect(onConnectionState);
}
private function onGameEventProto(game:GameEventResponse):Void {
@@ -26,6 +27,16 @@ class NetworkGame extends Game {
gameEventSignal.emit(event);
}
private function onConnectionState(state:ConnectionState):Void {
switch state {
case ONLINE(user):
if (network.game != null) {
network.joinGame(network.game.id);
}
case _:
}
}
override public function start():Void {
var player = Lambda.find(network.game.players, function(player) return player.user.uuid == network.user.uuid);
if (player != null) {
@@ -37,5 +48,6 @@ class NetworkGame extends Game {
override public function dispose():Void {
super.dispose();
network.gameEventSignal.disconnect(onGameEventProto);
network.stateSignal.disconnect(onConnectionState);
}
}

View File

@@ -47,7 +47,11 @@ class NetworkManager {
@:provide private var connection:ClientConnection;
@:provide private var storage:MultiplayerStorage;
private var reconnectTimer:Timer;
private var reconnectDelay:Int;
public function new() {
reconnectDelay = 500;
stateSignal = new Signal();
listGameSignal = new Signal();
gameSignal = new Signal();
@@ -56,10 +60,7 @@ class NetworkManager {
updateState(OFFLINE);
connection.handler.connect(onConnectionEvent);
connection.receiveHandler.connect(onResponse);
var user = storage.user;
if (user != null) {
login(user.name, user.uuid);
}
connect();
}
private function updateState(value:ConnectionState):Void {
@@ -68,17 +69,12 @@ class NetworkManager {
}
public function login(name:String, uuid:String = null):Void {
updateState(CONNECT);
connection.connect().then(function(c:ClientConnection) {
updateState(LOGIN);
c.send(new Request().setLogin(
new LoginRequest()
.setUuid(uuid)
.setName(name)
));
}).catchError(function(error) {
updateState(ERROR(error));
});
updateState(LOGIN);
connection.send(new Request().setLogin(
new LoginRequest()
.setUuid(uuid)
.setName(name)
));
}
public function logout():Void {
@@ -93,8 +89,8 @@ class NetworkManager {
connection.send(new Request().setCreateGame(new CreateGameRequest().setType(type).setLevel(level)));
}
public function joinGame(gameId:Int):Void {
connection.send(new Request().setJoinGame(new JoinGameRequest().setGameId(gameId)));
public function joinGame(gameId:Int, restore:Bool = false):Void {
connection.send(new Request().setJoinGame(new JoinGameRequest().setGameId(gameId).setRestore(restore)));
}
public function leaveGame():Void {
@@ -111,18 +107,39 @@ class NetworkManager {
)));
}
private function connect():Void {
if (reconnectTimer != null) {
reconnectTimer.stop();
reconnectTimer = null;
}
reconnectTimer = null;
updateState(CONNECT);
connection.connect().catchError(function(error) {});
}
private function reconnect():Void {
reconnectDelay = Std.int(Math.min(reconnectDelay * 2, 10000));
if (reconnectTimer == null) {
reconnectTimer = Timer.delay(connect, reconnectDelay);
}
}
private function onConnectionEvent(event:ConnectionEvent):Void {
updateState(switch event {
case CONNECTED:
L.d('Network', '$event');
CONNECTED;
case DISCONNECTED:
L.d('Network', '$event');
OFFLINE;
case ERROR(error):
L.e('Network', '$error', error);
ERROR(error);
case CONNECTED: CONNECTED;
case DISCONNECTED: OFFLINE;
case ERROR(error): ERROR(error);
});
switch event {
case CONNECTED:
reconnectDelay = 500;
var user = storage.user;
if (user != null) {
login(user.name, user.uuid);
}
case DISCONNECTED | ERROR(_):
reconnect();
}
}
private function onResponse(packet:Response):Void {

View File

@@ -3,18 +3,30 @@ package ru.m.tankz.view;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import haxework.resources.IResources;
import haxework.view.ButtonView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.LabelView;
import haxework.view.VGroupView;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.view.popup.LoginPopup;
@:template class ClientView extends FrameSwitcher {
@:template class ClientView extends VGroupView {
@:view("switcher") var switcherView:FrameSwitcher;
@:view var username:LabelView;
@:view("login") var loginButton:ButtonView;
@:view("logout") var logoutButton:ButtonView;
@:provide var network:NetworkManager;
@:provide var resources:IResources;
@:provide var switcher:FrameSwitcher;
@:provide var soundManager:SoundManager;
public function init():Void {
resources.text.put('version', '${Const.VERSION}');
switcher = this;
switcher = switcherView;
network.stateSignal.connect(onConnectionState);
onConnectionState(network.state);
}
public function launch():Void {
@@ -22,11 +34,45 @@ import ru.m.tankz.sound.SoundManager;
content.stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):Void {
switch event.keyCode {
case Keyboard.ESCAPE:
change(StartFrame.ID);
switcher.change(StartFrame.ID);
case Keyboard.M:
soundManager.mute = !soundManager.mute;
}
});
change(StartFrame.ID);
switcher.change(StartFrame.ID);
}
private function onConnectionState(state:ConnectionState):Void {
L.d("ClientView", 'onConnectionState: ${state}');
switch state {
case ONLINE(user):
username.text = user.name;
logoutButton.visible = true;
loginButton.visible = false;
case CONNECTED:
username.text = "";
logoutButton.visible = false;
loginButton.visible = true;
case ERROR(error):
L.e("ClientView", 'onConnectionState: ERROR', error);
case _:
username.text = "";
logoutButton.visible = false;
loginButton.visible = false;
}
}
private function login():Void {
LoginPopup.instance.show().then(function(user:User):Void {
L.d("Login", 'user: $user');
});
}
private function logout():Void {
network.logout();
}
private function close():Void {
switcher.change(StartFrame.ID);
}
}

View File

@@ -1,21 +1,51 @@
---
$type: haxework.view.frame.FrameSwitcher
geometry.size.stretch: true
skinId: dark
views:
- id: start
$type: ru.m.tankz.view.StartFrame
- id: level
$type: ru.m.tankz.view.LevelFrame
- id: game
$type: ru.m.tankz.view.GameFrame
- id: result
$type: ru.m.tankz.view.ResultFrame
- id: settings
$type: ru.m.tankz.view.SettingsFrame
- id: record
$type: ru.m.tankz.view.RecordFrame
- id: game_list
$type: ru.m.tankz.view.network.GameListFrame
- id: game_room
$type: ru.m.tankz.view.network.GameRoomFrame
- $type: haxework.view.frame.FrameSwitcher
id: switcher
geometry.size.stretch: true
skinId: dark
views:
- id: start
$type: ru.m.tankz.view.StartFrame
- id: level
$type: ru.m.tankz.view.LevelFrame
- id: game
$type: ru.m.tankz.view.GameFrame
- id: result
$type: ru.m.tankz.view.ResultFrame
- id: settings
$type: ru.m.tankz.view.SettingsFrame
- id: record
$type: ru.m.tankz.view.RecordFrame
- id: game_list
$type: ru.m.tankz.view.network.GameListFrame
- id: game_room
$type: ru.m.tankz.view.network.GameRoomFrame
- $type: haxework.view.HGroupView
skinId: panel
layout.margin: 10
views:
- id: settings
$type: haxework.view.ButtonView
skinId: button.settings
+onPress: $code:switcher.change('settings')
- $type: haxework.view.SpriteView
geometry.size.width: 50%
- id: username
$type: haxework.view.LabelView
skinId: text
- id: login
$type: haxework.view.ButtonView
skinId: button.login
+onPress: $code:login()
- id: logout
$type: haxework.view.ButtonView
skinId: button.logout
+onPress: $code:logout()
visible: false
- $type: haxework.view.SpriteView
geometry.size.width: 50%
- id: close
$type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:close()

View File

@@ -5,10 +5,3 @@ views:
views:
- id: game
$type: ru.m.tankz.view.game.GameView
# - $type: haxework.view.HGroupView
# skinId: panel
# views:
# - id: close
# $type: haxework.view.ButtonView
# skinId: button.close
# +onPress: $code:close()

View File

@@ -16,9 +16,3 @@ views:
factory: $this:levelViewFactory
+onItemSelect: $this:onLevelSelect
geometry.padding: 10
- $type: haxework.view.HGroupView
skinId: panel
views:
- $type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:switcher.change('start')

View File

@@ -25,8 +25,4 @@ import ru.m.tankz.storage.RecordStorage;
private function onRecordSelect(item:IListItemView<GameRecordInfo>):Void {
}
private function close() {
switcher.change(StartFrame.ID);
}
}

View File

@@ -16,9 +16,3 @@ views:
scroll:
$type: haxework.view.list.VScrollBarView
skinId: scroll
- $type: haxework.view.HGroupView
skinId: panel
views:
- $type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:close()

View File

@@ -14,7 +14,6 @@ import ru.m.tankz.view.common.LifeView;
public static var ID(default, never):String = "result";
@:view("result") var resultView:DataView<PlayerState, LifeView>;
@:view("next") var nextButton:ButtonView;
@:view("level") var levelLabel:LabelView;
@:provide var frames:FrameSwitcher;
@@ -37,7 +36,6 @@ import ru.m.tankz.view.common.LifeView;
public function onShow() {
resultView.data = Lambda.array(state.players);
levelLabel.text = 'Level ${state.levelId}';
nextButton.visible = nextState != null;
}
private function next() {

View File

@@ -14,16 +14,3 @@ views:
$type: haxework.view.layout.VerticalLayout
hAlign: right
margin: 10
- $type: haxework.view.HGroupView
skinId: panel
views:
- id: close
$type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:close()
- $type: haxework.view.SpriteView
geometry.size.width: 100%
- id: next
$type: haxework.view.ButtonView
skinId: button.next
+onPress: $code:next()

View File

@@ -1,11 +1,7 @@
package ru.m.tankz.view;
import haxework.view.frame.FrameSwitcher;
import haxework.view.VGroupView;
@:template class SettingsFrame extends VGroupView {
public static var ID(default, never):String = "settings";
@:provide var switcher:FrameSwitcher;
}

View File

@@ -13,9 +13,3 @@ views:
controlIndex: 0
- $type: ru.m.tankz.view.settings.SettingsEditor
controlIndex: 1
- $type: haxework.view.HGroupView
skinId: panel
views:
- $type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:switcher.change('start')

View File

@@ -1,12 +1,12 @@
package ru.m.tankz.view;
import haxework.view.ButtonView;
import haxework.view.LabelView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.VGroupView;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.Type.GameType;
import ru.m.tankz.view.network.GameListFrame;
import ru.m.tankz.view.network.GameRoomFrame;
import ru.m.tankz.view.popup.FontPopup;
import ru.m.tankz.view.popup.LoginPopup;
@@ -14,54 +14,34 @@ import ru.m.tankz.view.popup.LoginPopup;
public static var ID(default, never):String = "start";
@:view var username:LabelView;
@:view("login") var loginButton:ButtonView;
@:view("logout") var logoutButton:ButtonView;
@:view("network") var networkButton:ButtonView;
@:provide var state:GameState;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
private var fontPopup:FontPopup;
public function onShow():Void {
onConnectionState(network.state);
network.stateSignal.connect(onConnectionState);
}
public function onHide():Void {
network.stateSignal.disconnect(onConnectionState);
}
private function onConnectionState(state:ConnectionState):Void {
trace("state", state);
setUser(switch state {
case ONLINE(user): user;
case _: null;
});
}
private function setUser(value:User):Void {
username.text = value == null ? "" : value.name;
loginButton.visible = value == null;
logoutButton.visible = value != null;
networkButton.disabled = value == null;
}
private function startGame(type:GameType):Void {
state = new GameState(type);
switcher.change(LevelFrame.ID);
}
private function login():Void {
LoginPopup.instance.show().then(function(user:User):Void {
L.d("Login", 'user: $user');
});
}
private function logout():Void {
network.logout();
private function startNetwork():Void {
switch network.state {
case ONLINE(user):
if (network.game != null) {
switcher.change(GameRoomFrame.ID);
network.joinGame(network.game.id, true);
} else {
switcher.change(GameListFrame.ID);
}
case CONNECTED:
LoginPopup.instance.show().then(function(user):Void {
if (user != null) {
switcher.change(GameListFrame.ID);
}
});
case _:
}
}
private function choiceFont():Void {

View File

@@ -28,31 +28,9 @@ views:
- id: network
$type: haxework.view.ButtonView
skinId: button
+onPress: $code:switcher.change('game_list')
+onPress: $code:startNetwork()
text: Network
disabled: true
- $type: haxework.view.HGroupView
skinId: panel
views:
- id: settings
$type: haxework.view.ButtonView
skinId: button.settings
+onPress: $code:switcher.change('settings')
- $type: haxework.view.SpriteView
geometry.size.width: 100%
- id: username
$type: haxework.view.LabelView
skinId: text
geometry.margin.right: 10
- id: login
$type: haxework.view.ButtonView
skinId: button.login
+onPress: $code:login()
- id: logout
$type: haxework.view.ButtonView
skinId: button.logout
+onPress: $code:logout()
visible: false
#disabled: true
- $type: haxework.view.LabelView
geometry.hAlign: right
geometry.vAlign: top

View File

@@ -17,27 +17,18 @@ import ru.m.tankz.proto.core.GameProto;
public function onShow():Void {
network.listGameSignal.connect(onGameList);
network.gameSignal.connect(onGame);
network.stateSignal.connect(onState);
network.listGame();
}
public function onHide():Void {
network.listGameSignal.disconnect(onGameList);
network.gameSignal.disconnect(onGame);
network.stateSignal.disconnect(onState);
}
private function create():Void {
network.createGame("classic", 0);
}
private function onState(state:ConnectionState):Void {
switch state {
case ONLINE(_):
case _: switcher.change(StartFrame.ID);
}
}
private function onGameList(data:Array<GameProto>):Void {
games.data = data;
}
@@ -49,6 +40,6 @@ import ru.m.tankz.proto.core.GameProto;
}
private function selectGame(game:GameProto):Void {
network.joinGame(game.id);
network.joinGame(game.id, true);
}
}

View File

@@ -19,9 +19,3 @@ views:
factory: $code:ru.m.tankz.view.network.GameItemView.factory
geometry.margin: 10
+onItemSelect: $code:function(item) selectGame(item.data)
- $type: haxework.view.HGroupView
skinId: panel
views:
- $type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:switcher.change('start')

View File

@@ -30,7 +30,9 @@ import ru.m.tankz.proto.core.PlayerProto;
info.text = '[${game.creator.name}] ${game.type} ${game.level} (${game.players.length})';
players.data = game.players;
if (game.state == GameStateProto.STARTED) {
this.game = new NetworkGame(network);
if (this.game == null) {
this.game = new NetworkGame(network);
}
switcher.change(GameFrame.ID);
}
} else {
@@ -41,25 +43,13 @@ import ru.m.tankz.proto.core.PlayerProto;
public function onShow():Void {
refresh(network.game);
network.gameSignal.connect(onGame);
network.stateSignal.connect(onState);
}
public function onHide():Void {
network.gameSignal.disconnect(onGame);
network.stateSignal.disconnect(onState);
// ToDo:
//network.leaveGame();
}
private function onGame(game:GameProto):Void {
refresh(game);
}
private function onState(state:ConnectionState):Void {
switch state {
case ONLINE(_):
case _: switcher.change(StartFrame.ID);
}
}
}

View File

@@ -23,9 +23,3 @@ views:
$type: haxework.view.list.VListView
geometry.size.stretch: true
factory: $code:ru.m.tankz.view.network.PlayerItemView.factory
- $type: haxework.view.HGroupView
skinId: panel
views:
- $type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:network.leaveGame()