[client] update Frames

This commit is contained in:
2019-06-24 22:09:52 +03:00
parent d0ebf05f1c
commit bc95ca03e2
21 changed files with 140 additions and 104 deletions

View File

@@ -1,6 +1,5 @@
package ru.m.tankz.view;
import ru.m.tankz.game.IGame;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import haxework.resources.IResources;
@@ -8,6 +7,7 @@ import haxework.view.ButtonView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.LabelView;
import haxework.view.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;

View File

@@ -4,23 +4,15 @@ views:
id: switcher
geometry.size.stretch: true
skinId: dark
views:
- id: start
$type: ru.m.tankz.view.StartFrame
- id: level
$type: ru.m.tankz.view.LevelFrame
- id: game
$type: ru.m.tankz.view.GameFrame
- id: result
$type: ru.m.tankz.view.ResultFrame
- id: settings
$type: ru.m.tankz.view.SettingsFrame
- id: record
$type: ru.m.tankz.view.RecordFrame
- id: room_list
$type: ru.m.tankz.view.network.RoomListFrame
- id: room
$type: ru.m.tankz.view.network.RoomFrame
factory:
_start_: {$class: ru.m.tankz.view.StartFrame}
_level_: {$class: ru.m.tankz.view.LevelFrame}
_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.HGroupView
skinId: panel
layout.margin: 10

View File

@@ -1,7 +1,7 @@
package ru.m.tankz.view;
import haxework.view.frame.FrameSwitcher;
import haxework.view.VGroupView;
import haxework.view.frame.FrameView;
import ru.m.control.DeviceType;
import ru.m.control.IControlBus;
import ru.m.tankz.game.GameEvent;
@@ -18,7 +18,7 @@ import ru.m.tankz.Type;
import ru.m.tankz.view.game.GameView;
import ru.m.tankz.view.GamepadView;
@:template class GameFrame extends VGroupView implements GameListener {
@:template class GameFrame extends FrameView<GameInit> implements GameListener {
public static inline var ID = "game";
private static inline var TAG = "GameFrame";
@@ -31,18 +31,21 @@ import ru.m.tankz.view.GamepadView;
@:provide static var gameStorage:GameStorage;
@:provide static var settings:SettingsStorage;
@:provide var gameInit:GameInit;
//@:provide var result:Result;
@:provide static var bus:IControlBus;
private var game:IGame;
private var recorder:GameRecord;
public function new() {
super(id);
}
public function init():Void {
bus.connect(gamepad);
}
public function onShow():Void {
override public function onShow(data:GameInit):Void {
gamepad.visible = false;
// ToDo:
for (i in 0...1) {
@@ -55,7 +58,7 @@ import ru.m.tankz.view.GamepadView;
}
}
}
game = switch gameInit {
game = switch data {
case LOCAL(start): new LocalGame(start);
case NETWORK(network): new NetworkGame(network);
case RECORD(record): new GamePlayer(record);
@@ -87,7 +90,7 @@ import ru.m.tankz.view.GamepadView;
//this.result = result;
updateProgress(game, result.winner);
stop();
switcher.change(ResultFrame.ID);
switcher.change(ResultFrame.ID, result);
case _:
}
}
@@ -107,12 +110,12 @@ import ru.m.tankz.view.GamepadView;
}
}
public function onHide():Void {
override public function onHide():Void {
stop();
soundManager.stopAll();
}
public function close():Void {
switcher.change(LevelFrame.ID);
switcher.change(StartFrame.ID);
}
}

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container

View File

@@ -3,60 +3,55 @@ package ru.m.tankz.view;
import haxework.view.ButtonView;
import haxework.view.DataView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.LabelView;
import haxework.view.VGroupView;
import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.Type;
import ru.m.tankz.view.popup.LevelPopup;
@:template class LevelFrame extends VGroupView {
@:template class LevelFrame extends FrameView<LevelPack> {
public static inline var ID = "level";
@:view var header:LabelView;
@:view var levels:DataView<LevelConfig, ButtonView>;
@:provide var gameInit:GameInit;
@:provide var switcher:FrameSwitcher;
@:provide var levelBundle:ILevelBundle;
@:provide var storage:GameStorage;
@:provide static var switcher:FrameSwitcher;
@:provide static var storage:GameStorage;
@:provide static var configBundle:IConfigBundle;
private var pack:LevelPack;
private var levelPopup:LevelPopup;
private var config(get, never):Config;
public function onShow():Void {
var state = getState();
header.text = state.type;
pack = levelBundle.get(new PackId(state.type));
public function new() {
super(ID);
}
private function get_config():Config {
return configBundle.get(pack.id.type);
}
override public function onShow(data:LevelPack):Void {
header.text = data.id.type;
pack = data;
levels.data = pack.data;
}
private function getState():GameState {
return switch gameInit {
case LOCAL(start): start.state;
case _: null;
}
}
private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void {
switch gameInit {
case LOCAL(start):
start.state.presetId = preset.id;
start.state.controls = control.values;
start.level = level;
case _:
}
switcher.change(GameFrame.ID);
switcher.change(GameFrame.ID, LOCAL({
state: new GameState(pack.id.type, preset.id, control.values),
level: level,
}));
}
private function levelViewFactory(index:Int, level:LevelConfig):ButtonView {
var progress = storage.get(pack.id);
var result = new ButtonView();
result.skinId = "button.level";
var presetsLine = [for (p in getState().config.presets) progress.isPresetCompleted(level.id, p.id) ? '*' : '_'].join('');
var presetsLine = [for (p in config.presets) progress.isPresetCompleted(level.id, p.id) ? '*' : '_'].join('');
result.text = '${level.id}\n${presetsLine}';
result.disabled = !progress.isLevelAvailable(level.id);
return result;
@@ -69,11 +64,10 @@ import ru.m.tankz.view.popup.LevelPopup;
if (levelPopup == null) {
levelPopup = new LevelPopup();
}
var state = getState();
levelPopup.setData(
level,
state.config.presets,
state.config.controls,
config.presets,
config.controls,
storage.get(pack.id)
);
levelPopup.show().then(function(result) result != null ? start(level, result.preset, result.control) : {});

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container

View File

@@ -1,13 +1,12 @@
package ru.m.tankz.view;
import haxework.view.frame.FrameSwitcher;
import haxework.view.list.ListView;
import haxework.view.frame.FrameView;
import haxework.view.list.VListView;
import haxework.view.VGroupView;
import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.storage.RecordStorage;
@:template class RecordFrame extends VGroupView {
@:template class RecordFrame extends FrameView<Dynamic> {
public static var ID(default, never):String = "record";
@:view var data:VListView<GameRecordInfo>;
@@ -15,13 +14,13 @@ import ru.m.tankz.storage.RecordStorage;
@:provide var recordStorage:RecordStorage;
@:provide var switcher:FrameSwitcher;
public function onShow():Void {
public function new() {
super(ID);
}
override public function onShow(_:Dynamic):Void {
var data = Lambda.array(recordStorage);
data.sort(function(a:GameRecordInfo, b:GameRecordInfo) return Std.int(b.date.getTime() - a.date.getTime()));
this.data.data = data;
}
private function onRecordSelect(item:IListItemView<GameRecordInfo>):Void {
}
}

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container
@@ -10,7 +13,6 @@ views:
- id: data
$type: haxework.view.list.VListView
factory: $code:function() return new ru.m.tankz.view.common.RecordView()
+onItemSelect: $this:onRecordSelect
geometry.margin.top: 20
geometry.size.stretch: true
scroll:

View File

@@ -2,44 +2,53 @@ package ru.m.tankz.view;
import haxework.view.DataView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.LabelView;
import haxework.view.VGroupView;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
import ru.m.tankz.game.IGame;
import ru.m.tankz.view.common.LifeView;
@:template class ResultFrame extends VGroupView {
@:template class ResultFrame extends FrameView<Result> {
public static var ID(default, never):String = "result";
@:view("result") var resultView:DataView<PlayerState, LifeView>;
@:view("level") var levelLabel:LabelView;
@:provide var frames:FrameSwitcher;
@:provide var game:IGame;
private function playerViewFactory(index:Int, player:PlayerState) {
private var state:GameState;
public function new() {
super(ID);
}
private function playerViewFactory(index:Int, player:PlayerState):LifeView {
var view = new LifeView();
// ToDo:
/*var playerConfig = state.config.getPlayer(player.id);
var playerConfig = state.config.getPlayer(player.id);
var tankType = playerConfig.tanks[0].type;
var tankConfig = state.config.getTank(tankType);
view.tank = tankConfig == null ? 'ba' : tankConfig.skin;
view.color = state.getPlayerColor(player.id);
view.life = player.frags;
view.score = player.score;*/
view.score = player.score;
return view;
}
public function onShow() {
//resultView.data = Lambda.array(state.players);
//levelLabel.text = 'Level ${state.levelId}'; // ToDo: level?
override public function onShow(data:Result):Void {
state = data.state;
resultView.data = Lambda.array(data.state.players);
var label = '${data.state.type} Level ${data.level.id}';
if (data.level.name != null) {
label += '\n${data.level.name}';
}
levelLabel.text = label;
}
private function next() {
private function next():Void {
//ToDo: next level?
}
private function close() {
frames.change(LevelFrame.ID);
private function close():Void {
frames.change(StartFrame.ID);
}
}

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container
@@ -6,6 +9,7 @@ views:
- id: level
$type: haxework.view.LabelView
skinId: text.header
align: center
- id: result
$type: haxework.view.DataView
factory: $this:playerViewFactory

View File

@@ -1,7 +1,11 @@
package ru.m.tankz.view;
import haxework.view.VGroupView;
import haxework.view.frame.FrameView;
@:template class SettingsFrame extends VGroupView {
@:template class SettingsFrame extends FrameView<Dynamic> {
public static var ID(default, never):String = "settings";
public function new() {
super(ID);
}
}

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container

View File

@@ -1,36 +1,42 @@
package ru.m.tankz.view;
import haxework.view.frame.FrameSwitcher;
import haxework.view.VGroupView;
import haxework.view.frame.FrameView;
import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.Type.GameType;
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.FontPopup;
import ru.m.tankz.view.popup.LoginPopup;
@:template class StartFrame extends VGroupView {
@:template class StartFrame extends FrameView<Void> {
public static var ID(default, never):String = "start";
@:provide var gameInit:GameInit;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
@:provide var levelBundle:ILevelBundle;
private var fontPopup:FontPopup;
public function new() {
super(ID);
}
private function startGame(type:GameType):Void {
gameInit = LOCAL({state: new GameState(type), level: null});
switcher.change(LevelFrame.ID);
switcher.change(LevelFrame.ID, levelBundle.get(new PackId(type)));
}
private function startNetwork():Void {
switch network.state {
case ONLINE(user):
if (network.room != null) {
switcher.change(RoomFrame.ID);
switcher.change(RoomFrame.ID, network.room);
network.joinGame(network.room.game.id, true);
} else {
switcher.change(RoomListFrame.ID);

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container

View File

@@ -19,7 +19,6 @@ import ru.m.tankz.storage.RecordStorage;
@:provide var recordStorage:RecordStorage;
@:provide var switcher:FrameSwitcher;
@:provide var gameInit:GameInit;
private function set_data(value:GameRecordInfo):GameRecordInfo {
if (data != value) {
@@ -34,8 +33,7 @@ import ru.m.tankz.storage.RecordStorage;
private function play():Void {
var record = recordStorage.read(data.id);
gameInit = RECORD(record);
switcher.change(GameFrame.ID);
switcher.change(GameFrame.ID, RECORD(record));
}
private function delete():Void {

View File

@@ -2,15 +2,15 @@ package ru.m.tankz.view.network;
import haxework.view.ButtonView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.list.VListView;
import haxework.view.TextView;
import haxework.view.VGroupView;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.proto.room.RoomSlotProto;
@:template class RoomFrame extends VGroupView {
@:template class RoomFrame extends FrameView<RoomProto> {
public static inline var ID = "room";
@@ -20,7 +20,10 @@ import ru.m.tankz.proto.room.RoomSlotProto;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
@:provide var gameInit:GameInit;
public function new() {
super(ID);
}
private function refresh(room:RoomProto):Void {
if (room != null) {
@@ -28,20 +31,19 @@ import ru.m.tankz.proto.room.RoomSlotProto;
info.text = '${room.game.type} #${room.game.level}';
slots.data = room.slots;
if (room.game.started) {
gameInit = NETWORK(network);
switcher.change(GameFrame.ID);
switcher.change(GameFrame.ID, NETWORK(network));
}
} else {
Timer.delay(function() switcher.change(RoomListFrame.ID), 1);
}
}
public function onShow():Void {
refresh(network.room);
override public function onShow(data:RoomProto):Void {
refresh(data);
network.roomSignal.connect(refresh);
}
public function onHide():Void {
override public function onHide():Void {
network.roomSignal.disconnect(refresh);
}
}

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container

View File

@@ -1,13 +1,13 @@
package ru.m.tankz.view.network;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.list.VListView;
import haxework.view.VGroupView;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.view.popup.CreateGamePopup;
@:template class RoomListFrame extends VGroupView {
@:template class RoomListFrame extends FrameView<Dynamic> {
public static inline var ID = "room_list";
@:view var games:VListView<RoomProto>;
@@ -15,13 +15,17 @@ import ru.m.tankz.view.popup.CreateGamePopup;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
public function onShow():Void {
public function new() {
super(ID);
}
override public function onShow(_:Dynamic):Void {
network.listRoomSignal.connect(onRoomList);
network.roomSignal.connect(onRoom);
network.listGame(true);
}
public function onHide():Void {
override public function onHide():Void {
network.listRoomSignal.disconnect(onRoomList);
network.roomSignal.disconnect(onRoom);
network.listGame(false);
@@ -41,7 +45,7 @@ import ru.m.tankz.view.popup.CreateGamePopup;
private function onRoom(room:RoomProto):Void {
if (room != null) {
switcher.change(RoomFrame.ID);
switcher.change(RoomFrame.ID, room);
}
}
}

View File

@@ -1,4 +1,7 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container

View File

@@ -14,6 +14,7 @@ typedef Start = {
typedef Result = {
var state:GameState;
var level:LevelConfig;
var winner:TeamId;
}

View File

@@ -160,7 +160,7 @@ class GameRunner extends Game implements EngineListener {
private function complete(winner:TeamId):Void {
Timer.delay(function() {
gameEventSignal.emit(COMPLETE({state: state, winner: winner}));
gameEventSignal.emit(COMPLETE({state: state, level: level, winner: winner}));
}, 3000);
}