[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;
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<GameType, IGamePanel>;
@: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<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 {
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<GameState>):Void {
switch (result) {
case Option.Some(s):
state.text = stateString(game);
panels.get(s.type).invalidate();
case Option.None:
}
switch (game.next()) {

View File

@@ -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

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;
}