[client] remake panel
This commit is contained in:
@@ -45,7 +45,7 @@ class AppTheme extends Theme {
|
||||
"skin.background.alpha" => 0.1,
|
||||
"skin.border.color" => colors.light,
|
||||
"geometry.padding" => Box.fromArray([50, 8]),
|
||||
"geometry.margin" => Box.fromArray([0, 0, 10, 30]),
|
||||
"geometry.margin" => Box.fromArray([0, 0, 30, 30]),
|
||||
], ["text"]));
|
||||
|
||||
register(new Style("button.menu", [
|
||||
@@ -104,6 +104,7 @@ class AppTheme extends Theme {
|
||||
registerButton("settings", "cog-solid.svg");
|
||||
registerButton("close", "times-circle-solid.svg");
|
||||
registerButton("next", "arrow-alt-circle-right-solid.svg");
|
||||
registerButton("prev", "arrow-alt-circle-left-solid.svg");
|
||||
registerButton("start", "play-circle-solid.svg");
|
||||
registerButton("login", "sign-in-solid.svg");
|
||||
registerButton("logout", "sign-out-solid.svg");
|
||||
|
||||
@@ -3,20 +3,14 @@ package ru.m.tankz.view;
|
||||
import flash.events.KeyboardEvent;
|
||||
import flash.ui.Keyboard;
|
||||
import haxework.resources.IResources;
|
||||
import haxework.view.form.ButtonView;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.form.LabelView;
|
||||
import haxework.view.group.VGroupView;
|
||||
import ru.m.tankz.game.IGame;
|
||||
import ru.m.tankz.network.NetworkManager;
|
||||
import ru.m.tankz.sound.SoundManager;
|
||||
import ru.m.tankz.view.popup.LoginPopup;
|
||||
|
||||
@:template class ClientView extends VGroupView {
|
||||
@:view("switcher") var switcherView:FrameSwitcher;
|
||||
@:view var username:LabelView;
|
||||
@:view("login") var loginButton:ButtonView;
|
||||
@:view("logout") var logoutButton:ButtonView;
|
||||
|
||||
@:provide var network:NetworkManager;
|
||||
@:provide var resources:IResources;
|
||||
@@ -27,8 +21,6 @@ import ru.m.tankz.view.popup.LoginPopup;
|
||||
public function init():Void {
|
||||
resources.text.put('version', '${Const.VERSION}');
|
||||
switcher = switcherView;
|
||||
network.stateSignal.connect(onConnectionState);
|
||||
onConnectionState(network.state);
|
||||
}
|
||||
|
||||
public function launch():Void {
|
||||
@@ -36,7 +28,7 @@ import ru.m.tankz.view.popup.LoginPopup;
|
||||
content.stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):Void {
|
||||
switch event.keyCode {
|
||||
case Keyboard.ESCAPE:
|
||||
switcher.change(StartFrame.ID);
|
||||
switcher.change(MenuFrame.ID);
|
||||
case Keyboard.M:
|
||||
soundManager.mute = !soundManager.mute;
|
||||
case Keyboard.P:
|
||||
@@ -45,41 +37,6 @@ import ru.m.tankz.view.popup.LoginPopup;
|
||||
}
|
||||
}
|
||||
});
|
||||
switcher.change(StartFrame.ID);
|
||||
}
|
||||
|
||||
private function onConnectionState(state:ConnectionState):Void {
|
||||
L.d("ClientView", 'onConnectionState: ${state}');
|
||||
switch state {
|
||||
case ONLINE(user):
|
||||
username.text = user.name;
|
||||
logoutButton.visible = true;
|
||||
loginButton.visible = false;
|
||||
case CONNECTED:
|
||||
username.text = "";
|
||||
logoutButton.visible = false;
|
||||
loginButton.visible = true;
|
||||
case ERROR(error):
|
||||
//L.e("ClientView", 'onConnectionState: ERROR', error);
|
||||
L.w("ClientView", 'onConnectionState: ERROR');
|
||||
case _:
|
||||
username.text = "";
|
||||
logoutButton.visible = false;
|
||||
loginButton.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
private function login():Void {
|
||||
LoginPopup.instance.show().then(function(user:User):Void {
|
||||
L.d("Login", 'user: $user');
|
||||
});
|
||||
}
|
||||
|
||||
private function logout():Void {
|
||||
network.logout();
|
||||
}
|
||||
|
||||
private function close():Void {
|
||||
switcher.change(StartFrame.ID);
|
||||
switcher.change(MenuFrame.ID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,39 +5,12 @@ views:
|
||||
geometry.stretch: true
|
||||
style: dark
|
||||
factory:
|
||||
_start_: {$class: ru.m.tankz.view.StartFrame}
|
||||
_menu_: {$class: ru.m.tankz.view.MenuFrame}
|
||||
_level_: {$class: ru.m.tankz.view.LevelFrame}
|
||||
_start_: {$class: ru.m.tankz.view.StartFrame}
|
||||
_game_: {$class: ru.m.tankz.view.GameFrame}
|
||||
_result_: {$class: ru.m.tankz.view.ResultFrame}
|
||||
_settings_: {$class: ru.m.tankz.view.SettingsFrame}
|
||||
_record_: {$class: ru.m.tankz.view.RecordFrame}
|
||||
_room_list_: {$class: ru.m.tankz.view.network.RoomListFrame}
|
||||
_room_: {$class: ru.m.tankz.view.network.RoomFrame}
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- id: settings
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.settings
|
||||
+onPress: ~switcher.change('settings')
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
- id: username
|
||||
$type: haxework.view.form.LabelView
|
||||
style: text
|
||||
- id: login
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.login
|
||||
+onPress: ~login()
|
||||
- id: logout
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.logout
|
||||
+onPress: ~logout()
|
||||
visible: false
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
- id: close
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.close
|
||||
+onPress: ~close()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.view.layout.DefaultLayout;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.frame.FrameView;
|
||||
import ru.m.control.DeviceType;
|
||||
@@ -36,7 +37,7 @@ import ru.m.tankz.view.GamepadView;
|
||||
private var recorder:GameRecord;
|
||||
|
||||
public function new() {
|
||||
super(id);
|
||||
super(id, new DefaultLayout());
|
||||
}
|
||||
|
||||
public function init():Void {
|
||||
@@ -97,6 +98,6 @@ import ru.m.tankz.view.GamepadView;
|
||||
}
|
||||
|
||||
public function close():Void {
|
||||
switcher.change(StartFrame.ID);
|
||||
switcher.change(MenuFrame.ID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,10 @@
|
||||
---
|
||||
geometry.stretch: true
|
||||
layout:
|
||||
$type: haxework.view.layout.VerticalLayout
|
||||
style: container
|
||||
overflow.x: crop
|
||||
overflow.y: crop
|
||||
views:
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
overflow.x: crop
|
||||
overflow.y: crop
|
||||
views:
|
||||
- id: game
|
||||
$type: ru.m.tankz.view.game.GameView
|
||||
- id: game
|
||||
$type: ru.m.tankz.view.game.GameView
|
||||
- id: gamepad
|
||||
$type: ru.m.tankz.view.GamepadView
|
||||
geometry.position: absolute
|
||||
|
||||
@@ -1,33 +1,29 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.view.form.ButtonView;
|
||||
import haxework.view.data.DataView;
|
||||
import haxework.view.form.ButtonView;
|
||||
import haxework.view.form.LabelView;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.frame.FrameView;
|
||||
import haxework.view.form.LabelView;
|
||||
import ru.m.tankz.bundle.IConfigBundle;
|
||||
import ru.m.tankz.bundle.ILevelBundle;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.control.Controller;
|
||||
import ru.m.tankz.control.PlayerControl;
|
||||
import ru.m.tankz.game.GameInit;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.Type.PlayerId;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.popup.LevelPopup;
|
||||
import ru.m.tankz.Type.PackId;
|
||||
|
||||
@:template class LevelFrame extends FrameView<LevelPack> {
|
||||
@:template class LevelFrame extends FrameView<PackId> {
|
||||
public static inline var ID = "level";
|
||||
|
||||
@:view var header:LabelView;
|
||||
@:view var levels:DataView<LevelConfig, ButtonView>;
|
||||
|
||||
@:provide static var switcher:FrameSwitcher;
|
||||
@:provide static var storage:GameStorage;
|
||||
@:provide static var configBundle:IConfigBundle;
|
||||
@:provide static var levelBundle:ILevelBundle;
|
||||
|
||||
@:view var header:LabelView;
|
||||
@:view var levels:DataView<LevelConfig, ButtonView>;
|
||||
|
||||
private var pack:LevelPack;
|
||||
private var levelPopup:LevelPopup;
|
||||
private var config(get, never):Config;
|
||||
|
||||
public function new() {
|
||||
@@ -38,19 +34,12 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
return configBundle.get(pack.id.type);
|
||||
}
|
||||
|
||||
override public function onShow(data:LevelPack):Void {
|
||||
header.text = data.id.type;
|
||||
pack = data;
|
||||
override public function onShow(data:PackId):Void {
|
||||
header.text = data.type;
|
||||
pack = levelBundle.get(data);
|
||||
levels.data = pack.data;
|
||||
}
|
||||
|
||||
private function start(level:LevelConfig, presetId:PresetId, controls:Array<PlayerControl>):Void {
|
||||
switcher.change(GameFrame.ID, LOCAL({
|
||||
state: new GameState(pack.id.type, presetId, controls),
|
||||
level: level,
|
||||
}));
|
||||
}
|
||||
|
||||
private function levelViewFactory(index:Int, level:LevelConfig):ButtonView {
|
||||
var progress = storage.get(pack.id);
|
||||
var result = new ButtonView();
|
||||
@@ -62,37 +51,11 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
}
|
||||
|
||||
private function onLevelSelect(index:Int, level:LevelConfig, view:ButtonView):Void {
|
||||
if (!storage.get(pack.id).isLevelAvailable(level.id)) {
|
||||
return;
|
||||
if (storage.get(pack.id).isLevelAvailable(level.id)) {
|
||||
switcher.change(StartFrame.ID, {
|
||||
state: new GameState(pack.id.type),
|
||||
level: level,
|
||||
});
|
||||
}
|
||||
if (levelPopup == null) {
|
||||
levelPopup = new LevelPopup();
|
||||
}
|
||||
var controls:Array<PlayerControl> = [];
|
||||
var preset = config.getPreset(0);
|
||||
for (team in preset.teams) {
|
||||
if (team.id != "bot") { // ToDo:
|
||||
for (player in team.players) {
|
||||
var playerId = new PlayerId(team.id, player.index);
|
||||
controls.push({
|
||||
playerId: playerId,
|
||||
color: config.getColor(playerId),
|
||||
controller: NONE,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
controls.sort(function(a, b) return a.playerId.compare(b.playerId));
|
||||
if (controls.length > 0) {
|
||||
controls[0].controller = HUMAN(0);
|
||||
controls[0].name = ControllerParser.defaultName(controls[0].controller);
|
||||
}
|
||||
levelPopup.setData(
|
||||
level,
|
||||
config.presets,
|
||||
controls,
|
||||
storage.get(pack.id)
|
||||
);
|
||||
levelPopup.show().then(function(result) result != null ? start(level, result.presetId, result.controls) : {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,29 @@
|
||||
---
|
||||
views:
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
geometry.padding: 20
|
||||
views:
|
||||
- id: header
|
||||
$type: haxework.view.form.LabelView
|
||||
style: text.header
|
||||
- id: levels
|
||||
$type: haxework.view.data.DataView
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
overflow.y: scroll
|
||||
layout:
|
||||
$type: haxework.view.layout.TailLayout
|
||||
rowSize: 10
|
||||
margin: 5
|
||||
factory: ~levelViewFactory
|
||||
+onItemSelect: ~onLevelSelect
|
||||
geometry.padding: 10
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
views:
|
||||
- id: header
|
||||
$type: haxework.view.form.LabelView
|
||||
style: text.header
|
||||
- id: levels
|
||||
$type: haxework.view.data.DataView
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
overflow.y: scroll
|
||||
layout:
|
||||
$type: haxework.view.layout.TailLayout
|
||||
rowSize: 10
|
||||
margin: 5
|
||||
factory: ~levelViewFactory
|
||||
+onItemSelect: ~onLevelSelect
|
||||
geometry.padding: 10
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 100%
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.prev
|
||||
+onPress: ~switcher.change("menu")
|
||||
|
||||
96
src/client/haxe/ru/m/tankz/view/MenuFrame.hx
Normal file
96
src/client/haxe/ru/m/tankz/view/MenuFrame.hx
Normal file
@@ -0,0 +1,96 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.view.form.ButtonView;
|
||||
import haxework.view.form.LabelView;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.frame.FrameView;
|
||||
import ru.m.tankz.game.GameInit;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.network.NetworkManager;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.network.RoomFrame;
|
||||
import ru.m.tankz.view.network.RoomListFrame;
|
||||
import ru.m.tankz.view.popup.LoginPopup;
|
||||
|
||||
@:template class MenuFrame extends FrameView<Dynamic> {
|
||||
|
||||
public static var ID(default, never):String = "menu";
|
||||
|
||||
@:provide var gameInit:GameInit;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@:provide var network:NetworkManager;
|
||||
|
||||
@:view var username:LabelView;
|
||||
@:view("login") var loginButton:ButtonView;
|
||||
@:view("logout") var logoutButton:ButtonView;
|
||||
|
||||
public function new() {
|
||||
super(ID);
|
||||
}
|
||||
|
||||
override public function onShow(data:Dynamic):Void {
|
||||
super.onShow(data);
|
||||
network.stateSignal.connect(onConnectionState);
|
||||
onConnectionState(network.state);
|
||||
}
|
||||
|
||||
override public function onHide():Void {
|
||||
super.onHide();
|
||||
network.stateSignal.disconnect(onConnectionState);
|
||||
}
|
||||
|
||||
private function startGame(type:GameType):Void {
|
||||
gameInit = LOCAL({state: new GameState(type), level: null});
|
||||
switcher.change(LevelFrame.ID, new PackId(type));
|
||||
}
|
||||
|
||||
private function startNetwork():Void {
|
||||
switch network.state {
|
||||
case ONLINE(user):
|
||||
if (network.room != null) {
|
||||
switcher.change(RoomFrame.ID, network.room);
|
||||
network.joinGame(network.room.game.id, true);
|
||||
} else {
|
||||
switcher.change(RoomListFrame.ID);
|
||||
}
|
||||
case CONNECTED:
|
||||
LoginPopup.instance.show().then(function(user):Void {
|
||||
if (user != null) {
|
||||
switcher.change(RoomListFrame.ID);
|
||||
}
|
||||
});
|
||||
case _:
|
||||
}
|
||||
}
|
||||
|
||||
private function onConnectionState(state:ConnectionState):Void {
|
||||
L.d("ClientView", 'onConnectionState: ${state}');
|
||||
switch state {
|
||||
case ONLINE(user):
|
||||
username.text = user.name;
|
||||
logoutButton.visible = true;
|
||||
loginButton.visible = false;
|
||||
case CONNECTED:
|
||||
username.text = "";
|
||||
logoutButton.visible = false;
|
||||
loginButton.visible = true;
|
||||
case ERROR(error):
|
||||
//L.e("ClientView", 'onConnectionState: ERROR', error);
|
||||
L.w("ClientView", 'onConnectionState: ERROR');
|
||||
case _:
|
||||
username.text = "";
|
||||
logoutButton.visible = false;
|
||||
loginButton.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
private function login():Void {
|
||||
LoginPopup.instance.show().then(function(user:User):Void {
|
||||
L.d("Login", 'user: $user');
|
||||
});
|
||||
}
|
||||
|
||||
private function logout():Void {
|
||||
network.logout();
|
||||
}
|
||||
}
|
||||
65
src/client/haxe/ru/m/tankz/view/MenuFrame.yaml
Normal file
65
src/client/haxe/ru/m/tankz/view/MenuFrame.yaml
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
views:
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
layout.margin: 10
|
||||
overflow.y: scroll
|
||||
views:
|
||||
- $type: haxework.view.form.LabelView
|
||||
text: Tank'z
|
||||
style: font
|
||||
font.size: 100
|
||||
geometry.margin.bottom: 30
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startGame('classic')
|
||||
text: Classic
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startGame('dota')
|
||||
text: DotA
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startGame('death')
|
||||
text: DeathMatch
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~switcher.change('record')
|
||||
text: Records
|
||||
- id: network
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startNetwork()
|
||||
text: Network
|
||||
- $type: haxework.view.form.LabelView
|
||||
geometry.hAlign: right
|
||||
geometry.vAlign: top
|
||||
geometry.padding: [20, 5]
|
||||
geometry.position: absolute
|
||||
geometry.margin: [0, 20, 20, 0]
|
||||
style: text.box
|
||||
text: $r:text:version
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- id: settings
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.settings
|
||||
+onPress: ~switcher.change('settings')
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
- id: username
|
||||
$type: haxework.view.form.LabelView
|
||||
style: text
|
||||
- id: login
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.login
|
||||
+onPress: ~login()
|
||||
- id: logout
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.logout
|
||||
+onPress: ~logout()
|
||||
visible: false
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
@@ -7,12 +7,13 @@ import ru.m.tankz.game.record.GameRecord;
|
||||
import ru.m.tankz.storage.RecordStorage;
|
||||
|
||||
@:template class RecordFrame extends FrameView<Dynamic> {
|
||||
|
||||
public static var ID(default, never):String = "record";
|
||||
|
||||
@:view var data:VListView<GameRecordInfo>;
|
||||
@:provide static var switcher:FrameSwitcher;
|
||||
@:provide static var recordStorage:RecordStorage;
|
||||
|
||||
@:provide var recordStorage:RecordStorage;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@:view var data:VListView<GameRecordInfo>;
|
||||
|
||||
public function new() {
|
||||
super(ID);
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
views:
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
geometry.padding: 20
|
||||
views:
|
||||
- $type: haxework.view.form.LabelView
|
||||
style: text.header
|
||||
@@ -13,4 +12,13 @@ views:
|
||||
geometry.margin.top: 20
|
||||
geometry.stretch: true
|
||||
scroll:
|
||||
$type: haxework.view.list.VScrollBarView
|
||||
$type: haxework.view.list.VScrollBarView
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 100%
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.prev
|
||||
+onPress: ~switcher.change("menu")
|
||||
|
||||
@@ -56,7 +56,7 @@ import ru.m.tankz.view.common.LifeView;
|
||||
}
|
||||
|
||||
private function levels():Void {
|
||||
frames.change(LevelFrame.ID, levelBundle.get(result.level.packId));
|
||||
frames.change(LevelFrame.ID, result.level.packId);
|
||||
}
|
||||
|
||||
private function restart():Void {
|
||||
@@ -75,6 +75,6 @@ import ru.m.tankz.view.common.LifeView;
|
||||
}
|
||||
|
||||
private function close():Void {
|
||||
frames.change(StartFrame.ID);
|
||||
frames.change(MenuFrame.ID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,24 +10,30 @@ views:
|
||||
- id: result
|
||||
$type: haxework.view.data.DataView
|
||||
factory: ~playerViewFactory
|
||||
geometry.height: 100%
|
||||
overflow.y: scroll
|
||||
geometry.margin.top: 20
|
||||
layout:
|
||||
$type: haxework.view.layout.VerticalLayout
|
||||
hAlign: right
|
||||
margin: 10
|
||||
- $type: haxework.view.group.HGroupView
|
||||
layout.margin: 10
|
||||
geometry.padding: 10
|
||||
views:
|
||||
- id: levels
|
||||
$type: haxework.view.form.ButtonView
|
||||
text: Levels
|
||||
+onPress: ~levels()
|
||||
- id: restart
|
||||
$type: haxework.view.form.ButtonView
|
||||
text: Restart
|
||||
+onPress: ~restart()
|
||||
- id: next
|
||||
$type: haxework.view.form.ButtonView
|
||||
text: Next
|
||||
+onPress: ~next()
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
- id: levels
|
||||
$type: haxework.view.form.ButtonView
|
||||
text: Levels
|
||||
+onPress: ~levels()
|
||||
- id: restart
|
||||
$type: haxework.view.form.ButtonView
|
||||
text: Restart
|
||||
+onPress: ~restart()
|
||||
- id: next
|
||||
$type: haxework.view.form.ButtonView
|
||||
text: Next
|
||||
+onPress: ~next()
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.frame.FrameView;
|
||||
|
||||
@:template class SettingsFrame extends FrameView<Dynamic> {
|
||||
public static var ID(default, never):String = "settings";
|
||||
|
||||
@:provide static var switcher:FrameSwitcher;
|
||||
|
||||
public function new() {
|
||||
super(ID);
|
||||
}
|
||||
|
||||
@@ -1,24 +1,32 @@
|
||||
---
|
||||
views:
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
geometry.padding: 20
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
views:
|
||||
- $type: haxework.view.form.LabelView
|
||||
style: text.header
|
||||
text: Settings
|
||||
- $type: haxework.view.group.GroupView
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
overflow.y: scroll
|
||||
layout:
|
||||
$type: haxework.view.layout.TailLayout
|
||||
vAlign: top
|
||||
margin: 20
|
||||
views:
|
||||
- $type: haxework.view.form.LabelView
|
||||
style: text.header
|
||||
text: Settings
|
||||
- $type: haxework.view.group.GroupView
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
overflow.y: scroll
|
||||
layout:
|
||||
$type: haxework.view.layout.TailLayout
|
||||
vAlign: top
|
||||
margin: 20
|
||||
views:
|
||||
- id: settings0
|
||||
$type: ru.m.tankz.view.settings.SettingsEditor
|
||||
controlIndex: 0
|
||||
- id: settings1
|
||||
$type: ru.m.tankz.view.settings.SettingsEditor
|
||||
controlIndex: 1
|
||||
- id: settings0
|
||||
$type: ru.m.tankz.view.settings.SettingsEditor
|
||||
controlIndex: 0
|
||||
- id: settings1
|
||||
$type: ru.m.tankz.view.settings.SettingsEditor
|
||||
controlIndex: 1
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 100%
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.prev
|
||||
+onPress: ~switcher.change("menu")
|
||||
|
||||
@@ -1,50 +1,113 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.view.data.DataView;
|
||||
import haxework.view.form.ButtonView;
|
||||
import haxework.view.form.LabelView;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.frame.FrameView;
|
||||
import ru.m.tankz.bundle.ILevelBundle;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.control.Controller;
|
||||
import ru.m.tankz.control.PlayerControl;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.game.GameInit;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.network.NetworkManager;
|
||||
import ru.m.tankz.game.PackProgress;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.network.RoomFrame;
|
||||
import ru.m.tankz.view.network.RoomListFrame;
|
||||
import ru.m.tankz.view.popup.LoginPopup;
|
||||
import ru.m.tankz.view.common.SlotView;
|
||||
|
||||
@:template class StartFrame extends FrameView<Void> {
|
||||
using haxe.EnumTools.EnumValueTools;
|
||||
|
||||
@:template class StartFrame extends FrameView<Start> {
|
||||
|
||||
public static var ID(default, never):String = "start";
|
||||
|
||||
@:provide var gameInit:GameInit;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@:provide var network:NetworkManager;
|
||||
@:provide var levelBundle:ILevelBundle;
|
||||
@:provide static var switcher:FrameSwitcher;
|
||||
@:provide static var storage:GameStorage;
|
||||
|
||||
private var progress:PackProgress;
|
||||
|
||||
@:view var header:LabelView;
|
||||
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
|
||||
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>;
|
||||
|
||||
private var humanIndex:Int = 0;
|
||||
private var humanTotal:Int = 2;
|
||||
|
||||
|
||||
private var start:Start;
|
||||
|
||||
public function new() {
|
||||
super(ID);
|
||||
}
|
||||
|
||||
private function startGame(type:GameType):Void {
|
||||
gameInit = LOCAL({state: new GameState(type), level: null});
|
||||
switcher.change(LevelFrame.ID, levelBundle.get(new PackId(type)));
|
||||
override public function onShow(data:Start):Void {
|
||||
super.onShow(data);
|
||||
start = data;
|
||||
this.progress = storage.get(start.level.packId);
|
||||
header.text = '${start.state.type} - ${start.level.id}. ${start.level.name != null ? start.level.name : "#"}';
|
||||
presetsView.data = start.state.config.presets;
|
||||
slotsView.data = defaultControls(start.state.config);
|
||||
}
|
||||
|
||||
private function startNetwork():Void {
|
||||
switch network.state {
|
||||
case ONLINE(user):
|
||||
if (network.room != null) {
|
||||
switcher.change(RoomFrame.ID, network.room);
|
||||
network.joinGame(network.room.game.id, true);
|
||||
} else {
|
||||
switcher.change(RoomListFrame.ID);
|
||||
private static function defaultControls(config:Config):Array<PlayerControl> {
|
||||
var controls:Array<PlayerControl> = [];
|
||||
var preset = config.getPreset(0);
|
||||
for (team in preset.teams) {
|
||||
if (team.id != "bot") { // ToDo:
|
||||
for (player in team.players) {
|
||||
var playerId = new PlayerId(team.id, player.index);
|
||||
controls.push({
|
||||
playerId: playerId,
|
||||
color: config.getColor(playerId),
|
||||
controller: NONE,
|
||||
});
|
||||
}
|
||||
case CONNECTED:
|
||||
LoginPopup.instance.show().then(function(user):Void {
|
||||
if (user != null) {
|
||||
switcher.change(RoomListFrame.ID);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
controls.sort(function(a, b) return a.playerId.compare(b.playerId));
|
||||
if (controls.length > 0) {
|
||||
controls[0].controller = HUMAN(0);
|
||||
controls[0].name = ControllerParser.defaultName(controls[0].controller);
|
||||
}
|
||||
return controls;
|
||||
}
|
||||
|
||||
private function slotViewFactory(index:Int, value:PlayerControl):SlotView {
|
||||
var result = new SlotView();
|
||||
result.select.onSelect.connect(function(controller:Controller) setController(value, controller));
|
||||
result.control = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
private function setController(value:PlayerControl, controller:Controller):Void {
|
||||
switch controller {
|
||||
case NONE:
|
||||
case _:
|
||||
for (view in slotsView.dataViews) {
|
||||
if (view.control.controller.equals(controller)) {
|
||||
view.control.controller = NONE;
|
||||
view.select.selected = NONE;
|
||||
view.control.name = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
value.controller = controller;
|
||||
value.name = ControllerParser.defaultName(controller);
|
||||
}
|
||||
|
||||
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
|
||||
var result = new ButtonView();
|
||||
result.style = 'button${!progress.isPresetCompleted(start.level.id, value.id) ? ".active" : ""}';
|
||||
result.text = value.name;
|
||||
result.disabled = !progress.isPresetAvailable(start.level.id, value.id);
|
||||
return result;
|
||||
}
|
||||
|
||||
private function onPresetSelect(value:GamePreset):Void {
|
||||
if (progress.isPresetAvailable(start.level.id, value.id)) {
|
||||
start.state.presetId = value.id;
|
||||
start.state.controls = slotsView.data;
|
||||
switcher.change(GameFrame.ID, LOCAL(start));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +1,39 @@
|
||||
---
|
||||
views:
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
layout.margin: 10
|
||||
views:
|
||||
- $type: haxework.view.form.LabelView
|
||||
text: Tank'z
|
||||
style: font
|
||||
font.size: 100
|
||||
geometry.margin.bottom: 30
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startGame('classic')
|
||||
text: Classic
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startGame('dota')
|
||||
text: DotA
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startGame('death')
|
||||
text: DeathMatch
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~switcher.change('record')
|
||||
text: Records
|
||||
- id: network
|
||||
$type: haxework.view.form.ButtonView
|
||||
style: button.menu
|
||||
+onPress: ~startNetwork()
|
||||
text: Network
|
||||
- $type: haxework.view.form.LabelView
|
||||
geometry.hAlign: right
|
||||
geometry.vAlign: top
|
||||
geometry.padding: [20, 5]
|
||||
geometry.position: absolute
|
||||
geometry.margin: [0, 20, 20, 0]
|
||||
style: text.box
|
||||
text: $r:text:version
|
||||
- $type: haxework.view.group.VGroupView
|
||||
style: container
|
||||
views:
|
||||
- id: header
|
||||
$type: haxework.view.form.LabelView
|
||||
style: text.header
|
||||
- id: slots
|
||||
$type: haxework.view.data.DataView
|
||||
geometry.padding: 10
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
layout.hAlign: center
|
||||
overflow.y: scroll
|
||||
factory: ~slotViewFactory
|
||||
layout:
|
||||
$type: haxework.view.layout.VerticalLayout
|
||||
# $type: haxework.view.layout.TailLayout
|
||||
margin: 5
|
||||
- $type: haxework.view.group.HGroupView
|
||||
style: panel
|
||||
layout.margin: 10
|
||||
views:
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
- id: presets
|
||||
$type: haxework.view.data.DataView
|
||||
factory: ~presetViewFactory
|
||||
+onDataSelect: ~onPresetSelect
|
||||
layout:
|
||||
$type: haxework.view.layout.HorizontalLayout
|
||||
hAlign: center
|
||||
margin: 5
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.width: 50%
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: button.prev
|
||||
+onPress: ~switcher.change("level", start.level.packId)
|
||||
|
||||
@@ -15,7 +15,7 @@ import ru.m.tankz.control.PlayerControl;
|
||||
|
||||
private function set_control(value:PlayerControl):PlayerControl {
|
||||
control = value;
|
||||
slotLabel.text = '${control.playerId.team}(${control.playerId.index})';
|
||||
slotLabel.text = '${control.playerId.team} #${control.playerId.index}';
|
||||
slotLabel.font.color = value.color;
|
||||
select.selected = control.controller;
|
||||
return control;
|
||||
|
||||
@@ -50,4 +50,18 @@ import ru.m.tankz.Type;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
package ru.m.tankz.view.popup;
|
||||
|
||||
using haxe.EnumTools.EnumValueTools;
|
||||
import haxework.view.form.ButtonView;
|
||||
import haxework.view.data.DataView;
|
||||
import haxework.view.form.LabelView;
|
||||
import haxework.view.popup.PopupView;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.control.Controller;
|
||||
import ru.m.tankz.control.PlayerControl;
|
||||
import ru.m.tankz.game.PackProgress;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.common.SlotView;
|
||||
|
||||
private typedef Result = {
|
||||
var presetId:PresetId;
|
||||
var controls:Array<PlayerControl>;
|
||||
}
|
||||
|
||||
@:template class LevelPopup extends PopupView<Result> {
|
||||
|
||||
private var level:LevelConfig;
|
||||
private var progress:PackProgress;
|
||||
|
||||
@:view var name:LabelView;
|
||||
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
|
||||
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>;
|
||||
|
||||
private var humanIndex:Int = 0;
|
||||
private var humanTotal:Int = 2;
|
||||
|
||||
public function setData(level:LevelConfig, presets:Array<GamePreset>, controls:Array<PlayerControl>, progress:PackProgress):Void {
|
||||
this.level = level;
|
||||
this.progress = progress;
|
||||
name.text = '${level.id}. ${level.name != null ? level.name : "#"}';
|
||||
presetsView.data = presets;
|
||||
slotsView.data = controls;
|
||||
}
|
||||
|
||||
private function slotViewFactory(index:Int, value:PlayerControl):SlotView {
|
||||
var result = new SlotView();
|
||||
result.select.onSelect.connect(function(controller:Controller) setController(value, controller));
|
||||
result.control = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
private function setController(value:PlayerControl, controller:Controller):Void {
|
||||
switch controller {
|
||||
case NONE:
|
||||
case _:
|
||||
for (view in slotsView.dataViews) {
|
||||
if (view.control.controller.equals(controller)) {
|
||||
view.control.controller = NONE;
|
||||
view.select.selected = NONE;
|
||||
view.control.name = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
value.controller = controller;
|
||||
value.name = ControllerParser.defaultName(controller);
|
||||
}
|
||||
|
||||
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
|
||||
var result = new ButtonView();
|
||||
result.style = 'button${!progress.isPresetCompleted(level.id, value.id) ? ".active" : ""}';
|
||||
result.text = value.name;
|
||||
result.disabled = !progress.isPresetAvailable(level.id, value.id);
|
||||
return result;
|
||||
}
|
||||
|
||||
private function onPresetSelect(value:GamePreset):Void {
|
||||
if (progress.isPresetAvailable(level.id, value.id)) {
|
||||
close({presetId: value.id, controls: slotsView.data});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
---
|
||||
layout.hAlign: center
|
||||
layout.vAlign: middle
|
||||
view:
|
||||
$type: haxework.view.group.VGroupView
|
||||
layout.hAlign: center
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
# geometry.width: 400
|
||||
# geometry.height: 400
|
||||
geometry.margin: 10
|
||||
style: window
|
||||
views:
|
||||
- $type: haxework.view.group.HGroupView
|
||||
geometry.width: 100%
|
||||
geometry.padding: 10
|
||||
layout.vAlign: middle
|
||||
views:
|
||||
- id: name
|
||||
$type: haxework.view.form.LabelView
|
||||
geometry.width: 100%
|
||||
geometry.margin.left: 10
|
||||
layout.hAlign: left
|
||||
style: text
|
||||
- $type: haxework.view.form.ButtonView
|
||||
style: window.close
|
||||
+onPress: ~reject('close')
|
||||
- id: slots
|
||||
$type: haxework.view.data.DataView
|
||||
geometry.padding: 10
|
||||
geometry.width: 100%
|
||||
geometry.height: 100%
|
||||
layout.hAlign: center
|
||||
overflow.y: scroll
|
||||
factory: ~slotViewFactory
|
||||
layout:
|
||||
$type: haxework.view.layout.VerticalLayout
|
||||
# $type: haxework.view.layout.TailLayout
|
||||
margin: 5
|
||||
- id: presets
|
||||
$type: haxework.view.data.DataView
|
||||
factory: ~presetViewFactory
|
||||
+onDataSelect: ~onPresetSelect
|
||||
layout:
|
||||
$type: haxework.view.layout.HorizontalLayout
|
||||
hAlign: center
|
||||
margin: 5
|
||||
style: panel
|
||||
Reference in New Issue
Block a user