[render] bricks and cells from GameEvent

This commit is contained in:
2019-05-17 12:55:32 +03:00
parent 3c116db135
commit 96e608c36f
5 changed files with 106 additions and 41 deletions

View File

@@ -11,8 +11,8 @@ import promhx.Promise;
import ru.m.animate.Animate;
import ru.m.animate.OnceAnimate;
import ru.m.geom.Point;
import ru.m.tankz.config.Config;
import ru.m.tankz.core.EntityType;
import ru.m.tankz.engine.IEngine;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.IGame;
import ru.m.tankz.render.item.BonusRenderItem;
@@ -57,13 +57,15 @@ class Render extends SpriteView implements IRender implements GameListener {
return game;
}
private function drawBackground(engine:IEngine):Void {
private function drawBackground(config:Config):Void {
var width = config.map.cellWidth * config.map.gridWidth;
var height = config.map.cellHeight * config.map.gridHeight;
var g:Graphics = backgroundLayer.graphics;
g.clear();
g.beginFill(0x000000);
g.drawRect(0, 0, engine.map.width, engine.map.height);
g.drawRect(0, 0, width, height);
g.endFill();
setContentSize(engine.map.width, engine.map.height);
setContentSize(width, height);
}
public function draw():Void {
@@ -71,7 +73,7 @@ class Render extends SpriteView implements IRender implements GameListener {
item.update();
}
if (background == null) {
drawBackground(game.engine);
drawBackground(game.config);
}
}
@@ -102,18 +104,20 @@ class Render extends SpriteView implements IRender implements GameListener {
public function onGameEvent(event:GameEvent):Void {
switch event {
case START(_):
for (brick in game.engine.map.bricks) {
var item:IRenderItem = new BrickRenderItem(brick);
content.addEventListener(Event.ENTER_FRAME, onEnterFrame);
case COMPLETE(_, _):
content.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
case SPAWN(BRICK(bricks)):
for (brick in bricks) {
var item:IRenderItem = new BrickRenderItem(brick.rect, brick.type);
var config = game.config.getBrick(brick.type);
items[brick.id] = item;
if (brick.config.layer > 2) {
if (config.layer > 2) {
upLayer.addChild(item.view);
} else {
groundLayer.addChild(item.view);
}
}
content.addEventListener(Event.ENTER_FRAME, onEnterFrame);
case COMPLETE(_, _):
content.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
case SPAWN(EAGLE(id, rect, teamId)):
var item = new EagleRenderItem(rect);
items.set(id, item);
@@ -201,11 +205,12 @@ class Render extends SpriteView implements IRender implements GameListener {
}
items.remove(id);
}
case DESTROY(CELL(cellX, cellY, shot)):
// ToDo: redraw only cell?
var brick = game.engine.map.getBrick(new Point(cellX, cellY));
var item:BrickRenderItem = cast items[brick.id];
item.redraw(brick);
case DESTROY(CELL(id, x, y, shot)):
var item:BrickRenderItem = cast items.get(id);
item.destroyCell(x, y);
case DESTROY(BRICK(id, shot)):
var item:BrickRenderItem = cast items.get(id);
item.destroy();
case _:
}
}

View File

@@ -1,27 +1,50 @@
package ru.m.tankz.render.item;
import ru.m.geom.Point;
import flash.display.BitmapData;
import flash.display.Shape;
import openfl.Assets;
import openfl.display.DisplayObject;
import ru.m.tankz.map.Brick;
import ru.m.geom.Rectangle;
import ru.m.tankz.Type.BrickType;
enum BrickState {
UNBROKEN;
BROKEN;
DESTROYED;
}
class BrickRenderItem extends RenderItem {
public var type(default, set):BrickType;
public var state(get, never):BrickState;
private var image:BitmapData;
private var shape:Shape;
private var cells:Array<Point>;
public function new(brick:Brick) {
super(brick.rect);
public function new(rect:Rectangle, type:BrickType) {
super(rect);
this.shape = new Shape();
this.type = brick.config.type;
redraw(brick);
this.type = type;
cells = [
new Point(0, 0),
new Point(0, 1),
new Point(1, 0),
new Point(1, 1),
];
redraw();
move(rect.position);
}
private function get_state():BrickState {
return switch cells.length {
case 0: DESTROYED;
case 4: UNBROKEN;
case _: BROKEN;
}
}
override private function get_view():DisplayObject {
return shape;
}
@@ -34,21 +57,34 @@ class BrickRenderItem extends RenderItem {
return type;
}
public function redraw(brick:Brick):Void {
public function destroyCell(x:Int, y:Int):Void {
cells = cells.filter(function(point) return !(point.x == x && point.y == y));
redraw();
}
public function destroy():Void {
cells = [];
redraw();
}
public function redraw():Void {
shape.graphics.clear();
if (brick.destroyed) return;
if (brick.config.index > 0) {
shape.graphics.beginBitmapFill(image);
if (brick.broken == 0) {
shape.graphics.drawRect(0, 0, brick.rect.width, brick.rect.height);
} else {
for (c in brick.cells) {
if (!c.destroyed) {
shape.graphics.drawRect(c.rect.x - brick.rect.x, c.rect.y - brick.rect.y, c.rect.width, c.rect.height);
}
switch state {
case UNBROKEN:
shape.graphics.beginBitmapFill(image);
shape.graphics.drawRect(0, 0, rect.width, rect.height);
shape.graphics.endFill();
case BROKEN:
shape.graphics.beginBitmapFill(image);
for (point in cells) {
var x = point.x * (rect.width / 2);
var y = point.y * (rect.width / 2);
var width = rect.width / 2;
var height = rect.height / 2;
shape.graphics.drawRect(x, y, width, height);
}
}
shape.graphics.endFill();
shape.graphics.endFill();
case DESTROYED:
}
}
}