[editor] refactor MapEditView

This commit is contained in:
2019-05-20 13:00:04 +03:00
parent 09b188cf24
commit bbe2aeb7fb
11 changed files with 197 additions and 255 deletions

View File

@@ -1,10 +1,11 @@
package ru.m.tankz.render;
import haxework.view.IView;
import ru.m.tankz.config.Config;
import ru.m.tankz.game.IGame;
interface IRender extends IView<Dynamic> {
public var game(default, set):IGame;
interface IRender extends IView<Dynamic> extends GameListener {
public var config(default, set):Config;
public function draw():Void;
public function reset():Void;
}

View File

@@ -14,17 +14,17 @@ import ru.m.geom.Point;
import ru.m.tankz.config.Config;
import ru.m.tankz.core.EntityType;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.IGame;
import ru.m.tankz.render.item.BonusRenderItem;
import ru.m.tankz.render.item.BrickRenderItem;
import ru.m.tankz.render.item.BulletRenderItem;
import ru.m.tankz.render.item.EagleRenderItem;
import ru.m.tankz.render.item.IRenderItem;
import ru.m.tankz.render.item.TankRenderItem;
import ru.m.tankz.Type;
class Render extends SpriteView implements IRender implements GameListener {
class Render extends SpriteView implements IRender {
public var game(default, set):IGame;
public var config(default, set):Config;
private var backgroundLayer:Sprite;
private var groundLayer:Sprite;
@@ -32,7 +32,6 @@ class Render extends SpriteView implements IRender implements GameListener {
private var upLayer:Sprite;
private var upperLayer:Sprite;
private var background:Sprite;
private var items:Map<Int, IRenderItem>;
public function new() {
@@ -51,13 +50,11 @@ class Render extends SpriteView implements IRender implements GameListener {
reset();
}
private function set_game(value:IGame):IGame {
game = value;
game.connect(this);
return game;
private function set_config(value:Config):Config {
return config = value;
}
private function drawBackground(config:Config):Void {
private function drawBackground():Void {
var width = config.map.cellWidth * config.map.gridWidth;
var height = config.map.cellHeight * config.map.gridHeight;
var g:Graphics = backgroundLayer.graphics;
@@ -72,9 +69,6 @@ class Render extends SpriteView implements IRender implements GameListener {
for (item in items) {
item.update();
}
if (background == null) {
drawBackground(game.config);
}
}
private function onEnterFrame(event:Event):Void {
@@ -91,10 +85,6 @@ class Render extends SpriteView implements IRender implements GameListener {
item.dispose();
}
items = new Map();
if (background != null) {
backgroundLayer.removeChild(background);
background = null;
}
clearLayer(entryLayer);
clearLayer(groundLayer);
clearLayer(upLayer);
@@ -108,9 +98,10 @@ class Render extends SpriteView implements IRender implements GameListener {
case COMPLETE(_, _):
content.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
case SPAWN(BRICK(bricks)):
drawBackground();
for (brick in bricks) {
var item:IRenderItem = new BrickRenderItem(brick.rect, brick.type);
var config = game.config.getBrick(brick.type);
var config = config.getBrick(brick.type);
items[brick.id] = item;
if (config.layer > 2) {
upLayer.addChild(item.view);
@@ -119,15 +110,15 @@ class Render extends SpriteView implements IRender implements GameListener {
}
}
case SPAWN(EAGLE(id, rect, teamId)):
var item = new EagleRenderItem(rect);
var item = new EagleRenderItem(rect, config.getColor(new PlayerId(teamId, -1)));
items.set(id, item);
entryLayer.addChild(item.view);
item.update();
case SPAWN(TANK(id, rect, playerId, info)):
var item = new TankRenderItem(rect);
var config = game.config.getTank(info.type);
item.color = game.config.getColor(playerId);
item.skin = config.skin;
var tankConfig = config.getTank(info.type);
item.color = config.getColor(playerId);
item.skin = tankConfig.skin;
item.hits = info.hits;
item.bonus = info.bonus;
items.set(id, item);
@@ -144,6 +135,11 @@ class Render extends SpriteView implements IRender implements GameListener {
items.set(id, item);
upperLayer.addChild(item.view);
item.update();
case MOVE(EAGLE(id, position)):
if (items.exists(id)) {
var item = items[id];
item.move(position);
}
case MOVE(BULLET(id, position)):
if (items.exists(id)) {
var item = items[id];
@@ -163,7 +159,7 @@ class Render extends SpriteView implements IRender implements GameListener {
case CHANGE(TANK(id, type, hits, bonus)):
if (items.exists(id)) {
var item:TankRenderItem = cast items[id];
item.skin = game.config.getTank(type).skin;
item.skin = config.getTank(type).skin;
item.hits = hits;
item.bonus = bonus;
}
@@ -177,6 +173,11 @@ class Render extends SpriteView implements IRender implements GameListener {
var item:EagleRenderItem = cast items[id];
item.protect = state;
}
case CHANGE(BRICK(id, type)):
if (items.exists(id)) {
var item:BrickRenderItem = cast items[id];
item.type = type;
}
case DESTROY(TANK(id, shot)):
if (items.exists(id)) {
var item = items[id];

View File

@@ -26,14 +26,13 @@ class BrickRenderItem extends RenderItem {
public function new(rect:Rectangle, type:BrickType) {
super(rect);
this.shape = new Shape();
this.type = type;
cells = [
new Point(0, 0),
new Point(0, 1),
new Point(1, 0),
new Point(1, 1),
];
redraw();
this.type = type;
move(rect.position);
}
@@ -53,6 +52,7 @@ class BrickRenderItem extends RenderItem {
if (type != value) {
type = value;
image = Assets.getBitmapData('resources/image/map/${type}.png');
redraw();
}
return type;
}
@@ -69,6 +69,7 @@ class BrickRenderItem extends RenderItem {
public function redraw():Void {
shape.graphics.clear();
if (type == "none") return;
switch state {
case UNBROKEN:
shape.graphics.beginBitmapFill(image);

View File

@@ -2,18 +2,22 @@ package ru.m.tankz.render.item;
import flash.display.DisplayObject;
import flash.display.Sprite;
import haxework.color.Color;
import haxework.view.utils.BitmapUtil;
import ru.m.animate.Animate;
import ru.m.geom.Rectangle;
class EagleRenderItem extends BitmapRenderItem {
public var color(default, default):Color;
public var death(default, set):Bool = true;
public var protect(default, set):Bool;
private var container:Sprite;
private var protectView:Animate;
public function new(rect:Rectangle) {
public function new(rect:Rectangle, color:Color) {
super(rect);
this.color = color;
container = new Sprite();
container.addChild(bitmap);
protectView = AnimateBundle.tankProtect();
@@ -45,6 +49,9 @@ class EagleRenderItem extends BitmapRenderItem {
death = value;
var suffix = death ? '-death' : '';
image = 'resources/image/eagle/eagle${suffix}.png';
if (!color.zero) {
bitmap.bitmapData = bitmapData = BitmapUtil.colorize(bitmapData, color);
}
}
return death;
}

View File

@@ -50,7 +50,8 @@ import ru.m.tankz.view.game.GameView;
private function start(state:GameState):Void {
gameView.type = state.type;
game = new Game(state);
gameView.render.game = game;
gameView.render.config = game.config;
game.connect(gameView.render);
game.connect(soundManager);
game.connect(this);
if (gameView.panel != null) {
@@ -67,7 +68,8 @@ import ru.m.tankz.view.game.GameView;
private function play(record:GameRecord):Void {
gameView.type = record.info.type;
game = new Game(record.state);
gameView.render.game = game;
gameView.render.config = game.config;
game.connect(gameView.render);
game.connect(soundManager);
//game.connect(this);
if (gameView.panel != null) {