[client] added game panels

This commit is contained in:
2018-07-26 16:48:07 +03:00
parent ac1df9a9a4
commit af5aa6b8e6
7 changed files with 131 additions and 74 deletions

View File

@@ -1,5 +1,8 @@
package ru.m.tankz.frame; package ru.m.tankz.frame;
import ru.m.tankz.frame.game.DotaGamePanel;
import ru.m.tankz.frame.game.IGamePanel;
import ru.m.tankz.frame.game.ClassicGamePanel;
import ru.m.tankz.preset.DotaGame; import ru.m.tankz.preset.DotaGame;
import ru.m.tankz.preset.ClassicGame; import ru.m.tankz.preset.ClassicGame;
import ru.m.tankz.Type.GameType; import ru.m.tankz.Type.GameType;
@@ -28,22 +31,23 @@ class GameFrame extends VGroupView {
public static inline var ID = "game"; public static inline var ID = "game";
@:view var state(default, null):LabelView;
@:view var render(default, null):Render; @:view var render(default, null):Render;
@:view var topPanel(default, null):View; @:view var dotaPanel(default, null):DotaGamePanel;
@:view var rightPanel(default, null):View; @:view var classicPanel(default, null):ClassicGamePanel;
@:view var botstate(default, null):LabelView; var panels:Map<GameType, IGamePanel>;
@:view var player1state(default, null):LabelView;
@:view var player2state(default, null):LabelView;
@:provide var network:NetworkManager; @:provide var network:NetworkManager;
private var game:Game; private var game:Game;
private var timer:Timer; private var timer:Timer;
public function init():Void {} public function init():Void {
panels = new Map();
panels.set(ClassicGame.TYPE, classicPanel);
panels.set(DotaGame.TYPE, dotaPanel);
}
public function onShow():Void { public function onShow():Void {
start(Provider.get(GameSave)); start(Provider.get(GameSave));
@@ -55,13 +59,9 @@ class GameFrame extends VGroupView {
} }
private function start(save:GameSave):Void { private function start(save:GameSave):Void {
switch (save.state.type) { for (type in panels.keys()) {
case ClassicGame.TYPE: panels.get(type).visible = type == save.state.type;
topPanel.visible = topPanel.inLayout = false; panels.get(type).inLayout = type == save.state.type;
rightPanel.visible = rightPanel.inLayout = true;
case DotaGame.TYPE:
topPanel.visible = topPanel.inLayout = true;
rightPanel.visible = rightPanel.inLayout = false;
} }
switch (save.server) { switch (save.server) {
case GameServer.LOCAL: case GameServer.LOCAL:
@@ -75,9 +75,9 @@ class GameFrame extends VGroupView {
connectGame(game); connectGame(game);
network.game = cast game; network.game = cast game;
} }
panels.get(save.state.type).game = game;
content.addEventListener(Event.ENTER_FRAME, redraw); content.addEventListener(Event.ENTER_FRAME, redraw);
render.draw(game.engine); render.draw(game.engine);
state.text = stateString(game);
Provider.get(SoundManager).play('start'); Provider.get(SoundManager).play('start');
} }
@@ -94,46 +94,15 @@ class GameFrame extends VGroupView {
render.reset(); render.reset();
} }
private function stateString(game:Game):String {
if (game == null) {
return '';
}
var result:Array<String> = [];
result.push('Level: ${game.state.level}');
for (team in game.teams) {
if (game.state.loser == team.id) {
result.push('${team.id}: LOSE');
} else if (team.life > 0) {
result.push('${team.id}: ${team.life}');
} else {
for (player in team.players) {
if (player.state.life > 0) {
result.push('${player.id.team}${player.id.index}: ${player.state.life}');
}
}
}
}
return '[ ${result.join(' | ')} ]';
}
private function onGameStateChange(s:GameState):GameState { private function onGameStateChange(s:GameState):GameState {
state.text = stateString(game); panels.get(s.type).invalidate();
if (game.type == ClassicGame.TYPE) {
botstate.text = 'Bot: ${game.teams[ClassicGame.BOT].life} life';
player1state.text = 'Player1: ${game.teams[ClassicGame.HUMAN].players[0].state.life} life';
if (game.teams[ClassicGame.HUMAN].players[1] != null) {
player2state.text = 'Player2: ${game.teams[ClassicGame.HUMAN].players[1].state.life} life';
} else {
player2state.text = "";
}
}
return s; return s;
} }
private function onGameComplete(result:Option<GameState>):Void { private function onGameComplete(result:Option<GameState>):Void {
switch (result) { switch (result) {
case Option.Some(s): case Option.Some(s):
state.text = stateString(game); panels.get(s.type).invalidate();
case Option.None: case Option.None:
} }
switch (game.next()) { switch (game.next()) {

View File

@@ -2,18 +2,12 @@
pWidth: 100 pWidth: 100
pHeight: 100 pHeight: 100
views: views:
- id: topPanel - id: dotaPanel
$type: haxework.gui.HGroupView $type: ru.m.tankz.frame.game.DotaGamePanel
pWidth: 100 pWidth: 100
height: 20 height: 20
visible: false visible: false
inLayout: false inLayout: false
views:
- id: state
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20
- $type: haxework.gui.HGroupView - $type: haxework.gui.HGroupView
pWidth: 100 pWidth: 100
pHeight: 100 pHeight: 100
@@ -21,25 +15,10 @@ views:
- id: render - id: render
$type: ru.m.tankz.render.Render $type: ru.m.tankz.render.Render
contentSize: true contentSize: true
- id: rightPanel - id: classicPanel
$type: haxework.gui.VGroupView $type: ru.m.tankz.frame.game.ClassicGamePanel
width: 200 width: 200
pHeight: 100 pHeight: 100
visible: false visible: false
inLayout: false inLayout: false
views:
- id: botstate
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20
- id: player1state
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20
- id: player2state
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20

View File

@@ -0,0 +1,33 @@
package ru.m.tankz.frame.game;
import haxework.gui.LabelView;
import haxework.gui.VGroupView;
import ru.m.tankz.game.Game;
import ru.m.tankz.preset.ClassicGame;
@:template("ru/m/tankz/frame/game/ClassicGamePanel.yaml", "ru/m/tankz/Style.yaml")
class ClassicGamePanel extends VGroupView implements IGamePanel {
@:view var botstate(default, null):LabelView;
@:view var player1state(default, null):LabelView;
@:view var player2state(default, null):LabelView;
public var game:Game;
private function updateViews():Void {
botstate.text = 'Bot: ${game.teams[ClassicGame.BOT].life} life';
player1state.text = 'Player1: ${game.teams[ClassicGame.HUMAN].players[0].state.life} life';
if (game.teams[ClassicGame.HUMAN].players[1] != null) {
player2state.text = 'Player2: ${game.teams[ClassicGame.HUMAN].players[1].state.life} life';
} else {
player2state.text = "";
}
}
override public function update():Void {
if (game != null) {
updateViews();
}
super.update();
}
}

View File

@@ -0,0 +1,16 @@
views:
- id: botstate
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20
- id: player1state
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20
- id: player2state
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20

View File

@@ -0,0 +1,46 @@
package ru.m.tankz.frame.game;
import haxework.gui.LabelView;
import haxework.gui.HGroupView;
import ru.m.tankz.game.Game;
@:template("ru/m/tankz/frame/game/DotaGamePanel.yaml", "ru/m/tankz/Style.yaml")
class DotaGamePanel extends HGroupView implements IGamePanel {
@:view var state(default, null):LabelView;
public var game:Game;
private function stateString(game:Game):String {
if (game == null) {
return '';
}
var result:Array<String> = [];
result.push('Level: ${game.state.level}');
for (team in game.teams) {
if (game.state.loser == team.id) {
result.push('${team.id}: LOSE');
} else if (team.life > 0) {
result.push('${team.id}: ${team.life}');
} else {
for (player in team.players) {
if (player.state.life > 0) {
result.push('${player.id.team}${player.id.index}: ${player.state.life}');
}
}
}
}
return '[ ${result.join(' | ')} ]';
}
private function updateViews():Void {
state.text = stateString(game);
}
override public function update():Void {
if (game != null) {
updateViews();
}
super.update();
}
}

View File

@@ -0,0 +1,6 @@
views:
- id: state
$type: haxework.gui.LabelView
$style: label
pWidth: 100
height: 20

View File

@@ -0,0 +1,8 @@
package ru.m.tankz.frame.game;
import ru.m.tankz.game.Game;
import haxework.gui.IView;
interface IGamePanel extends IView {
public var game:Game;
}