[client] update frames

This commit is contained in:
2019-06-27 11:59:28 +03:00
parent eb7c311bb6
commit fbc9238d2f
18 changed files with 131 additions and 88 deletions

View File

@@ -13,7 +13,10 @@ class LevelBundle implements ILevelBundle {
var bytes = Assets.getBytes('levels/${id}.zip');
return {
id: id,
data: LevelUtil.unpack(bytes),
data: LevelUtil.unpack(bytes).map(function(level) {
level.packId = id;
return level;
}),
};
}
}

View File

@@ -3,11 +3,38 @@ package ru.m.tankz.local;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameRunner;
import ru.m.tankz.local.LocalControlFactory;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.Type;
class LocalGame extends GameRunner {
@:provide static var gameStorage:GameStorage;
public function new(start:Start) {
super(start);
controlFactory = new LocalControlFactory();
}
override public function onGameEvent(event:GameEvent):Void {
super.onGameEvent(event);
switch event {
case COMPLETE(result):
updateProgress(result);
case _:
}
}
private static function updateProgress(result:Result):Void {
var complete = true;
for (rule in result.state.config.game.complete) {
if (rule.team != null && rule.team != result.winner) {
complete = false;
}
}
if (complete) {
var progress = gameStorage.get(new PackId(result.state.type));
progress.completeLevel(result.level.id, result.state.presetId);
gameStorage.set(progress);
}
}
}

View File

@@ -207,9 +207,7 @@ class Render extends SpriteView implements IRender {
var item = items[id];
entryLayer.removeChild(item.view);
playAnimate(item.rect.center, AnimateBundle.tankBoom());
if (shot.score != null) {
showScore(item.rect.center, shot.score);
}
showScore(item.rect.center, shot.score);
items.remove(id);
}
case DESTROY(BULLET(id)):
@@ -226,18 +224,14 @@ class Render extends SpriteView implements IRender {
if (items.exists(id)) {
var item = items[id];
playAnimate(item.rect.center, AnimateBundle.tankBoom());
if (shot.score != null) {
showScore(item.rect.center, shot.score);
}
showScore(item.rect.center, shot.score);
cast(item, EagleRenderItem).death = true;
}
case DESTROY(BONUS(id, shot)):
if (items.exists(id)) {
var item = items[id];
upperLayer.removeChild(item.view);
if (shot.score != null) {
showScore(item.rect.center, shot.score);
}
showScore(item.rect.center, shot.score);
items.remove(id);
}
case DESTROY(CELL(id, x, y, shot)):
@@ -266,15 +260,17 @@ class Render extends SpriteView implements IRender {
});
}
private function showScore(point:Point, score:Int):Void {
var view:LabelView = new LabelView();
view.skinId = "text";
view.text = Std.string(score);
view.update();
view.redraw();
view.x = point.x - view.width / 2;
view.y = point.y - view.height / 2;
upperLayer.addChild(view.content);
Timer.delay(function() upperLayer.removeChildSafety(view.content), 1000);
private function showScore(point:Point, score:Null<Int>):Void {
if (score != null && score != 0) {
var view:LabelView = new LabelView();
view.skinId = "text";
view.text = Std.string(score);
view.update();
view.redraw();
view.x = point.x - view.width / 2;
view.y = point.y - view.height / 2;
upperLayer.addChild(view.content);
Timer.delay(function() upperLayer.removeChildSafety(view.content), 1000);
}
}
}

View File

@@ -14,7 +14,6 @@ import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.storage.SettingsStorage;
import ru.m.tankz.Type;
import ru.m.tankz.view.game.GameView;
import ru.m.tankz.view.GamepadView;
@@ -31,7 +30,6 @@ import ru.m.tankz.view.GamepadView;
@:provide static var gameStorage:GameStorage;
@:provide static var settings:SettingsStorage;
//@:provide var result:Result;
@:provide static var bus:IControlBus;
private var game:IGame;
@@ -87,29 +85,12 @@ import ru.m.tankz.view.GamepadView;
public function onGameEvent(event:GameEvent):Void {
switch event {
case COMPLETE(result):
//this.result = result;
updateProgress(game, result.winner);
stop();
switcher.change(ResultFrame.ID, result);
case _:
}
}
// ToDo:
private static function updateProgress(game:IGame, winner:TeamId):Void {
var complete = true;
for (rule in game.config.game.complete) {
if (rule.team != null && rule.team != winner) {
complete = false;
}
}
if (complete) {
var progress = gameStorage.get(new PackId(game.state.type));
progress.completeLevel(game.level.id, game.state.presetId);
gameStorage.set(progress);
}
}
override public function onHide():Void {
stop();
soundManager.stopAll();

View File

@@ -1,21 +1,23 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container
geometry.padding: 20
views:
- id: header
$type: haxework.view.LabelView
skinId: text.header
- id: levels
$type: haxework.view.DataView
geometry.size.width: 100%
layout:
$type: haxework.view.layout.TailLayout
rowSize: 10
margin: 5
factory: $this:levelViewFactory
+onItemSelect: $this:onLevelSelect
geometry.padding: 10
- $type: haxework.view.ScrollView
geometry.size.stretch: true
scroll.skinId: scroll.vertical
view:
id: levels
$type: haxework.view.DataView
geometry.size.width: 100%
layout:
$type: haxework.view.layout.TailLayout
rowSize: 10
margin: 5
factory: $this:levelViewFactory
+onItemSelect: $this:onLevelSelect
geometry.padding: 10

View File

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

View File

@@ -1,11 +1,15 @@
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 ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.view.common.LifeView;
@:template class ResultFrame extends FrameView<Result> {
@@ -13,10 +17,13 @@ import ru.m.tankz.view.common.LifeView;
@:view("result") var resultView:DataView<PlayerState, LifeView>;
@:view("level") var levelLabel:LabelView;
@:view("next") var nextButton:ButtonView;
@:provide var frames:FrameSwitcher;
@:provide static var levelBundle:ILevelBundle;
@:provide static var gameStorage:GameStorage;
private var state:GameState;
private var result:Result;
public function new() {
super(ID);
@@ -24,28 +31,45 @@ import ru.m.tankz.view.common.LifeView;
private function playerViewFactory(index:Int, player:PlayerState):LifeView {
var view = new LifeView();
var playerConfig = state.config.getPlayer(player.id);
var playerConfig = result.state.config.getPlayer(player.id);
var tankType = playerConfig.tanks[0].type;
var tankConfig = state.config.getTank(tankType);
var tankConfig = result.state.config.getTank(tankType);
view.tank = tankConfig == null ? 'ba' : tankConfig.skin;
view.color = state.getPlayerColor(player.id);
view.color = result.state.getPlayerColor(player.id);
view.life = player.frags;
view.score = player.score;
return view;
}
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}';
result = data;
resultView.data = Lambda.array(result.state.players);
var label = '${result.state.type} Level ${result.level.id}';
if (result.level.name != null) {
label += '\n${result.level.name}';
}
levelLabel.text = label;
nextButton.visible = gameStorage.get(result.level.packId).isPresetAvailable(result.level.id + 1, result.state.presetId);
nextButton.text = 'Next (${result.level.id + 1})';
}
private function levels():Void {
frames.change(LevelFrame.ID, levelBundle.get(result.level.packId));
}
private function restart():Void {
frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: result.level}));
}
private function next():Void {
//ToDo: next level?
var pack = levelBundle.get(result.level.packId);
if (pack.data.length > result.level.id + 1) {
var level = pack.data[result.level.id + 1];
var progress = gameStorage.get(pack.id);
if (progress.isPresetAvailable(level.id, result.state.presetId)) {
frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: level}));
}
}
}
private function close():Void {

View File

@@ -1,7 +1,4 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container
@@ -18,3 +15,22 @@ views:
$type: haxework.view.layout.VerticalLayout
hAlign: right
margin: 10
- $type: haxework.view.HGroupView
layout.margin: 10
geometry.padding: 10
views:
- id: levels
$type: haxework.view.ButtonView
skinId: button.simple
text: Levels
+onPress: $code:levels()
- id: restart
$type: haxework.view.ButtonView
skinId: button.simple
text: Restart
+onPress: $code:restart()
- id: next
$type: haxework.view.ButtonView
skinId: button.simple
text: Next
+onPress: $code:next()

View File

@@ -1,7 +1,4 @@
---
geometry.size.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
views:
- $type: haxework.view.VGroupView
skinId: container
@@ -12,9 +9,7 @@ views:
text: Settings
- $type: haxework.view.ScrollView
geometry.size.stretch: true
scroll:
$type: haxework.view.list.VScrollBarView
skinId: scroll.vertical
scroll.skinId: scroll.vertical
view:
$type: haxework.view.GroupView
geometry.size.stretch: true

View File

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

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.view.common;
import haxework.color.Color;
import haxework.view.HGroupView;
import haxework.view.ImageView;
import haxework.view.LabelView;
@@ -16,7 +17,7 @@ import ru.m.tankz.Type;
public var playerId(default, default):PlayerId;
public var state(null, set):PlayerState;
public var tank(null, set):String;
public var color(null, set):Int;
public var color(null, set):Color;
public var life(null, set):Int;
public var score(null, set):Int;
@@ -37,7 +38,7 @@ import ru.m.tankz.Type;
return tank;
}
private inline function set_color(value:Int):Int {
private inline function set_color(value:Color):Color {
tankImage.color = value;
return value;
}

View File

@@ -51,9 +51,7 @@ view:
text: Level
- $type: haxework.view.ScrollView
geometry.size.stretch: true
scroll:
$type: haxework.view.list.VScrollBarView
skinId: scroll.vertical
scroll.skinId: scroll.vertical
view:
id: level
$type: haxework.view.DataView