175 lines
6.0 KiB
Haxe
Executable File
175 lines
6.0 KiB
Haxe
Executable File
package ru.m.tankz.render;
|
|
|
|
import flash.display.DisplayObjectContainer;
|
|
import flash.display.Graphics;
|
|
import flash.display.Sprite;
|
|
import haxework.gui.SpriteView;
|
|
import ru.m.animate.Animate;
|
|
import ru.m.animate.OnceAnimate;
|
|
import ru.m.geom.Point;
|
|
import ru.m.tankz.core.EntityType;
|
|
import ru.m.tankz.engine.Engine;
|
|
import ru.m.tankz.render.RenderItem;
|
|
|
|
|
|
class Render extends SpriteView implements EngineListener {
|
|
|
|
private var backgroundLayer:Sprite;
|
|
private var groundLayer:Sprite;
|
|
private var entryLayer:Sprite;
|
|
private var upLayer:Sprite;
|
|
private var upperLayer:Sprite;
|
|
|
|
private var background:Sprite;
|
|
private var items:Map<String, RenderItem<Dynamic, Dynamic>>;
|
|
|
|
public function new() {
|
|
super();
|
|
items = new Map();
|
|
backgroundLayer = new Sprite();
|
|
groundLayer = new Sprite();
|
|
entryLayer = new Sprite();
|
|
upLayer = new Sprite();
|
|
upperLayer = new Sprite();
|
|
contentAsSprite.addChild(backgroundLayer);
|
|
contentAsSprite.addChild(groundLayer);
|
|
contentAsSprite.addChild(entryLayer);
|
|
contentAsSprite.addChild(upLayer);
|
|
contentAsSprite.addChild(upperLayer);
|
|
reset();
|
|
}
|
|
|
|
private function drawBackground(game:Engine):Void {
|
|
var mapWidth = game.map.gridWidth * game.map.cellWidth;
|
|
var mapHeight = game.map.gridHeight * game.map.cellHeight;
|
|
var g:Graphics = backgroundLayer.graphics;
|
|
g.clear();
|
|
g.beginFill(0x000000);
|
|
g.drawRect(0, 0, mapWidth, mapHeight);
|
|
g.endFill();
|
|
if (contentSize) {
|
|
width = mapWidth;
|
|
height = mapHeight;
|
|
}
|
|
}
|
|
|
|
public function draw(game:Engine):Void {
|
|
for (brick in game.map.bricks) if (brick.config.index > 0) {
|
|
if (!items.exists(brick.key)) {
|
|
var item:RenderItem<Dynamic, Dynamic> = switch(brick.config.type) {
|
|
case 'ace' | 'bush': new BrickItem(brick);
|
|
case 'water': new BrickAnimateItem(brick);
|
|
case 'armor' | 'brick': new BrickBreakingItem(brick);
|
|
case x: null;
|
|
};
|
|
if (item != null) {
|
|
items[brick.key] = item;
|
|
if (brick.config.layer > 2) {
|
|
upLayer.addChild(item.view);
|
|
} else {
|
|
groundLayer.addChild(item.view);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (item in items) {
|
|
item.update();
|
|
}
|
|
if (background == null) {
|
|
drawBackground(game);
|
|
}
|
|
}
|
|
|
|
private function clearLayer(layer:DisplayObjectContainer) {
|
|
while (layer.numChildren > 0) layer.removeChildAt(0);
|
|
}
|
|
|
|
public function reset():Void {
|
|
for (item in items.iterator()) {
|
|
item.dispose();
|
|
}
|
|
items = new Map();
|
|
if (background != null) {
|
|
backgroundLayer.removeChild(background);
|
|
background = null;
|
|
}
|
|
clearLayer(entryLayer);
|
|
clearLayer(groundLayer);
|
|
clearLayer(upLayer);
|
|
clearLayer(upperLayer);
|
|
}
|
|
|
|
public function onSpawn(entity:EntityType):Void {
|
|
switch(entity) {
|
|
case EntityType.TANK(tank):
|
|
var item = new TankItem(tank);
|
|
items.set(tank.key, item);
|
|
entryLayer.addChild(item.view);
|
|
item.update();
|
|
playAnimate(tank.rect.center, AnimateBundle.tankSpawn());
|
|
case EntityType.BULLET(bullet):
|
|
var item = new BulletItem(bullet);
|
|
items.set(bullet.key, item);
|
|
entryLayer.addChild(item.view);
|
|
item.update();
|
|
case EntityType.EAGLE(eagle):
|
|
var item = new EagleItem(eagle);
|
|
items.set(eagle.key, item);
|
|
entryLayer.addChild(item.view);
|
|
item.update();
|
|
case EntityType.BONUS(bonus):
|
|
var item = new BonusItem(bonus);
|
|
items.set(bonus.key, item);
|
|
upperLayer.addChild(item.view);
|
|
item.update();
|
|
case _:
|
|
}
|
|
}
|
|
|
|
public function onChange(entity:EntityType, ?change:EntityChange):Void {}
|
|
|
|
public function onCollision(entity:EntityType, with:EntityType):Void {
|
|
switch [entity, with] {
|
|
case [EntityType.BULLET(_), EntityType.EAGLE(eagle)]:
|
|
if (eagle.death) {
|
|
playAnimate(eagle.rect.center, AnimateBundle.tankBoom());
|
|
}
|
|
case _:
|
|
}
|
|
}
|
|
|
|
public function onDestroy(entity:EntityType):Void {
|
|
switch entity {
|
|
case EntityType.TANK(tank):
|
|
if (items.exists(tank.key)) {
|
|
entryLayer.removeChild(items.get(tank.key).view);
|
|
items.remove(tank.key);
|
|
playAnimate(tank.rect.center, AnimateBundle.tankBoom());
|
|
}
|
|
case EntityType.BULLET(bullet):
|
|
if (items.exists(bullet.key)) {
|
|
entryLayer.removeChild(items.get(bullet.key).view);
|
|
items.remove(bullet.key);
|
|
var point = bullet.rect.center.add(new Point(bullet.rect.width * bullet.rect.direction.x, bullet.rect.height * bullet.rect.direction.y));
|
|
playAnimate(point, AnimateBundle.bulletBoom());
|
|
}
|
|
case EntityType.BONUS(bonus):
|
|
if (items.exists(bonus.key)) {
|
|
upperLayer.removeChild(items.get(bonus.key).view);
|
|
items.remove(bonus.key);
|
|
}
|
|
case _:
|
|
}
|
|
}
|
|
|
|
private function playAnimate(point:Point, animate:OnceAnimate):Void {
|
|
animate.x = point.x - animate.width / 2;
|
|
animate.y = point.y - animate.height / 2;
|
|
upperLayer.addChild(animate);
|
|
animate.play().then(function(animate:Animate):Void {
|
|
upperLayer.removeChild(animate);
|
|
animate.dispose();
|
|
});
|
|
}
|
|
}
|