[editor] add PackListFrame

This commit is contained in:
2019-09-06 16:23:31 +03:00
parent 40bdf6a5cc
commit 4fa5cf84fa
17 changed files with 252 additions and 179 deletions

View File

@@ -137,7 +137,7 @@ const editor = new Project(
meta: { meta: {
filename: 'editor', filename: 'editor',
width: 1024, width: 1024,
height: 850, height: 768,
}, },
flags: [ flags: [
//'dev_layout', //'dev_layout',

View File

@@ -14,7 +14,6 @@ import ru.m.tankz.game.record.GamePlayer;
import ru.m.tankz.game.record.GameRecord; import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.local.LocalGame; import ru.m.tankz.local.LocalGame;
import ru.m.tankz.network.NetworkGame; import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.preset.DotaGame;
import ru.m.tankz.sound.SoundManager; import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.storage.SettingsStorage; import ru.m.tankz.storage.SettingsStorage;
@@ -58,7 +57,7 @@ import ru.m.tankz.view.gamepad.GamepadView;
case RECORD(record): new GamePlayer(record); case RECORD(record): new GamePlayer(record);
} }
gameView = switch game.type { gameView = switch game.type {
case DotaGame.TYPE: GameViewB.factory(game.config); case "dota": GameViewB.factory(game.config);
case _: GameViewA.factory(game.config); case _: GameViewA.factory(game.config);
}; };
gameViewContainer.addView(gameView); gameViewContainer.addView(gameView);

View File

@@ -5,6 +5,8 @@ overflow.y: crop
views: views:
- id: game - id: game
$type: ru.m.tankz.view.game.GameViewContainer $type: ru.m.tankz.view.game.GameViewContainer
layout.hAlign: center
layout.vAlign: middle
- id: gamepad - id: gamepad
$type: ru.m.tankz.view.gamepad.GamepadView $type: ru.m.tankz.view.gamepad.GamepadView
geometry.position: absolute geometry.position: absolute

View File

@@ -1,5 +1,7 @@
package ru.m.tankz.view.game; package ru.m.tankz.view.game;
import haxework.view.geometry.HAlign;
import haxework.view.geometry.VAlign;
import haxework.view.group.GroupView; import haxework.view.group.GroupView;
class GameViewContainer extends GroupView { class GameViewContainer extends GroupView {
@@ -10,8 +12,16 @@ class GameViewContainer extends GroupView {
var s = Math.min(parent.width / width, parent.height / height); var s = Math.min(parent.width / width, parent.height / height);
if (s < 1) { if (s < 1) {
content.scaleX = content.scaleY = s; content.scaleX = content.scaleY = s;
content.x = (parent.width - width * s) / 2; content.x = switch layout.hAlign {
content.y = (parent.height - height * s) / 2; case LEFT | NONE: 0;
case CENTER: (parent.width - width * s) / 2;
case RIGHT: (parent.width - width * s);
}
content.y = switch layout.vAlign {
case TOP | NONE: 0;
case MIDDLE: (parent.height - height * s) / 2;
case BOTTOM: (parent.height - height * s);
}
} else { } else {
content.scaleX = content.scaleY = 1; content.scaleX = content.scaleY = 1;
} }

View File

@@ -1,10 +0,0 @@
package ru.m.tankz.preset;
import ru.m.tankz.Type;
class ClassicGame {
public static var TYPE(default, never):GameType = 'classic';
public static var HUMAN(default, never):TeamId = 'human';
public static var BOT(default, never):TeamId = 'bot';
}

View File

@@ -1,7 +0,0 @@
package ru.m.tankz.preset;
import ru.m.tankz.Type;
class DeathGame {
public static var TYPE(default, never):GameType = 'death';
}

View File

@@ -1,10 +0,0 @@
package ru.m.tankz.preset;
import ru.m.tankz.Type;
class DotaGame {
public static var TYPE(default, never):GameType = 'dota';
public static var RADIANT(default, never):TeamId = 'radiant';
public static var DIRE(default, never):TeamId = 'dire';
}

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.editor; package ru.m.tankz.editor;
import haxework.view.frame.FrameSwitcher;
import haxework.provider.Provider; import haxework.provider.Provider;
import haxework.resources.IResources; import haxework.resources.IResources;
import haxework.resources.Resources; import haxework.resources.Resources;
@@ -10,13 +11,14 @@ import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.bundle.LevelBundle; import ru.m.tankz.bundle.LevelBundle;
import ru.m.tankz.editor.view.EditorView; import ru.m.tankz.editor.view.EditorView;
import ru.m.tankz.editor.view.MapFrame; import ru.m.tankz.editor.view.PackListFrame;
class Editor { class Editor {
private static inline var TAG = 'Editor'; private static inline var TAG = "Editor";
@:provide static var resources:IResources; @:provide static var resources:IResources;
@:provide static var theme:ITheme; @:provide static var theme:ITheme;
@:provide static var switcher:FrameSwitcher;
public static function main() { public static function main() {
L.push(new haxework.log.TraceLogger()); L.push(new haxework.log.TraceLogger());
@@ -31,7 +33,7 @@ class Editor {
L.i(TAG, 'Version: ${Const.VERSION}'); L.i(TAG, 'Version: ${Const.VERSION}');
L.i(TAG, 'Build: ${Const.BUILD}'); L.i(TAG, 'Build: ${Const.BUILD}');
resources = new Resources(); resources = new Resources();
resources.text.put('version', '${Const.VERSION}'); resources.text.put("version", '${Const.VERSION}');
theme = new AppTheme(); theme = new AppTheme();
@@ -40,6 +42,7 @@ class Editor {
var view = new EditorView(); var view = new EditorView();
Root.bind(view); Root.bind(view);
view.switcher.change(MapFrame.ID); switcher = view.switcher;
switcher.change(PackListFrame.ID);
} }
} }

View File

@@ -1,31 +1,9 @@
--- ---
$type: haxework.view.VGroupView
style: dark
geometry.stretch: true
layout.hAlign: center
views: views:
# Tabs - $type: haxework.view.frame.FrameSwitcher
- id: tabs id: switcher
$type: haxework.view.data.ButtonGroup<String>
geometry.margin.bottom: -4
layout.margin: 2
buttonStyle: button.tab
+onDataSelect: ~function(id) switcher.change(id)
data:
- "map"
- "tank"
selected: "map"
# Switcher
- id: switcher
$type: haxework.view.frame.FrameSwitcher
geometry.stretch: true geometry.stretch: true
style: dark
factory: factory:
_map_: {$class: ru.m.tankz.editor.view.MapFrame} _pack_list_: {$class: ru.m.tankz.editor.view.PackListFrame}
_tank_: {$class: ru.m.tankz.editor.view.TankFrame} _pack_: {$class: ru.m.tankz.editor.view.PackFrame}
# Version
- $type: haxework.view.form.LabelView
geometry.position: absolute
geometry.vAlign: top
geometry.hAlign: right
geometry.margin: 10
text: $r:text:version

View File

@@ -1,85 +0,0 @@
---
geometry.stretch: true
geometry.padding: 10
overflow.y: scroll
layout:
$type: haxework.view.layout.VerticalLayout
margin: 2
vAlign: top
hAlign: center
views:
- $type: haxework.view.group.HGroupView
layout.margin: 5
views:
- $type: haxework.view.form.ButtonView
text: Classic
+onPress: ~function(_) type = 'classic'
- $type: haxework.view.form.ButtonView
text: DotA
+onPress: ~function(_) type = 'dota'
- $type: haxework.view.form.ButtonView
text: DeathMatch
+onPress: ~function(_) type = 'death'
- $type: haxework.view.group.HGroupView
layout.vAlign: middle
views:
- $type: haxework.view.form.LabelView
text: "Name:"
- id: levelName
$type: haxework.view.form.InputView
geometry.width: 300
geometry.height: 26
text: ""
- $type: haxework.view.form.LabelView
text: "Size:"
geometry.margin.left: 20
- id: width
$type: haxework.view.form.InputView
geometry.width: 50
geometry.height: 26
- $type: haxework.view.form.LabelView
text: "x"
- id: height
$type: haxework.view.form.InputView
geometry.width: 50
geometry.height: 26
- $type: haxework.view.form.ButtonView
style: button.start.small
+onPress: ~applySize()
- $type: haxework.view.form.ButtonView
style: button.close.small
+onPress: ~resetSize()
# map
- $type: haxework.view.group.HGroupView
views:
- id: spawnPointList
$type: haxework.view.data.DataView
geometry.padding: 3
layout:
$type: haxework.view.layout.VerticalLayout
hAlign: center
margin: 5
factory: ~ru.m.tankz.editor.view.map.SpawnPointView.factory
+onDataSelect: ~selectSpawnPoint
- id: mapView
$type: ru.m.tankz.editor.view.map.MapEditView
- id: brickList
$type: haxework.view.data.DataView
geometry.padding: 3
layout:
$type: haxework.view.layout.VerticalLayout
hAlign: center
margin: 5
factory: ~ru.m.tankz.editor.view.map.BrickView.factory
+onDataSelect: ~selectBrick
- $type: haxework.view.group.HGroupView
layout.margin: 5
views:
- id: openButton
$type: haxework.view.form.ButtonView
text: Open
+onPress: ~open()
- id: saveButton
$type: haxework.view.form.ButtonView
text: Save
+onPress: ~save()

View File

@@ -1,25 +1,31 @@
package ru.m.tankz.editor.view; package ru.m.tankz.editor.view;
import haxework.view.list.LabelListItem;
import haxework.view.data.DataView; import haxework.view.data.DataView;
import haxework.view.frame.FrameView;
import haxework.view.form.InputView; import haxework.view.form.InputView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.list.ListView;
import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.editor.FileUtil; import ru.m.tankz.editor.FileUtil;
import ru.m.tankz.editor.view.map.BrickView; import ru.m.tankz.editor.view.map.BrickView;
import ru.m.tankz.editor.view.map.MapEditView; import ru.m.tankz.editor.view.map.MapEditView;
import ru.m.tankz.editor.view.map.SpawnPointView; import ru.m.tankz.editor.view.map.SpawnPointView;
import ru.m.tankz.preset.ClassicGame;
import ru.m.tankz.Type; import ru.m.tankz.Type;
import ru.m.tankz.util.LevelUtil; import ru.m.tankz.util.LevelUtil;
@:template class MapFrame extends FrameView<Dynamic> { using ru.m.tankz.view.ViewUtil;
public static inline var ID = 'map';
public static inline var TAG = 'map'; @:template class PackFrame extends FrameView<LevelPack> {
public static inline var ID = "pack";
public var type(default, set):GameType; public var type(default, set):GameType;
public var level(default, set):LevelConfig;
private var fileName:String; private var fileName:String;
@:view var levels:ListView<LevelConfig>;
@:view var levelName:InputView; @:view var levelName:InputView;
@:view var mapView:MapEditView; @:view var mapView:MapEditView;
@:view var spawnPointList:DataView<SpawnPoint, SpawnPointView>; @:view var spawnPointList:DataView<SpawnPoint, SpawnPointView>;
@@ -29,14 +35,16 @@ import ru.m.tankz.util.LevelUtil;
@:provide var configBundle:IConfigBundle; @:provide var configBundle:IConfigBundle;
@:provide var config:Config; @:provide var config:Config;
@:provide static var switcher:FrameSwitcher;
public function new() { public function new() {
super(ID); super(ID);
} }
public function init():Void { override public function onShow(data:LevelPack):Void {
fileName = "level000.txt"; super.onShow(data);
type = ClassicGame.TYPE; type = data.id.type;
levels.data = data.data;
} }
private function set_type(value:GameType):GameType { private function set_type(value:GameType):GameType {
@@ -52,6 +60,31 @@ import ru.m.tankz.util.LevelUtil;
return type; return type;
} }
private function set_level(value:LevelConfig):LevelConfig {
level = value;
mapView.gridSize = level.size;
mapView.data = level;
levelName.text = level.name;
if (level.size != null) {
widthInput.text = Std.string(level.size.width);
heightInput.text = Std.string(level.size.height);
} else {
widthInput.text = Std.string(config.map.grid.width);
heightInput.text = Std.string(config.map.grid.height);
}
return level;
}
private function levelViewFactory():IListItemView<LevelConfig> {
var result = new LabelListItem(function(index:Int, value:LevelConfig) return value.toLevelLabel(true));
result.geometry.height = 48;
return result;
}
private function onLevelSelect(item:IListItemView<LevelConfig>):Void {
level = item.data;
}
private function updateSelected(brick:BrickConfig = null, point:SpawnPoint = null) { private function updateSelected(brick:BrickConfig = null, point:SpawnPoint = null) {
for (v in brickList.dataViews) { for (v in brickList.dataViews) {
v.selected = v.data == brick; v.selected = v.data == brick;
@@ -74,17 +107,7 @@ import ru.m.tankz.util.LevelUtil;
private function open():Void { private function open():Void {
FileUtil.browse().then(function(content:FileContent) { FileUtil.browse().then(function(content:FileContent) {
fileName = content.name; fileName = content.name;
var data = LevelUtil.loads(content.content); level = LevelUtil.loads(content.content);
mapView.gridSize = data.size;
mapView.data = data;
levelName.text = data.name;
if (data.size != null) {
widthInput.text = Std.string(data.size.width);
heightInput.text = Std.string(data.size.height);
} else {
widthInput.text = Std.string(config.map.grid.width);
heightInput.text = Std.string(config.map.grid.height);
}
}); });
} }

View File

@@ -0,0 +1,92 @@
---
views:
- $type: haxework.view.group.HGroupView
geometry.stretch: true
views:
- id: levels
$type: haxework.view.list.VListView
geometry.width: 200
geometry.height: 100%
factory: ~levelViewFactory
+onItemSelect: ~onLevelSelect
scroll:
$type: haxework.view.list.VScrollBarView
- $type: haxework.view.group.VGroupView
geometry.stretch: true
views:
- $type: haxework.view.group.HGroupView
style: panel
views:
- $type: haxework.view.form.LabelView
text: "Name:"
- id: levelName
$type: haxework.view.form.InputView
geometry.width: 300
geometry.height: 26
text: ""
- $type: haxework.view.form.LabelView
text: "Size:"
geometry.margin.left: 20
- id: width
$type: haxework.view.form.InputView
geometry.width: 50
geometry.height: 26
- $type: haxework.view.form.LabelView
text: "x"
- id: height
$type: haxework.view.form.InputView
geometry.width: 50
geometry.height: 26
- $type: haxework.view.form.ButtonView
style: button.start.small
+onPress: ~applySize()
- $type: haxework.view.form.ButtonView
style: button.close.small
+onPress: ~resetSize()
- $type: haxework.view.group.HGroupView
geometry.stretch: true
views:
- id: spawnPointList
$type: haxework.view.data.DataView
geometry.padding: 3
layout:
$type: haxework.view.layout.VerticalLayout
hAlign: center
margin: 5
factory: ~ru.m.tankz.editor.view.map.SpawnPointView.factory
+onDataSelect: ~selectSpawnPoint
- id: brickList
$type: haxework.view.data.DataView
geometry.padding: 3
layout:
$type: haxework.view.layout.VerticalLayout
hAlign: center
margin: 5
factory: ~ru.m.tankz.editor.view.map.BrickView.factory
+onDataSelect: ~selectBrick
- $type: haxework.view.group.GroupView
geometry.stretch: true
overflow.x: crop
overflow.y: crop
views:
- $type: ru.m.tankz.view.game.GameViewContainer
views:
- id: mapView
$type: ru.m.tankz.editor.view.map.MapEditView
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- $type: haxework.view.SpriteView
geometry.width: 100%
- id: openButton
$type: haxework.view.form.ButtonView
text: Open
+onPress: ~open()
- id: saveButton
$type: haxework.view.form.ButtonView
text: Save
+onPress: ~save()
- $type: haxework.view.form.ButtonView
style: button.prev
+onPress: ~switcher.change("pack_list")

View File

@@ -0,0 +1,41 @@
package ru.m.tankz.editor.view;
import haxework.view.data.DataView;
import haxework.view.form.ButtonView;
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.Type;
@:template class PackListFrame extends FrameView<Dynamic> {
public static inline var ID = "pack_list";
@:view("packs") var packView:DataView<LevelPack, ButtonView>;
@:provide static var levelBundle:ILevelBundle;
@:provide static var switcher:FrameSwitcher;
public function new() {
super(ID);
}
override public function onShow(data:Dynamic):Void {
super.onShow(data);
packView.data = [
levelBundle.get(new PackId("classic")),
levelBundle.get(new PackId("dota")),
levelBundle.get(new PackId("death")),
];
}
private function packViewFactory(index:Int, value:LevelPack):ButtonView {
var result = new ButtonView();
result.text = value.id;
return result;
}
private function onPackSelect(value:LevelPack):Void {
switcher.change(PackFrame.ID, value);
}
}

View File

@@ -0,0 +1,23 @@
---
views:
- id: packs
$type: haxework.view.data.DataView
geometry.width: 100%
geometry.height: 100%
geometry.padding: 30
overflow.y: scroll
layout:
$type: haxework.view.layout.TailLayout
rowSize: 10
margin: 5
factory: ~packViewFactory
+onDataSelect: ~onPackSelect
- $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("pack_list")

View File

@@ -1,11 +1,24 @@
package ru.m.tankz.editor.view.map; package ru.m.tankz.editor.view.map;
import flash.geom.Matrix;
import flash.display.BitmapData;
import openfl.utils.Assets;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
class BrickView extends BrushView<BrickConfig> { class BrickView extends BrushView<BrickConfig> {
override private function resolveSrc(value:BrickConfig):String { override private function resolveImage(value:BrickConfig):BitmapData {
return 'resources/image/map/${value.type}.png'; var image = Assets.getBitmapData('resources/image/map/${value.type}.png');
var result = new BitmapData(image.width * 2, image.height * 2, true, 0x00000000);
var m = new Matrix();
result.draw(image, m);
m.translate(image.width, 0);
result.draw(image, m);
m.translate(0, image.height);
result.draw(image, m);
m.translate(-image.width, 0);
result.draw(image, m);
return result;
} }
public static inline function factory(index:Int, value:BrickConfig) { public static inline function factory(index:Int, value:BrickConfig) {

View File

@@ -1,9 +1,9 @@
package ru.m.tankz.editor.view.map; package ru.m.tankz.editor.view.map;
import haxework.color.Color; import flash.display.BitmapData;
import flash.display.Shape; import flash.display.Shape;
import haxework.color.Color;
import haxework.view.ImageView; import haxework.view.ImageView;
import openfl.utils.Assets;
class BrushView<D> extends ImageView { class BrushView<D> extends ImageView {
@@ -30,7 +30,7 @@ class BrushView<D> extends ImageView {
selectView.graphics.lineStyle(); selectView.graphics.lineStyle();
} }
private function resolveSrc(value:D):String { private function resolveImage(value:D):BitmapData {
return null; return null;
} }
@@ -40,8 +40,7 @@ class BrushView<D> extends ImageView {
private function set_data(value:D):D { private function set_data(value:D):D {
data = value; data = value;
var src = resolveSrc(value); image = resolveImage(value);
image = Assets.getBitmapData(src);
color = resolveColor(value); color = resolveColor(value);
return data; return data;
} }

View File

@@ -1,7 +1,9 @@
package ru.m.tankz.editor.view.map; package ru.m.tankz.editor.view.map;
import flash.display.BitmapData;
import haxework.color.Color; import haxework.color.Color;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.render.RenderUtil;
import ru.m.tankz.Type.PlayerId; import ru.m.tankz.Type.PlayerId;
class SpawnPointView extends BrushView<SpawnPoint> { class SpawnPointView extends BrushView<SpawnPoint> {
@@ -12,7 +14,7 @@ class SpawnPointView extends BrushView<SpawnPoint> {
return config.getColor(new PlayerId(value.team, value.index)); return config.getColor(new PlayerId(value.team, value.index));
} }
override private function resolveSrc(value:SpawnPoint):String { override private function resolveImage(value:SpawnPoint):BitmapData {
var preset:GamePreset = config.presets[config.presets.length - 1]; var preset:GamePreset = config.presets[config.presets.length - 1];
var tankConfig:TankConfig = null; var tankConfig:TankConfig = null;
if (value.type == 'tank') { if (value.type == 'tank') {
@@ -20,10 +22,10 @@ class SpawnPointView extends BrushView<SpawnPoint> {
var tankType = player.tanks[0]; var tankType = player.tanks[0];
tankConfig = config.getTank(tankType.type); tankConfig = config.getTank(tankType.type);
} }
return switch(value.type) { return switch value.type {
case 'eagle': 'resources/image/eagle/eagle.png'; case "eagle": RenderUtil.eagleImage();
case 'tank': 'resources/image/tank/${tankConfig.skin}-0.png'; case "tank": RenderUtil.tankImage(tankConfig.skin);
case _: 'resources/image/eagle/eagle-death.png'; case _: RenderUtil.eagleImage(true);
} }
} }