From af5aa6b8e6d73dc0efe613c8bd6a8fa94f551ea6 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 26 Jul 2018 16:48:07 +0300 Subject: [PATCH] [client] added game panels --- src/client/haxe/ru/m/tankz/frame/GameFrame.hx | 65 +++++-------------- .../haxe/ru/m/tankz/frame/GameFrame.yaml | 31 ++------- .../ru/m/tankz/frame/game/ClassicGamePanel.hx | 33 ++++++++++ .../m/tankz/frame/game/ClassicGamePanel.yaml | 16 +++++ .../ru/m/tankz/frame/game/DotaGamePanel.hx | 46 +++++++++++++ .../ru/m/tankz/frame/game/DotaGamePanel.yaml | 6 ++ .../haxe/ru/m/tankz/frame/game/IGamePanel.hx | 8 +++ 7 files changed, 131 insertions(+), 74 deletions(-) create mode 100644 src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.yaml create mode 100644 src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.yaml create mode 100644 src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx index 19367fe..55461a4 100755 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx @@ -1,5 +1,8 @@ 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.ClassicGame; import ru.m.tankz.Type.GameType; @@ -28,22 +31,23 @@ class GameFrame extends VGroupView { public static inline var ID = "game"; - @:view var state(default, null):LabelView; @:view var render(default, null):Render; - @:view var topPanel(default, null):View; - @:view var rightPanel(default, null):View; + @:view var dotaPanel(default, null):DotaGamePanel; + @:view var classicPanel(default, null):ClassicGamePanel; - @:view var botstate(default, null):LabelView; - @:view var player1state(default, null):LabelView; - @:view var player2state(default, null):LabelView; + var panels:Map; @:provide var network:NetworkManager; private var game:Game; 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 { start(Provider.get(GameSave)); @@ -55,13 +59,9 @@ class GameFrame extends VGroupView { } private function start(save:GameSave):Void { - switch (save.state.type) { - case ClassicGame.TYPE: - topPanel.visible = topPanel.inLayout = false; - rightPanel.visible = rightPanel.inLayout = true; - case DotaGame.TYPE: - topPanel.visible = topPanel.inLayout = true; - rightPanel.visible = rightPanel.inLayout = false; + for (type in panels.keys()) { + panels.get(type).visible = type == save.state.type; + panels.get(type).inLayout = type == save.state.type; } switch (save.server) { case GameServer.LOCAL: @@ -75,9 +75,9 @@ class GameFrame extends VGroupView { connectGame(game); network.game = cast game; } + panels.get(save.state.type).game = game; content.addEventListener(Event.ENTER_FRAME, redraw); render.draw(game.engine); - state.text = stateString(game); Provider.get(SoundManager).play('start'); } @@ -94,46 +94,15 @@ class GameFrame extends VGroupView { render.reset(); } - private function stateString(game:Game):String { - if (game == null) { - return ''; - } - var result:Array = []; - 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 { - state.text = stateString(game); - 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 = ""; - } - } + panels.get(s.type).invalidate(); return s; } private function onGameComplete(result:Option):Void { switch (result) { case Option.Some(s): - state.text = stateString(game); + panels.get(s.type).invalidate(); case Option.None: } switch (game.next()) { diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.yaml b/src/client/haxe/ru/m/tankz/frame/GameFrame.yaml index 2812b70..5e235e3 100644 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.yaml +++ b/src/client/haxe/ru/m/tankz/frame/GameFrame.yaml @@ -2,18 +2,12 @@ pWidth: 100 pHeight: 100 views: -- id: topPanel - $type: haxework.gui.HGroupView +- id: dotaPanel + $type: ru.m.tankz.frame.game.DotaGamePanel pWidth: 100 height: 20 visible: false inLayout: false - views: - - id: state - $type: haxework.gui.LabelView - $style: label - pWidth: 100 - height: 20 - $type: haxework.gui.HGroupView pWidth: 100 pHeight: 100 @@ -21,25 +15,10 @@ views: - id: render $type: ru.m.tankz.render.Render contentSize: true - - id: rightPanel - $type: haxework.gui.VGroupView + - id: classicPanel + $type: ru.m.tankz.frame.game.ClassicGamePanel width: 200 pHeight: 100 visible: 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 + diff --git a/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx b/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx new file mode 100644 index 0000000..78d3c49 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx @@ -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(); + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.yaml b/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.yaml new file mode 100644 index 0000000..c0f7ca5 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.yaml @@ -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 \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx b/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx new file mode 100644 index 0000000..87bcbbc --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx @@ -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 = []; + 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(); + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.yaml b/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.yaml new file mode 100644 index 0000000..5ca82e6 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.yaml @@ -0,0 +1,6 @@ +views: +- id: state + $type: haxework.gui.LabelView + $style: label + pWidth: 100 + height: 20 \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx b/src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx new file mode 100644 index 0000000..0d32484 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx @@ -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; +}