[client] LevelFrame

This commit is contained in:
2018-01-26 14:38:36 +03:00
parent d72d7e8c81
commit 6a00ee83d7
50 changed files with 120 additions and 65 deletions

View File

@@ -0,0 +1,21 @@
{
"pWidth": 100, "pHeight": 100,
"views": [
{
"id":"levels", "@type":"haxework.gui.list.VListView<Int>",
"factory": "@class:ru.m.tankz.view.frames.list.LevelView",
"pWidth":100,
"pHeight":100,
"paddings":10,
"scroll":{
"@type":"haxework.gui.list.VScrollView",
"width":10, "pHeight":100,
"skin":{"@type":"haxework.gui.list.VScrollSkin"}
},
"skin": {
"@type": "haxework.gui.skin.ColorSkin",
"color": "0x000000", "alpha": 0.0
}
}
]
}

View File

@@ -15,6 +15,10 @@
"id": "start",
"@type": "ru.m.tankz.view.frames.StartFrame"
},
{
"id": "level",
"@type": "ru.m.tankz.view.frames.LevelFrame"
},
{
"id": "game",
"@type": "ru.m.tankz.view.frames.GameFrame"

View File

@@ -1,13 +1,18 @@
{
"person": {
"level": {
"width": 440, "height": 44,
"margins": 5,
"views": [
{
"id": "nameLabel",
"id": "label",
"@type": "haxework.gui.LabelView",
"pWidth": 100, "height": 44, "text": "Выбор персонажа",
"pWidth": 100, "pHeight": 100, "text": "",
"@style": "label"
}
]
],
"skin": {
"@type": "haxework.gui.skin.ColorSkin",
"color": "0x000000", "alpha": 0.2
}
}
}

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.render;
import flash.display.DisplayObjectContainer;
import ru.m.tankz.core.EntityType;
import flash.display.DisplayObject;
import Type.ValueType;
@@ -68,15 +69,21 @@ class Render extends SpriteView implements EngineListener {
}
}
private function clearLayer(layer:DisplayObjectContainer) {
while (layer.numChildren > 0) layer.removeChildAt(0);
}
public function reset():Void {
items = new Map<String, RenderItem<Dynamic>>();
if (background != null) {
backgroundLayer.removeChild(background);
background = null;
}
clearLayer(entryLayer);
clearLayer(groundLayer);
clearLayer(upLayer);
}
public function onSpawn(entity:EntityType):Void {
switch(entity) {
case EntityType.TANK(tank):

View File

@@ -0,0 +1,35 @@
package ru.m.tankz.view.frames;
import ru.m.tankz.config.ConfigBundle;
import haxework.gui.frame.IFrameSwitcher;
import ru.m.tankz.game.GameState;
import haxework.provider.Provider;
import haxework.gui.list.ListView;
import haxework.gui.ViewBuilder;
import haxework.gui.VGroupView;
interface LevelFrameLayout {
var levels(default, null):ListView<Int>;
}
@:template("layout/frames/level.json", "layout/styles.json")
class LevelFrame extends VGroupView implements ViewBuilder implements LevelFrameLayout implements ListViewListener<Int> {
public static inline var ID = "level";
public function init():Void {
levels.dispatcher.addListener(this);
}
public function onShow():Void {
var state = Provider.get(GameState);
var c = ConfigBundle.get(state.type).levels;
levels.data = [for (i in 0...c) i];
}
public function onListItemClick(item:IListItemView<Int>):Void {
Provider.get(GameState).level = item.data;
Provider.get(IFrameSwitcher).change(GameFrame.ID);
}
}

View File

@@ -30,6 +30,6 @@ class StartFrame extends VGroupView implements ViewBuilder {
private function startGame(humans:Int):Void {
Provider.set(GameState, ClassicGame.buildState(0, humans));
Provider.get(IFrameSwitcher).change(GameFrame.ID);
Provider.get(IFrameSwitcher).change(LevelFrame.ID);
}
}

View File

@@ -1,33 +0,0 @@
package ru.m.tankz.view.frames.list;
import ru.m.tankz.proto.Person;
import ru.m.tankz.proto.Game;
import haxework.gui.list.ListView.IListItemView;
import haxework.gui.LabelView;
import haxework.gui.skin.ColorSkin;
import haxework.gui.HGroupView;
class GameView extends HGroupView implements IListItemView<Game> {
public var item_index(default, default):Int;
public var data(default, set):Game;
private var nameLabel:LabelView;
public function new() {
super();
pWidth = 100;
height = 50;
skin = new ColorSkin(0xffffff);
nameLabel = new LabelView();
addView(nameLabel);
}
private function set_data(value:Game):Game {
this.data = value;
var persons:String = Lambda.map(this.data.persons, function(p:Person) return p.name).join(",");
nameLabel.text = "Game_" + this.data.id + "(" + persons + ")";
return this.data;
}
}

View File

@@ -0,0 +1,24 @@
package ru.m.tankz.view.frames.list;
import haxework.gui.ViewBuilder;
import haxework.gui.HGroupView;
import haxework.gui.LabelView;
import haxework.gui.list.ListView.IListItemView;
interface LevelViewLayout {
var label(default, null):LabelView;
}
@:template("layout/other.json@level", "layout/styles.json")
class LevelView extends HGroupView implements ViewBuilder implements IListItemView<Int> implements LevelViewLayout {
public var item_index(default, default):Int;
public var data(default, set):Int;
private function set_data(value:Int):Int {
data = value;
label.text = 'Level ${data}';
return data;
}
}

View File

@@ -1,19 +0,0 @@
package ru.m.tankz.view.frames.list;
import haxework.gui.ViewBuilder;
import haxework.gui.list.ListView.IListItemView;
import ru.m.tankz.proto.Person;
import haxework.gui.HGroupView;
@:template("layout/other.json@person", "layout/styles.json")
class PersonView extends HGroupView implements ViewBuilder implements IListItemView<Person> {
public var item_index(default, default):Int;
public var data(default, set):Person;
private function set_data(value:Person):Person {
this.data = value;
nameLabel.text = this.data.name;
return this.data;
}
}

View File

@@ -1,3 +1,5 @@
levels: 36
map:
cellWidth: 22
cellHeight: 22

View File

@@ -54,6 +54,7 @@ typedef TeamConfig = {
class Config {
public var type(default, null):String;
public var levels(default, null):Int;
public var map(default, null):MapConfig;
public var bricks(default, null):Array<BrickConfig>;
public var tanks(default, null):Array<TankConfig>;
@@ -63,8 +64,9 @@ class Config {
private var tankMap:Map<String, Map<String, TankConfig>>;
private var teamMap:Map<String, TeamConfig>;
public function new(type:String, map:MapConfig, bricks:Array<BrickConfig>, teams:Array<TeamConfig>, tanks:Array<TankConfig>) {
public function new(type:String, levels:Int, map:MapConfig, bricks:Array<BrickConfig>, teams:Array<TeamConfig>, tanks:Array<TankConfig>) {
this.type = type;
this.levels = levels;
this.map = map;
this.bricks = bricks;
this.teams = teams;

View File

@@ -8,6 +8,7 @@ import ru.m.tankz.config.Config;
typedef ConfigSource = {
var levels:Int;
var map: MapConfig;
var bricks: Array<BrickConfig>;
var teams: Array<TeamConfig>;
@@ -23,7 +24,7 @@ class ConfigBundle {
public static function get(type:String):Config {
switch (type) {
case ClassicGame.TYPE:
var source:ConfigSource = convert(Yaml.parse(Assets.getText('resources/config/${type}.yaml'), Parser.options().useObjects()));
var source:ConfigSource = convert(Yaml.parse(Assets.getText('resources/${type}/config.yaml'), Parser.options().useObjects()));
var tanks:Array<TankConfig> = [];
for (group in Reflect.fields(source.tanks)) {
var data:Array<TankConfig> = Reflect.field(source.tanks, group);
@@ -32,7 +33,7 @@ class ConfigBundle {
tanks.push(item);
}
}
return new Config(type, source.map, source.bricks, source.teams, tanks);
return new Config(type, source.levels, source.map, source.bricks, source.teams, tanks);
case _:
return null;
}

View File

@@ -5,10 +5,16 @@ import ru.m.tankz.game.Game;
import ru.m.tankz.config.Config;
class MapBundle {
class LevelBundle {
private static function formatLevel(level:Int):String {
var result = Std.string(level);
while (result.length < 3) result = '0${result}';
return result;
}
public static function get(type:GameType, config:Config, level:Int):Array<BrickConfig> {
var bricksData:String = Assets.getText('resources/levels/level00${level}.txt');
var bricksData:String = Assets.getText('resources/${type}/levels/level${formatLevel(level)}.txt');
var bricks:Array<BrickConfig> = [];
for (line in ~/\s+/g.split(bricksData)) {
for (c in line.split('')) {

View File

@@ -3,7 +3,7 @@ package ru.m.tankz.game;
import ru.m.tankz.bot.BotControl;
import ru.m.tankz.control.HumanControl;
import ru.m.tankz.config.ConfigBundle;
import ru.m.tankz.config.MapBundle;
import ru.m.tankz.config.LevelBundle;
import ru.m.tankz.game.Spawner;
import ru.m.tankz.core.Entity;
import ru.m.tankz.core.Eagle;
@@ -60,7 +60,7 @@ class Game implements EngineListener {
public function start(state:GameState):Void {
this.state = state;
var bricks = MapBundle.get(type, config, state.level);
var bricks = LevelBundle.get(type, config, state.level);
engine.map.setData(bricks);
teams = new Map<TeamId, Team>();
spawners = new Map<TeamId, Spawner>();