[client] update haxework. ep7

This commit is contained in:
2019-03-12 17:21:50 +03:00
parent b62956cc95
commit c9ec4395ee
25 changed files with 166 additions and 296 deletions

View File

@@ -1,17 +0,0 @@
package ru.m.draw;
import haxework.color.Color;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;
import flash.display.BitmapData;
class BitmapUtil {
public static function colorize(data: BitmapData, color: Color):BitmapData {
if (color.zero) return data;
var result = data.clone();
var transform = new ColorTransform(color.red / 255, color.green / 255, color.blue / 255, 1, 0, 0, 0, 0);
result.colorTransform(new Rectangle(0, 0, result.width, result.height), transform);
return result;
}
}

View File

@@ -7,28 +7,24 @@ skinId: light
views:
- id: switcher
$type: haxework.gui.frame.FrameSwitcher
animateFactory: { $class: haxework.animate.CircleMaskAnimate }
geometry.size.width: 960
geometry.size.height: 720
skinId: dark
geometry.size.stretch: true
layout.hAlign: center
layout.vAlign: middle
views:
- id: start
$type: ru.m.tankz.frame.StartFrame
skinId: dark
# classic
- id: classic.level
$type: ru.m.tankz.frame.classic.ClassicLevelFrame
skinId: dark
- id: classic.game
$type: ru.m.tankz.frame.classic.ClassicGameFrame
# dota
- id: dota.level
$type: ru.m.tankz.frame.dota.DotaLevelFrame
skinId: dark
- id: dota.game
$type: ru.m.tankz.frame.dota.DotaGameFrame
# - id: network
# $type: ru.m.tankz.frame.NetworkFrame
# skinId: dark
- id: settings
$type: ru.m.tankz.frame.SettingsFrame
skinId: dark

View File

@@ -24,6 +24,14 @@ class Style {
Skin.text(textColor, 18, fontFamily),
Skin.size(250, 50)
]);
resources.skin.put("text.box", [
Skin.color(lightColor),
Skin.text(textColor, 16, fontFamily),
]);
resources.skin.put("text.box.active", [
Skin.color(0x55aa55),
Skin.text(textColor, 16, fontFamily),
]);
resources.skin.put("button.simple", [
Skin.buttonColor(lightColor),
Skin.text(textColor, 16, fontFamily),

View File

@@ -1,28 +1,29 @@
---
geometry.size.stretch: true
layout.hAlign: center
layout.vAlign: middle
views:
- $type: haxework.gui.LabelView
skinId: text
geometry.size.percent.width: 100
geometry.size.fixed.height: 20
text: Settings
- $type: haxework.gui.HGroupView
geometry.size.stretch: true
views:
- $type: ru.m.tankz.frame.settings.SettingsEditor
geometry.size.percent.width: 50
geometry.size.percent.height: 100
controlIndex: 0
- $type: ru.m.tankz.frame.settings.SettingsEditor
geometry.size.percent.width: 50
geometry.size.percent.height: 100
controlIndex: 1
- id: close
$type: haxework.gui.ButtonView
skinId: button.close
+onPress: $this:onPress
geometry.position: absolute
geometry.margin.left: 10
geometry.margin.bottom: 10
geometry.vAlign: bottom
geometry.hAlign: left
- $type: haxework.gui.LabelView
skinId: text
geometry.size.fixed.height: 20
text: Settings
- $type: haxework.gui.HGroupView
geometry.size.width: 100%
views:
- $type: ru.m.tankz.frame.settings.SettingsEditor
geometry.size.percent.width: 50
#geometry.size.percent.height: 100
controlIndex: 0
- $type: ru.m.tankz.frame.settings.SettingsEditor
geometry.size.percent.width: 50
#geometry.size.percent.height: 100
controlIndex: 1
- id: close
$type: haxework.gui.ButtonView
skinId: button.close
+onPress: $this:onPress
geometry.position: absolute
geometry.margin.left: 10
geometry.margin.bottom: 10
geometry.vAlign: bottom
geometry.hAlign: left

View File

@@ -42,7 +42,4 @@ views:
geometry.vAlign: bottom
geometry.hAlign: left
skinId: button.settings
# skin:
# - $type: haxework.gui.skin.ButtonBitmapSkin
# image: $asset:image:resources/image/ui/settings.png
+onPress: $this:onPress

View File

@@ -1,13 +1,11 @@
---
layout:
$type: haxework.gui.layout.HorizontalLayout
margin: 5
hAlign: center
vAlign: middle
geometry.size.stretch: true
views:
- id: render
$type: ru.m.tankz.render.Render
- id: panel
$type: ru.m.tankz.frame.classic.ClassicGamePanel
geometry.size.width: 200
geometry.size.height: 100%

View File

@@ -1,26 +1,26 @@
package ru.m.tankz.frame.classic;
import ru.m.tankz.frame.common.IGamePanel;
import haxework.gui.LabelView;
import haxework.gui.VGroupView;
import ru.m.tankz.frame.common.IGamePanel;
import ru.m.tankz.frame.common.LifeView;
import ru.m.tankz.game.Game;
import ru.m.tankz.preset.ClassicGame;
@:template class ClassicGamePanel extends VGroupView implements IGamePanel {
@:view var botstate(default, null):LabelView;
@:view var player1state(default, null):LabelView;
@:view var player2state(default, null):LabelView;
@:view var bot:LifeView;
@:view var player1:LifeView;
@:view var player2:LifeView;
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';
bot.count.text = '${game.teams[ClassicGame.BOT].life}';
player1.count.text = '${game.teams[ClassicGame.HUMAN].players[0].state.life}';
if (game.teams[ClassicGame.HUMAN].players[1] != null) {
player2state.text = 'Player2: ${game.teams[ClassicGame.HUMAN].players[1].state.life} life';
player2.count.text = '${game.teams[ClassicGame.HUMAN].players[1].state.life}';
} else {
player2state.text = "";
player2.count.text = "";
}
}

View File

@@ -1,18 +1,16 @@
---
layout.vAlign: middle
geometry.padding: 5
layout.margin: 5
layout.hAlign: right
views:
- id: botstate
$type: haxework.gui.LabelView
skin: $r:skin:text
geometry.size.width: 100%
geometry.size.height: 20
- id: player1state
$type: haxework.gui.LabelView
skinId: text
geometry.size.width: 100%
geometry.size.height: 20
- id: player2state
$type: haxework.gui.LabelView
skinId: text
geometry.size.width: 100%
geometry.size.height: 20
- id: bot
$type: ru.m.tankz.frame.common.LifeView
image.image: $asset:image:resources/image/tank/ba-0.png
- id: player1
$type: ru.m.tankz.frame.common.LifeView
image.image: $asset:image:resources/image/tank/pa-0.png
image.color: 0xFFFF00
- id: player2
$type: ru.m.tankz.frame.common.LifeView
image.image: $asset:image:resources/image/tank/pa-0.png
image.color: 0x15C040

View File

@@ -1,5 +1,4 @@
---
geometry.size.stretch: true
layout:
$type: haxework.gui.layout.VerticalLayout
hAlign: center
@@ -12,7 +11,6 @@ views:
margin: 2
factory: $this:presetViewFactory
+onDataSelect: $code:function(value) preset = value
geometry.size.width: 100%
geometry.padding: 10
- id: levels
$type: haxework.gui.DataView<Int>
@@ -22,5 +20,4 @@ views:
margin: 5
factory: $this:levelViewFactory
+onDataSelect: $code:function(value) level = value
geometry.size.stretch: true
geometry.padding: 10

View File

@@ -0,0 +1,10 @@
package ru.m.tankz.frame.common;
import haxework.gui.LabelView;
import haxework.gui.ImageView;
import haxework.gui.HGroupView;
@:template class LifeView extends HGroupView {
@:view public var image:ImageView;
@:view public var count:LabelView;
}

View File

@@ -0,0 +1,9 @@
---
layout.margin: 5
views:
- id: image
$type: haxework.gui.ImageView
- id: count
$type: haxework.gui.LabelView
skinId: text.box
geometry.size.fixed: [50, 38]

View File

@@ -1,5 +1,5 @@
---
geometry.size.width: 50%
geometry.size.width: 200
geometry.size.height: 44
geometry.margin: 5
layout.margin: 10

View File

@@ -1,130 +1,21 @@
package ru.m.tankz.frame.dota;
import ru.m.tankz.frame.classic.ClassicGamePanel;
import ru.m.tankz.frame.common.GameFrame;
import ru.m.tankz.frame.common.IGamePanel;
import flash.events.Event;
import haxe.ds.Option;
import haxe.Timer;
import haxework.gui.core.Geometry.Position;
import haxework.gui.frame.FrameSwitcher;
import haxework.gui.VGroupView;
import ru.m.tankz.game.Game;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.preset.ClassicGame;
import ru.m.tankz.preset.DotaGame;
import ru.m.tankz.render.Render;
import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.storage.SaveStorage;
import ru.m.tankz.Type.GameType;
@:template class DotaGameFrame extends VGroupView {
private static inline var TAG = "GameFrame";
@:template class DotaGameFrame extends GameFrame {
public static inline var ID = "dota.game";
@:view var render(default, null):Render;
@:view("render") private var renderView(default, null):Render;
@:view("panel") private var panelView(default, null):IGamePanel;
@:view var dotaPanel(default, null):DotaGamePanel;
@:view var classicPanel(default, null):ClassicGamePanel;
private var panels:Map<GameType, IGamePanel>;
@:provide var network:NetworkManager;
@:provide var sound:SoundManager;
@:provide var state:GameState;
@:provide var storage:SaveStorage;
@:provide var switcher:FrameSwitcher;
private var game:Game;
private var timer:Timer;
public function init():Void {
panels = new Map();
panels.set(ClassicGame.TYPE, classicPanel);
panels.set(DotaGame.TYPE, dotaPanel);
override private function get_render():Render {
return renderView;
}
public function onShow():Void {
start(state);
}
private function connectGame(game: Game) {
game.engine.connect(render);
game.engine.connect(sound);
}
private function start(state:GameState):Void {
for (type in panels.keys()) {
panels.get(type).visible = type == state.type;
panels.get(type).geometry.position = type == state.type ? LAYOUT : ABSOLUTE;
}
// ToDo: local / network game
switch (1) {
case 1:
game = new Game(state.type);
connectGame(game);
game.start(state).then(onGameStateChange).endThen(onGameComplete);
timer = new Timer(10);
timer.run = updateEngine;
case 2:
game = new NetworkGame(state.type);
connectGame(game);
network.game = cast game;
}
panels.get(state.type).game = game;
content.addEventListener(Event.ENTER_FRAME, _redraw);
render.draw(game.engine);
sound.play('start');
}
private function stop():Void {
if (timer != null) {
timer.stop();
timer = null;
}
content.removeEventListener(Event.ENTER_FRAME, _redraw);
if (game != null) {
game.dispose();
game = null;
}
render.reset();
}
private function onGameStateChange(s:GameState):GameState {
panels.get(s.type).toUpdate();
return s;
}
private function onGameComplete(result:Option<GameState>):Void {
switch (result) {
case Option.Some(s):
panels.get(s.type).toUpdate();
case Option.None:
}
switch (game.next()) {
case Option.Some(s):
var state = game.save();
this.state = state;
storage.write(state);
stop();
start(state);
case Option.None:
switcher.change(StartFrame.ID);
}
}
public function onHide():Void {
stop();
}
private function updateEngine():Void {
game.engine.update();
}
private function _redraw(_):Void {
render.draw(game.engine);
override private function get_panel():IGamePanel {
return panelView;
}
}

View File

@@ -1,24 +1,9 @@
---
geometry.size.stretch: true
layout.hAlign: center
layout.vAlign: middle
layout:
$type: haxework.gui.layout.VerticalLayout
margin: 5
views:
- id: dotaPanel
- id: panel
$type: ru.m.tankz.frame.dota.DotaGamePanel
geometry.size.width: 100%
geometry.size.height: 20
geometry.position: absolute
visible: false
- $type: haxework.gui.HGroupView
geometry.size.stretch: true
layout.hAlign: center
layout.vAlign: middle
views:
- id: render
$type: ru.m.tankz.render.Render
- id: classicPanel
$type: ru.m.tankz.frame.classic.ClassicGamePanel
geometry.size.width: 200
geometry.size.height: 100%
geometry.position: absolute
visible: false
- id: render
$type: ru.m.tankz.render.Render

View File

@@ -1,13 +1,15 @@
package ru.m.tankz.frame.dota;
import ru.m.tankz.preset.DotaGame;
import ru.m.tankz.frame.common.LifeView;
import ru.m.tankz.frame.common.IGamePanel;
import haxework.gui.LabelView;
import haxework.gui.HGroupView;
import ru.m.tankz.game.Game;
@:template class DotaGamePanel extends HGroupView implements IGamePanel {
@:view var state(default, null):LabelView;
@:view var radiant:LifeView;
@:view var dire:LifeView;
public var game:Game;
@@ -34,7 +36,8 @@ import ru.m.tankz.game.Game;
}
private function updateViews():Void {
state.text = stateString(game);
radiant.count.text = '${game.teams[DotaGame.RADIANT].life}';
dire.count.text = '${game.teams[DotaGame.DIRE].life}';
}
override public function update():Void {

View File

@@ -1,7 +1,14 @@
---
geometry.size.width: 100%
layout.margin: 20
views:
- id: state
$type: haxework.gui.LabelView
skinId: text
- id: radiant
$type: ru.m.tankz.frame.common.LifeView
image.image: $asset:image:resources/image/tank/bc-0.png
image.color: 0xff4422
- $type: haxework.gui.SpriteView
geometry.size.width: 100%
geometry.size.height: 20
- id: dire
$type: ru.m.tankz.frame.common.LifeView
image.image: $asset:image:resources/image/tank/bc-0.png
image.color: 0x3284ff

View File

@@ -1,5 +1,4 @@
---
geometry.size.stretch: true
layout:
$type: haxework.gui.layout.HorizontalLayout
views:
@@ -9,7 +8,6 @@ views:
$type: haxework.gui.layout.VerticalLayout
hAlign: center
factory: $this:playerViewFactory
geometry.size.percent: [50, 100]
geometry.padding: 10
- id: levels
$type: haxework.gui.DataView<Int>
@@ -19,5 +17,4 @@ views:
margin: 5
factory: $this:levelViewFactory
+onDataSelect: $code:function(value) level = value
geometry.size.percent: [50, 100]
geometry.padding: 10

View File

@@ -3,7 +3,6 @@ package ru.m.tankz.frame.settings;
import haxework.gui.HGroupView;
import haxework.gui.LabelView;
import haxework.gui.list.ListView.IListItemView;
import haxework.gui.skin.ColorSkin;
import openfl.Assets;
import openfl.events.KeyboardEvent;
import promhx.Deferred;
@@ -11,7 +10,6 @@ import promhx.Promise;
import ru.m.tankz.control.ActionConfig;
import ru.m.tankz.control.Control;
class KeyboardMap {
private var data:Map<Int, String>;
@@ -36,7 +34,6 @@ class KeyboardMap {
}
}
@:template class ActionView extends HGroupView implements IListItemView<ActionItem> {
public var item_index(default, default):Int;
@@ -67,7 +64,7 @@ class KeyboardMap {
}
public function edit():Promise<Int> {
cast(this.skin[0], ColorSkin).color = 0x00ff00;
action.skinId = key.skinId = "text.box.active";
toRedraw();
editDeferred = new Deferred();
content.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
@@ -76,9 +73,8 @@ class KeyboardMap {
private function onKeyDown(event: KeyboardEvent):Void {
content.stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
cast(this.skin[0], ColorSkin).color = 0x000000;
action.skinId = key.skinId = "text.box";
toRedraw();
data.key = event.keyCode;
key.text = keyLabel(data.key);
editDeferred.resolve(data.key);

View File

@@ -1,21 +1,12 @@
---
geometry.size.width: 100%
geometry.size.height: 44
geometry.margin: 5
layout.margin: 5
views:
- id: action
$type: haxework.gui.LabelView
skinId: text
geometry.size.width: 50%
geometry.size.height: 100%
text: ""
- id: key
$type: haxework.gui.LabelView
skinId: text
geometry.size.width: 50%
geometry.size.height: 100%
text: ""
skin:
- $type: haxework.gui.skin.ColorSkin
color: 0x000000
alpha: 0.2
- id: action
$type: haxework.gui.LabelView
geometry.size.fixed: [200, 38]
skinId: text.box
- id: key
$type: haxework.gui.LabelView
geometry.size.fixed: [200, 38]
skinId: text.box

View File

@@ -1,8 +1,8 @@
package ru.m.tankz.frame.settings;
import haxework.gui.ButtonView;
import haxework.gui.DataView;
import haxework.gui.LabelView;
import haxework.gui.list.ListView;
import haxework.gui.VGroupView;
import promhx.Promise;
import ru.m.tankz.control.ActionConfig.ActionItem;
@@ -14,7 +14,7 @@ import ru.m.tankz.storage.SettingsStorage;
public var controlIndex(default, set): Int;
@:view var label:LabelView;
@:view var list:ListView<ActionItem>;
@:view var list:DataView<ActionItem>;
@:view var change:ButtonView;
@:view var clear:ButtonView;
@:view var reset:ButtonView;
@@ -28,6 +28,13 @@ import ru.m.tankz.storage.SettingsStorage;
return this.controlIndex;
}
private function viewFactory(index:Int, value:ActionItem) {
var view = new ActionView();
view.item_index = index;
view.data = value;
return view;
}
public function onPress(view:ButtonView):Void {
switch (view.id) {
case "change": _change();
@@ -39,7 +46,7 @@ import ru.m.tankz.storage.SettingsStorage;
private function _change():Void {
var p: Promise<Int> = Promise.promise(0);
for (view in list.items) {
for (view in list.views) {
var v: ActionView = cast view;
if (v.data == null) break;
p = p.pipe(function(_):Promise<Int> return v.edit());
@@ -51,6 +58,7 @@ import ru.m.tankz.storage.SettingsStorage;
for (item in list.data) {
item.key = -1;
}
list.data = list.data;
list.toUpdate();
_save();
}

View File

@@ -1,32 +1,29 @@
layout.margin: 10
layout.hAlign: center
views:
- id: label
$type: haxework.gui.LabelView
skinId: text
- $type: haxework.gui.HGroupView
layout.margin: 10
views:
- id: change
$type: haxework.gui.ButtonView
+onPress: $this:onPress
skinId: button.simple
text: Change
- id: clear
$type: haxework.gui.ButtonView
+onPress: $this:onPress
skinId: button.simple
text: Clear
- id: reset
$type: haxework.gui.ButtonView
+onPress: $this:onPress
skinId: button.simple
text: Reset
- id: list
$type: haxework.gui.list.VListView<ru.m.tankz.control.ActionItem>
factory: $code:function() return new ru.m.tankz.frame.settings.ActionView()
geometry.size.stretch: true
scroll:
$type: haxework.gui.list.VScrollBarView
geometry.position: absolute
visible: false
- id: label
$type: haxework.gui.LabelView
skinId: text
- $type: haxework.gui.HGroupView
layout.margin: 10
views:
- id: change
$type: haxework.gui.ButtonView
+onPress: $this:onPress
skinId: button.simple
text: Change
- id: clear
$type: haxework.gui.ButtonView
+onPress: $this:onPress
skinId: button.simple
text: Clear
- id: reset
$type: haxework.gui.ButtonView
+onPress: $this:onPress
skinId: button.simple
text: Reset
- id: list
$type: haxework.gui.DataView<ru.m.tankz.control.ActionItem>
layout:
$type: haxework.gui.layout.VerticalLayout
factory: $this:viewFactory

View File

@@ -1,7 +1,7 @@
package ru.m.tankz.render;
import haxework.gui.utils.BitmapUtil;
import haxework.color.Color;
import ru.m.draw.BitmapUtil;
import flash.display.BitmapData;
import openfl.Assets;
import ru.m.animate.Animate;
@@ -9,7 +9,6 @@ import ru.m.animate.OnceAnimate;
import ru.m.tankz.core.Tank;
import ru.m.tankz.Type;
class AnimateBundle {
private static function buildAnimate(name:String, sequence:Array<Int>):OnceAnimate {

View File

@@ -1,7 +1,5 @@
package ru.m.tankz.render;
import haxework.resources.IResources;
import haxework.provider.Provider;
import flash.display.DisplayObjectContainer;
import flash.display.Graphics;
import flash.display.Sprite;
@@ -9,6 +7,8 @@ import flash.text.TextField;
import flash.text.TextFormat;
import haxe.Timer;
import haxework.gui.SpriteView;
import haxework.provider.Provider;
import haxework.resources.IResources;
import ru.m.animate.Animate;
import ru.m.animate.OnceAnimate;
import ru.m.geom.Point;
@@ -17,7 +17,6 @@ import ru.m.tankz.engine.Engine;
import ru.m.tankz.render.RenderItem;
import ru.m.tankz.Type;
class Render extends SpriteView {
private var backgroundLayer:Sprite;