[client] improve StartFrame

This commit is contained in:
2019-07-23 16:39:43 +03:00
parent 6d5148e0a5
commit e8e3a6f1b3
10 changed files with 94 additions and 46 deletions

View File

@@ -1,3 +1,12 @@
0.16.0
------
* Added `GamepadView` for sensor control
* Added `AppTheme`
* Replace `LevelPopup` with `StartFrame`
* Added `LevelPack`
* Added scrolls to lists
* Fixed `GameView` size for small screens
0.15.0 0.15.0
------ ------
* Added display tank player name in `Render` * Added display tank player name in `Render`

View File

@@ -8,4 +8,4 @@
* improve bonuses system * improve bonuses system
* screen gamepad on mobiles * screen gamepad on mobiles
* resize render on mobiles * resize render on mobiles
* save state in classic game * save human state in classic game

View File

@@ -1,5 +1,6 @@
package ru.m.tankz; package ru.m.tankz;
import flash.text.TextFormatAlign;
import haxework.color.Color; import haxework.color.Color;
import haxework.view.geometry.Box; import haxework.view.geometry.Box;
import haxework.view.geometry.HAlign; import haxework.view.geometry.HAlign;
@@ -41,6 +42,7 @@ class AppTheme extends Theme {
register(new Style("text.header", [ register(new Style("text.header", [
"font.size" => fontSize.big, "font.size" => fontSize.big,
"font.align" => TextFormatAlign.CENTER,
"skin.background.color" => Color.fromInt(0x000000), "skin.background.color" => Color.fromInt(0x000000),
"skin.background.alpha" => 0.1, "skin.background.alpha" => 0.1,
"skin.border.color" => colors.light, "skin.border.color" => colors.light,

View File

@@ -1,8 +1,8 @@
package ru.m.tankz.view; package ru.m.tankz.view;
import haxework.view.layout.DefaultLayout;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView; import haxework.view.frame.FrameView;
import haxework.view.layout.DefaultLayout;
import ru.m.control.DeviceType; import ru.m.control.DeviceType;
import ru.m.control.IControlBus; import ru.m.control.IControlBus;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
@@ -23,16 +23,15 @@ import ru.m.tankz.view.GamepadView;
private static inline var TAG = "GameFrame"; private static inline var TAG = "GameFrame";
@:view("game") private var gameView(default, null):GameView; @:provide static var soundManager:SoundManager;
@:view private var gamepad(default, null):GamepadView; @:provide static var switcher:FrameSwitcher;
@:provide var soundManager:SoundManager;
@:provide var switcher:FrameSwitcher;
@:provide static var gameStorage:GameStorage; @:provide static var gameStorage:GameStorage;
@:provide static var settings:SettingsStorage; @:provide static var settings:SettingsStorage;
@:provide static var bus:IControlBus; @:provide static var bus:IControlBus;
@:view("game") private var gameView(default, null):GameView;
@:view private var gamepad(default, null):GamepadView;
private var game:IGame; private var game:IGame;
private var recorder:GameRecord; private var recorder:GameRecord;
@@ -61,7 +60,6 @@ import ru.m.tankz.view.GamepadView;
case LOCAL(start): new LocalGame(start); case LOCAL(start): new LocalGame(start);
case NETWORK(network): new NetworkGame(network); case NETWORK(network): new NetworkGame(network);
case RECORD(record): new GamePlayer(record); case RECORD(record): new GamePlayer(record);
case _: null;
} }
gameView.type = game.type; gameView.type = game.type;
soundManager.config = game.config; soundManager.config = game.config;
@@ -98,6 +96,6 @@ import ru.m.tankz.view.GamepadView;
} }
public function close():Void { public function close():Void {
switcher.change(MenuFrame.ID); switcher.change(LevelFrame.ID, game.level.packId);
} }
} }

View File

@@ -10,3 +10,10 @@ views:
geometry.position: absolute geometry.position: absolute
geometry.stretch: true geometry.stretch: true
visible: false visible: false
- $type: haxework.view.form.ButtonView
style: button.close
geometry.position: absolute
geometry.hAlign: right
geometry.vAlign: bottom
geometry.margin: 10
+onPress: ~close()

View File

@@ -12,6 +12,8 @@ import ru.m.tankz.game.GameState;
import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.view.common.LifeView; import ru.m.tankz.view.common.LifeView;
using ru.m.tankz.view.ViewUtil;
@:template class ResultFrame extends FrameView<Result> { @:template class ResultFrame extends FrameView<Result> {
public static var ID(default, never):String = "result"; public static var ID(default, never):String = "result";
@@ -46,13 +48,9 @@ import ru.m.tankz.view.common.LifeView;
var players = Lambda.array(result.state.players); var players = Lambda.array(result.state.players);
players.sort(function(a, b) return a.id.compare(b.id)); players.sort(function(a, b) return a.id.compare(b.id));
resultView.data = players; resultView.data = players;
var label = '${result.state.type} Level ${result.level.id}'; levelLabel.text = data.level.levelLabel();
if (result.level.name != null) {
label += '\n${result.level.name}';
}
levelLabel.text = label;
nextButton.disabled = !gameStorage.get(result.level.packId).isPresetAvailable(result.level.id + 1, result.state.presetId); nextButton.disabled = !gameStorage.get(result.level.packId).isPresetAvailable(result.level.id + 1, result.state.presetId);
nextButton.text = 'Next (${result.level.id + 1})'; nextButton.text = 'Next #${result.level.id + 1}';
} }
private function levels():Void { private function levels():Void {
@@ -73,8 +71,4 @@ import ru.m.tankz.view.common.LifeView;
} }
} }
} }
private function close():Void {
frames.change(MenuFrame.ID);
}
} }

View File

@@ -16,6 +16,7 @@ import ru.m.tankz.Type;
import ru.m.tankz.view.common.SlotView; import ru.m.tankz.view.common.SlotView;
using haxe.EnumTools.EnumValueTools; using haxe.EnumTools.EnumValueTools;
using ru.m.tankz.view.ViewUtil;
@:template class StartFrame extends FrameView<Start> { @:template class StartFrame extends FrameView<Start> {
@@ -28,12 +29,11 @@ using haxe.EnumTools.EnumValueTools;
@:view var header:LabelView; @:view var header:LabelView;
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>; @:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>; @:view("teams") var teamsView:DataView<Array<PlayerControl>, DataView<PlayerControl, SlotView>>;
private var humanIndex:Int = 0; private var humanIndex:Int = 0;
private var humanTotal:Int = 2; private var humanTotal:Int = 2;
private var start:Start; private var start:Start;
public function new() { public function new() {
@@ -44,32 +44,45 @@ using haxe.EnumTools.EnumValueTools;
super.onShow(data); super.onShow(data);
start = data; start = data;
this.progress = storage.get(start.level.packId); this.progress = storage.get(start.level.packId);
header.text = '${start.state.type} - ${start.level.id}. ${start.level.name != null ? start.level.name : "#"}'; header.text = start.level.levelLabel();
presetsView.data = start.state.config.presets; presetsView.data = start.state.config.presets;
slotsView.data = defaultControls(start.state.config); teamsView.data = defaultControls(start.state.config);
} }
private static function defaultControls(config:Config):Array<PlayerControl> { private static function defaultControls(config:Config):Array<Array<PlayerControl>> {
var controls:Array<PlayerControl> = []; var result:Array<Array<PlayerControl>> = [];
var preset = config.getPreset(0); var preset = config.getPreset(0);
var human = false;
for (team in preset.teams) { for (team in preset.teams) {
if (team.id != "bot") { // ToDo: if (team.id != "bot") { // ToDo:
var controls:Array<PlayerControl> = [];
for (player in team.players) { for (player in team.players) {
var playerId = new PlayerId(team.id, player.index); var playerId = new PlayerId(team.id, player.index);
controls.push({ var control:PlayerControl = {
playerId: playerId, playerId: playerId,
color: config.getColor(playerId), color: config.getColor(playerId),
controller: NONE, controller: NONE,
}); }
if (!human) {
control.controller = HUMAN(0);
control.name = ControllerParser.defaultName(control.controller);
human = true;
}
controls.push(control);
}
result.push(controls);
} }
} }
return result;
} }
controls.sort(function(a, b) return a.playerId.compare(b.playerId));
if (controls.length > 0) { private function teamViewFactory(index:Int, value:Array<PlayerControl>):DataView<PlayerControl, SlotView> {
controls[0].controller = HUMAN(0); var result = new DataView();
controls[0].name = ControllerParser.defaultName(controls[0].controller); result.style = "light";
} result.geometry.padding = 5;
return controls; result.factory = slotViewFactory;
result.data = value;
return result;
} }
private function slotViewFactory(index:Int, value:PlayerControl):SlotView { private function slotViewFactory(index:Int, value:PlayerControl):SlotView {
@@ -83,7 +96,8 @@ using haxe.EnumTools.EnumValueTools;
switch controller { switch controller {
case NONE: case NONE:
case _: case _:
for (view in slotsView.dataViews) { for (teamView in teamsView.dataViews) {
for (view in teamView.dataViews) {
if (view.control.controller.equals(controller)) { if (view.control.controller.equals(controller)) {
view.control.controller = NONE; view.control.controller = NONE;
view.select.selected = NONE; view.select.selected = NONE;
@@ -91,6 +105,7 @@ using haxe.EnumTools.EnumValueTools;
} }
} }
} }
}
value.controller = controller; value.controller = controller;
value.name = ControllerParser.defaultName(controller); value.name = ControllerParser.defaultName(controller);
} }
@@ -106,7 +121,11 @@ using haxe.EnumTools.EnumValueTools;
private function onPresetSelect(value:GamePreset):Void { private function onPresetSelect(value:GamePreset):Void {
if (progress.isPresetAvailable(start.level.id, value.id)) { if (progress.isPresetAvailable(start.level.id, value.id)) {
start.state.presetId = value.id; start.state.presetId = value.id;
start.state.controls = slotsView.data; var controls = [];
for (item in teamsView.data) {
controls = controls.concat(item);
}
start.state.controls = controls;
switcher.change(GameFrame.ID, LOCAL(start)); switcher.change(GameFrame.ID, LOCAL(start));
} }
} }

View File

@@ -6,18 +6,18 @@ views:
- id: header - id: header
$type: haxework.view.form.LabelView $type: haxework.view.form.LabelView
style: text.header style: text.header
- id: slots - id: teams
$type: haxework.view.data.DataView $type: haxework.view.data.DataView
geometry.padding: 10 geometry.padding: 10
geometry.width: 100% geometry.width: 100%
geometry.height: 100% geometry.height: 100%
layout.hAlign: center layout.hAlign: center
overflow.y: scroll overflow.y: scroll
factory: ~slotViewFactory factory: ~teamViewFactory
layout: layout:
$type: haxework.view.layout.VerticalLayout $type: haxework.view.layout.TailLayout
# $type: haxework.view.layout.TailLayout
margin: 5 margin: 5
rowSize: 2
- $type: haxework.view.group.HGroupView - $type: haxework.view.group.HGroupView
style: panel style: panel
layout.margin: 10 layout.margin: 10

View File

@@ -0,0 +1,14 @@
package ru.m.tankz.view;
import ru.m.tankz.config.Config;
class ViewUtil {
public static function levelLabel(level:LevelConfig):String {
var result:Array<String> = ['${level.packId.type} #${level.id}'];
if (level.name != null) {
result.push(level.name);
}
return result.join("\n");
}
}

View File

@@ -1,8 +1,9 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import haxework.view.group.HGroupView;
import haxework.view.form.LabelView; import haxework.view.form.LabelView;
import haxework.view.form.SelectView; import haxework.view.form.SelectView;
import haxework.view.group.HGroupView;
import haxework.view.skin.SpriteSkin;
import ru.m.tankz.control.Controller; import ru.m.tankz.control.Controller;
import ru.m.tankz.control.PlayerControl; import ru.m.tankz.control.PlayerControl;
@@ -16,7 +17,11 @@ import ru.m.tankz.control.PlayerControl;
private function set_control(value:PlayerControl):PlayerControl { private function set_control(value:PlayerControl):PlayerControl {
control = value; control = value;
slotLabel.text = '${control.playerId.team} #${control.playerId.index}'; slotLabel.text = '${control.playerId.team} #${control.playerId.index}';
slotLabel.font.color = value.color; var skin:SpriteSkin = cast slotLabel.skin;
skin.border.color = value.color;
skin.border.alpha = 0.8;
skin.background.color = value.color;
skin.background.alpha = 0.2;
select.selected = control.controller; select.selected = control.controller;
return control; return control;
} }