[client] add GameRoomFrame

This commit is contained in:
2019-05-23 17:57:54 +03:00
parent 864d5f3335
commit 26ad5f47cd
21 changed files with 415 additions and 498 deletions

View File

@@ -1,10 +1,10 @@
package ru.m.tankz.network;
import ru.m.tankz.proto.core.UserProto;
import haxework.signal.Signal;
import ru.m.connect.IConnection;
import ru.m.tankz.control.Control;
import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.proto.game.GameActionTypeProto;
import ru.m.tankz.proto.game.GameChangeProto;
import ru.m.tankz.proto.pack.CreateGameRequest;
import ru.m.tankz.proto.pack.JoinGameRequest;
@@ -31,6 +31,9 @@ enum ConnectionState {
class NetworkManager {
public var state(default, null):ConnectionState;
public var game(default, null):GameProto;
public var user(default, null):UserProto;
public var stateSignal:Signal<ConnectionState>;
public var listGameSignal:Signal<Array<GameProto>>;
public var gameSignal:Signal<GameProto>;
@@ -80,8 +83,8 @@ class NetworkManager {
connection.send(new Request().setListGame(new ListGameRequest()));
}
public function createGame(type:String):Void {
connection.send(new Request().setCreateGame(new CreateGameRequest().setType(type)));
public function createGame(type:String, level:Int):Void {
connection.send(new Request().setCreateGame(new CreateGameRequest().setType(type).setLevel(level)));
}
public function joinGame(gameId:Int):Void {
@@ -116,9 +119,10 @@ class NetworkManager {
private function onResponse(packet:Response):Void {
if (packet.hasLogin()) {
this.user = packet.login.user;
var user = {
uuid: packet.login.user.uuid,
name: packet.login.user.name,
uuid: this.user.uuid,
name: this.user.name,
};
storage.user = user;
updateState(ONLINE(user));
@@ -128,11 +132,17 @@ class NetworkManager {
} else if (packet.hasListGame()) {
listGameSignal.emit(packet.listGame.games);
} else if (packet.hasCreateGame()) {
game = packet.createGame.game;
gameSignal.emit(packet.createGame.game);
} else if (packet.hasJoinGame()) {
game = packet.createGame.game;
gameSignal.emit(packet.joinGame.game);
} else if (packet.hasLeaveGame()) {
gameSignal.emit(null);
if (packet.leaveGame.user.uuid == user.uuid) {
gameSignal.emit(null);
} else {
gameSignal.emit(packet.leaveGame.game);
}
} else if (packet.hasStartGame()) {
gameSignal.emit(packet.startGame.game);
}

View File

@@ -17,3 +17,5 @@ views:
$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

View File

@@ -1,10 +1,10 @@
package ru.m.tankz.view.network;
import haxework.view.list.VListView;
import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.network.NetworkManager;
import haxework.view.frame.FrameSwitcher;
import haxework.view.list.VListView;
import haxework.view.VGroupView;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.core.GameProto;
@:template class GameListFrame extends VGroupView {
public static inline var ID = "game_list";
@@ -16,14 +16,37 @@ import haxework.view.VGroupView;
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;
}
private function onGame(game:GameProto):Void {
switcher.change(GameRoomFrame.ID);
}
private function selectGame(game:GameProto):Void {
network.joinGame(game.id);
}
}

View File

@@ -6,14 +6,19 @@ views:
views:
- id: header
$type: haxework.view.LabelView
geometry.margin.bottom: 20
skinId: text.header
text: Games List
- $type: haxework.view.ButtonView
skinId: button.simple
text: Create
+onPress: $code:create()
- id: games
$type: haxework.view.list.VListView
geometry.size.stretch: true
geometry.margin.top: 20
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:

View File

@@ -0,0 +1,45 @@
package ru.m.tankz.view.network;
import haxework.view.frame.FrameSwitcher;
import haxework.view.TextView;
import haxework.view.VGroupView;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.core.GameProto;
@:template class GameRoomFrame extends VGroupView {
public static inline var ID = "game_room";
@:view var info:TextView;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
private function refresh(game:GameProto):Void {
info.text = '${game.id}. ${game.type}';
}
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);
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

@@ -0,0 +1,20 @@
---
views:
- $type: haxework.view.VGroupView
skinId: container
geometry.padding: 20
views:
- id: header
$type: haxework.view.LabelView
geometry.margin.bottom: 20
skinId: text.header
text: Game Room
- id: info
$type: haxework.view.TextView
geometry.size.stretch: true
- $type: haxework.view.HGroupView
skinId: panel
views:
- $type: haxework.view.ButtonView
skinId: button.close
+onPress: $code:switcher.change('start')