From 9d4558ca47b69e043f0d49f9999f842307057609 Mon Sep 17 00:00:00 2001 From: shmyga Date: Tue, 27 Aug 2019 17:35:22 +0300 Subject: [PATCH] [client] GameView rework --- gulpfile.js | 2 +- package.json | 2 +- src/client/haxe/ru/m/tankz/view/GameFrame.hx | 28 ++++++-- .../haxe/ru/m/tankz/view/GameFrame.yaml | 2 +- .../haxe/ru/m/tankz/view/game/GameView.hx | 72 ------------------- .../haxe/ru/m/tankz/view/game/GameView.yaml | 22 ------ .../game/{TopGamePanel.hx => GameViewA.hx} | 21 +++--- .../haxe/ru/m/tankz/view/game/GameViewA.yaml | 27 +++++++ .../game/{SideGamePanel.hx => GameViewB.hx} | 21 +++--- .../haxe/ru/m/tankz/view/game/GameViewB.yaml | 20 ++++++ .../ru/m/tankz/view/game/GameViewContainer.hx | 20 ++++++ .../{GamePanelHelper.hx => GameViewHelper.hx} | 16 ++--- .../view/game/{IGamePanel.hx => IGameView.hx} | 6 +- .../ru/m/tankz/view/game/SideGamePanel.yaml | 15 ---- .../ru/m/tankz/view/game/TopGamePanel.yaml | 15 ---- 15 files changed, 122 insertions(+), 167 deletions(-) delete mode 100644 src/client/haxe/ru/m/tankz/view/game/GameView.hx delete mode 100644 src/client/haxe/ru/m/tankz/view/game/GameView.yaml rename src/client/haxe/ru/m/tankz/view/game/{TopGamePanel.hx => GameViewA.hx} (55%) create mode 100644 src/client/haxe/ru/m/tankz/view/game/GameViewA.yaml rename src/client/haxe/ru/m/tankz/view/game/{SideGamePanel.hx => GameViewB.hx} (55%) create mode 100644 src/client/haxe/ru/m/tankz/view/game/GameViewB.yaml create mode 100644 src/client/haxe/ru/m/tankz/view/game/GameViewContainer.hx rename src/client/haxe/ru/m/tankz/view/game/{GamePanelHelper.hx => GameViewHelper.hx} (84%) rename src/client/haxe/ru/m/tankz/view/game/{IGamePanel.hx => IGameView.hx} (68%) delete mode 100644 src/client/haxe/ru/m/tankz/view/game/SideGamePanel.yaml delete mode 100644 src/client/haxe/ru/m/tankz/view/game/TopGamePanel.yaml diff --git a/gulpfile.js b/gulpfile.js index 11ec04d..de99d0e 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -96,7 +96,7 @@ const client = new Project( ], meta: { width: 1024, - height: 576, + height: 768, }, flags: [ //'proto_debug', diff --git a/package.json b/package.json index 7898d6b..d7474ea 100755 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "gulp-add": "0.0.2", "gulp-clean": "^0.4.0", "gulp-foreach": "^0.1.0", - "gulp-haxetool": "0.0.23", + "gulp-haxetool": "0.0.24", "gulp-zip": "^5.0.0", "yargs": "^13.2.4" }, diff --git a/src/client/haxe/ru/m/tankz/view/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/GameFrame.hx index 28bbb93..07c6a36 100644 --- a/src/client/haxe/ru/m/tankz/view/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/GameFrame.hx @@ -2,6 +2,7 @@ package ru.m.tankz.view; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; +import haxework.view.group.GroupView; import haxework.view.layout.DefaultLayout; import ru.m.control.DeviceType; import ru.m.control.IControlBus; @@ -13,10 +14,13 @@ import ru.m.tankz.game.record.GamePlayer; import ru.m.tankz.game.record.GameRecord; import ru.m.tankz.local.LocalGame; import ru.m.tankz.network.NetworkGame; +import ru.m.tankz.preset.DotaGame; import ru.m.tankz.sound.SoundManager; import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.SettingsStorage; -import ru.m.tankz.view.game.GameView; +import ru.m.tankz.view.game.GameViewA; +import ru.m.tankz.view.game.GameViewB; +import ru.m.tankz.view.game.IGameView; import ru.m.tankz.view.gamepad.GamepadView; @:template class GameFrame extends FrameView implements GameListener { @@ -30,9 +34,11 @@ import ru.m.tankz.view.gamepad.GamepadView; @:provide static var settings:SettingsStorage; @:provide static var bus:IControlBus; - @:view("game") private var gameView(default, null):GameView; + @:view("game") private var gameViewContainer(default, null):GroupView; @:view private var gamepad(default, null):GamepadView; + private var gameView:IGameView; + private var game:IGame; private var recorder:GameRecord; @@ -51,14 +57,16 @@ import ru.m.tankz.view.gamepad.GamepadView; case NETWORK(network): new NetworkGame(network); case RECORD(record): new GamePlayer(record); } - gameView.type = game.type; + gameView = switch game.type { + case DotaGame.TYPE: GameViewB.factory(game.config); + case _: GameViewA.factory(game.config); + }; + gameViewContainer.addView(gameView); soundManager.config = game.config; gameView.render.config = game.config; game.connect(gameView.render); game.connect(soundManager); - if (gameView.panel != null) { - game.connect(gameView.panel); - } + game.connect(gameView); game.connect(this); game.start(); // ToDo: @@ -77,7 +85,9 @@ import ru.m.tankz.view.gamepad.GamepadView; game.dispose(); game = null; } - gameView.render.reset(); + if (gameView != null) { + gameView.render.reset(); + } } public function onGameEvent(event:GameEvent):Void { @@ -92,6 +102,10 @@ import ru.m.tankz.view.gamepad.GamepadView; override public function onHide():Void { stop(); soundManager.stopAll(); + if (gameView != null) { + gameViewContainer.removeView(gameView); + gameView = null; + } } public function close():Void { diff --git a/src/client/haxe/ru/m/tankz/view/GameFrame.yaml b/src/client/haxe/ru/m/tankz/view/GameFrame.yaml index c515784..515aeb3 100644 --- a/src/client/haxe/ru/m/tankz/view/GameFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/GameFrame.yaml @@ -4,7 +4,7 @@ overflow.x: crop overflow.y: crop views: - id: game - $type: ru.m.tankz.view.game.GameView + $type: ru.m.tankz.view.game.GameViewContainer - id: gamepad $type: ru.m.tankz.view.gamepad.GamepadView geometry.position: absolute diff --git a/src/client/haxe/ru/m/tankz/view/game/GameView.hx b/src/client/haxe/ru/m/tankz/view/game/GameView.hx deleted file mode 100644 index 349b35d..0000000 --- a/src/client/haxe/ru/m/tankz/view/game/GameView.hx +++ /dev/null @@ -1,72 +0,0 @@ -package ru.m.tankz.view.game; - -import haxework.view.group.IGroupView; -import haxework.view.group.VGroupView; -import ru.m.geom.Direction; -import ru.m.tankz.bundle.IConfigBundle; -import ru.m.tankz.preset.ClassicGame; -import ru.m.tankz.preset.DeathGame; -import ru.m.tankz.preset.DotaGame; -import ru.m.tankz.render.IRender; -import ru.m.tankz.Type; - -@:template class GameView extends VGroupView { - - @:provide static var configBundle:IConfigBundle; - - @:view public var render(default, null):IRender; - public var panel(default, null):IGamePanel; - public var type(default, set):GameType; - - @:view public var top(default, null):IGroupView; - @:view public var bottom(default, null):IGroupView; - @:view public var left(default, null):IGroupView; - @:view public var right(default, null):IGroupView; - - private function set_type(value:GameType):GameType { - if (type != value) { - type = value; - if (panel != null) { - panel.remove(); - } - panel = buildPanel(type); - getContainer(panel.position).addView(panel); - } - return type; - } - - private function buildPanel(type:GameType):IGamePanel { - return switch type { - case ClassicGame.TYPE | DeathGame.TYPE: - SideGamePanel.factory(configBundle.get(type)); - case DotaGame.TYPE: - TopGamePanel.factory(configBundle.get(type)); - case _: - throw 'Unsupported type: ${type}'; - } - } - - private function getContainer(position:Direction):IGroupView { - return switch position.toString() { - case "RIGHT": right; - case "LEFT": left; - case "TOP": top; - case "BOTTOM": bottom; - case _: throw 'Unsupported position: ${position}'; - } - } - - override public function update():Void { - super.update(); - if (parent != null) { - var s = Math.min(parent.width / width, parent.height / height); - if (s < 1) { - content.scaleX = content.scaleY = s; - content.x = (parent.width - width * s) / 2; - content.y = (parent.height - height * s) / 2; - } else { - content.scaleX = content.scaleY = 1; - } - } - } -} diff --git a/src/client/haxe/ru/m/tankz/view/game/GameView.yaml b/src/client/haxe/ru/m/tankz/view/game/GameView.yaml deleted file mode 100644 index 5d95ef0..0000000 --- a/src/client/haxe/ru/m/tankz/view/game/GameView.yaml +++ /dev/null @@ -1,22 +0,0 @@ ---- -views: - - id: top - $type: haxework.view.group.GroupView - layout.hAlign: center - geometry.width: 100% - - $type: haxework.view.group.HGroupView - views: - - id: left - $type: haxework.view.group.GroupView - layout.vAlign: middle - geometry.height: 100% - - id: render - $type: ru.m.tankz.render.Render - - id: right - $type: haxework.view.group.GroupView - layout.vAlign: middle - geometry.height: 100% - - id: bottom - $type: haxework.view.group.GroupView - layout.hAlign: center - geometry.width: 100% diff --git a/src/client/haxe/ru/m/tankz/view/game/TopGamePanel.hx b/src/client/haxe/ru/m/tankz/view/game/GameViewA.hx similarity index 55% rename from src/client/haxe/ru/m/tankz/view/game/TopGamePanel.hx rename to src/client/haxe/ru/m/tankz/view/game/GameViewA.hx index 5c9a191..a422d73 100644 --- a/src/client/haxe/ru/m/tankz/view/game/TopGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/view/game/GameViewA.hx @@ -3,26 +3,25 @@ package ru.m.tankz.view.game; import haxework.view.data.DataView; import haxework.view.form.LabelView; import haxework.view.group.HGroupView; -import ru.m.geom.Direction; import ru.m.tankz.config.Config; import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameState; +import ru.m.tankz.render.IRender; -@:template class TopGamePanel extends HGroupView implements IGamePanel { - public var position(default, null):Direction = Direction.TOP; - +@:template class GameViewA extends HGroupView implements IGameView { + @:view public var render:IRender; @:view public var teams:DataView; @:view public var level:LabelView; - private var helper:GamePanelHelper; - - public static function factory(config:Config):TopGamePanel { - var result = new TopGamePanel(); - result.helper = new GamePanelHelper(result, config, true); - return result; - } + private var helper:GameViewHelper; public function onGameEvent(event:GameEvent):Void { helper.onGameEvent(event); } + + public static function factory(config:Config):GameViewA { + var result = new GameViewA(); + result.helper = new GameViewHelper(result, config); + return result; + } } diff --git a/src/client/haxe/ru/m/tankz/view/game/GameViewA.yaml b/src/client/haxe/ru/m/tankz/view/game/GameViewA.yaml new file mode 100644 index 0000000..5762a78 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/game/GameViewA.yaml @@ -0,0 +1,27 @@ +--- +views: + - id: left + $type: haxework.view.group.GroupView + layout.vAlign: middle + geometry.height: 100% + geometry.width: 50% + - id: render + $type: ru.m.tankz.render.Render + - id: right + $type: haxework.view.group.VGroupView + geometry.height: 100% + geometry.width: 50% + geometry.padding: 5 + layout.vAlign: top + layout.margin: 5 + views: + - id: level + $type: haxework.view.form.LabelView + style: text.box + geometry.width: 100% + - $type: haxework.view.SpriteView + geometry.height: 30% + - id: teams + $type: haxework.view.data.DataView + layout.margin: 3 + factory: ~TeamView.viewFactory diff --git a/src/client/haxe/ru/m/tankz/view/game/SideGamePanel.hx b/src/client/haxe/ru/m/tankz/view/game/GameViewB.hx similarity index 55% rename from src/client/haxe/ru/m/tankz/view/game/SideGamePanel.hx rename to src/client/haxe/ru/m/tankz/view/game/GameViewB.hx index 3cc50a4..9391c96 100644 --- a/src/client/haxe/ru/m/tankz/view/game/SideGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/view/game/GameViewB.hx @@ -3,26 +3,25 @@ package ru.m.tankz.view.game; import haxework.view.data.DataView; import haxework.view.form.LabelView; import haxework.view.group.VGroupView; -import ru.m.geom.Direction; import ru.m.tankz.config.Config; import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameState; +import ru.m.tankz.render.IRender; -@:template class SideGamePanel extends VGroupView implements IGamePanel { - public var position(default, null):Direction = Direction.RIGHT; - +@:template class GameViewB extends VGroupView implements IGameView { + @:view public var render:IRender; @:view public var teams:DataView; @:view public var level:LabelView; - private var helper:GamePanelHelper; - - public static function factory(config:Config):SideGamePanel { - var result = new SideGamePanel(); - result.helper = new GamePanelHelper(result, config); - return result; - } + private var helper:GameViewHelper; public function onGameEvent(event:GameEvent):Void { helper.onGameEvent(event); } + + public static function factory(config:Config):GameViewB { + var result = new GameViewB(); + result.helper = new GameViewHelper(result, config, true); + return result; + } } diff --git a/src/client/haxe/ru/m/tankz/view/game/GameViewB.yaml b/src/client/haxe/ru/m/tankz/view/game/GameViewB.yaml new file mode 100644 index 0000000..884c32c --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/game/GameViewB.yaml @@ -0,0 +1,20 @@ +--- +views: + - id: top + $type: haxework.view.group.HGroupView + layout.vAlign: middle + geometry.width: 100% + views: + - id: level + $type: haxework.view.form.LabelView + style: text.box + - $type: haxework.view.SpriteView + geometry.width: 100% + - id: teams + $type: haxework.view.data.DataView + layout: + $type: haxework.view.layout.HorizontalLayout + margin: 5 + factory: ~TeamView.viewFactory + - id: render + $type: ru.m.tankz.render.Render diff --git a/src/client/haxe/ru/m/tankz/view/game/GameViewContainer.hx b/src/client/haxe/ru/m/tankz/view/game/GameViewContainer.hx new file mode 100644 index 0000000..3382edd --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/game/GameViewContainer.hx @@ -0,0 +1,20 @@ +package ru.m.tankz.view.game; + +import haxework.view.group.GroupView; + +class GameViewContainer extends GroupView { + + override public function update():Void { + super.update(); + if (parent != null) { + var s = Math.min(parent.width / width, parent.height / height); + if (s < 1) { + content.scaleX = content.scaleY = s; + content.x = (parent.width - width * s) / 2; + content.y = (parent.height - height * s) / 2; + } else { + content.scaleX = content.scaleY = 1; + } + } + } +} diff --git a/src/client/haxe/ru/m/tankz/view/game/GamePanelHelper.hx b/src/client/haxe/ru/m/tankz/view/game/GameViewHelper.hx similarity index 84% rename from src/client/haxe/ru/m/tankz/view/game/GamePanelHelper.hx rename to src/client/haxe/ru/m/tankz/view/game/GameViewHelper.hx index 37f1ef9..503d2a1 100644 --- a/src/client/haxe/ru/m/tankz/view/game/GamePanelHelper.hx +++ b/src/client/haxe/ru/m/tankz/view/game/GameViewHelper.hx @@ -6,20 +6,20 @@ import ru.m.tankz.Type; using ru.m.tankz.view.ViewUtil; -class GamePanelHelper { +class GameViewHelper { - private var panel:IGamePanel; + private var view:IGameView; private var config:Config; private var onelinelevel:Bool; - public function new(panel:IGamePanel, config:Config, onelinelevel:Bool = false) { - this.panel = panel; + public function new(view:IGameView, config:Config, onelinelevel:Bool = false) { + this.view = view; this.config = config; this.onelinelevel = onelinelevel; } private function findTeamView(id:TeamId):Null { - for (view in panel.teams.dataViews) { + for (view in view.teams.dataViews) { if (view.teamId == id) { return view; } @@ -42,10 +42,10 @@ class GamePanelHelper { public function onGameEvent(event:GameEvent):Void { switch event { case START(start): - panel.level.text = start.level.toLevelLabel(onelinelevel); - panel.teams.data = [for (team in start.state.teams) team]; + view.level.text = start.level.toLevelLabel(onelinelevel); + view.teams.data = [for (team in start.state.teams) team]; // ToDo: PlayerState default tank? - for (teamView in panel.teams.dataViews) { + for (teamView in view.teams.dataViews) { for (playerView in teamView.dataViews) { var tank = config.getPlayerTank(playerView.playerId); playerView.tank = { diff --git a/src/client/haxe/ru/m/tankz/view/game/IGamePanel.hx b/src/client/haxe/ru/m/tankz/view/game/IGameView.hx similarity index 68% rename from src/client/haxe/ru/m/tankz/view/game/IGamePanel.hx rename to src/client/haxe/ru/m/tankz/view/game/IGameView.hx index 6631c30..a5fa604 100644 --- a/src/client/haxe/ru/m/tankz/view/game/IGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/view/game/IGameView.hx @@ -1,14 +1,14 @@ package ru.m.tankz.view.game; +import ru.m.tankz.render.IRender; import haxework.view.data.DataView; import haxework.view.form.LabelView; import haxework.view.IView; -import ru.m.geom.Direction; import ru.m.tankz.game.GameState; import ru.m.tankz.game.IGame; -interface IGamePanel extends IView extends GameListener { - public var position(default, null):Direction; +interface IGameView extends IView extends GameListener { + public var render(default, null):IRender; public var teams(default, null):DataView; public var level(default, null):LabelView; } diff --git a/src/client/haxe/ru/m/tankz/view/game/SideGamePanel.yaml b/src/client/haxe/ru/m/tankz/view/game/SideGamePanel.yaml deleted file mode 100644 index 612f618..0000000 --- a/src/client/haxe/ru/m/tankz/view/game/SideGamePanel.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -geometry.padding: 5 -geometry.height: 100% -layout.margin: 5 -views: - - id: level - $type: haxework.view.form.LabelView - style: text.box - geometry.width: 100% - - $type: haxework.view.SpriteView - geometry.height: 50% - - id: teams - $type: haxework.view.data.DataView - layout.margin: 3 - factory: ~TeamView.viewFactory diff --git a/src/client/haxe/ru/m/tankz/view/game/TopGamePanel.yaml b/src/client/haxe/ru/m/tankz/view/game/TopGamePanel.yaml deleted file mode 100644 index 022fdd2..0000000 --- a/src/client/haxe/ru/m/tankz/view/game/TopGamePanel.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -geometry.width: 100% -layout.margin: 20 -views: - - id: level - $type: haxework.view.form.LabelView - style: text.box - - $type: haxework.view.SpriteView - geometry.width: 100% - - id: teams - $type: haxework.view.data.DataView - layout: - $type: haxework.view.layout.HorizontalLayout - margin: 5 - factory: ~TeamView.viewFactory