[client] update render
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
package ru.m.tankz.render;
|
||||
|
||||
import haxework.view.IView;
|
||||
import ru.m.tankz.engine.IEngine;
|
||||
import ru.m.tankz.game.IGame;
|
||||
|
||||
interface IRender extends IView<Dynamic> extends GameListener extends EngineListener {
|
||||
public function draw(game:IEngine):Void;
|
||||
interface IRender extends IView<Dynamic> {
|
||||
public var game(default, set):IGame;
|
||||
public function draw():Void;
|
||||
public function reset():Void;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package ru.m.tankz.render;
|
||||
|
||||
import ru.m.geom.Rectangle;
|
||||
import flash.display.DisplayObjectContainer;
|
||||
import flash.display.Graphics;
|
||||
import flash.display.Sprite;
|
||||
import flash.events.Event;
|
||||
import haxe.Timer;
|
||||
import haxework.view.LabelView;
|
||||
import haxework.view.SpriteView;
|
||||
@@ -14,9 +14,17 @@ import ru.m.geom.Point;
|
||||
import ru.m.tankz.core.EntityType;
|
||||
import ru.m.tankz.engine.IEngine;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.render.RenderItem;
|
||||
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;
|
||||
|
||||
class Render extends SpriteView implements IRender {
|
||||
class Render extends SpriteView implements IRender implements GameListener {
|
||||
|
||||
public var game(default, set):IGame;
|
||||
|
||||
private var backgroundLayer:Sprite;
|
||||
private var groundLayer:Sprite;
|
||||
@@ -25,7 +33,7 @@ class Render extends SpriteView implements IRender {
|
||||
private var upperLayer:Sprite;
|
||||
|
||||
private var background:Sprite;
|
||||
private var items:Map<Int, RenderItem<Dynamic, Dynamic>>;
|
||||
private var items:Map<Int, IRenderItem>;
|
||||
|
||||
public function new() {
|
||||
super();
|
||||
@@ -43,6 +51,13 @@ class Render extends SpriteView implements IRender {
|
||||
reset();
|
||||
}
|
||||
|
||||
private function set_game(value:IGame):IGame {
|
||||
game = value;
|
||||
game.connect(this);
|
||||
game.engine.spawnSignal.connect(onSpawn);
|
||||
return game;
|
||||
}
|
||||
|
||||
private function drawBackground(engine:IEngine):Void {
|
||||
var g:Graphics = backgroundLayer.graphics;
|
||||
g.clear();
|
||||
@@ -52,38 +67,25 @@ class Render extends SpriteView implements IRender {
|
||||
setContentSize(engine.map.width, engine.map.height);
|
||||
}
|
||||
|
||||
public function draw(game:IEngine):Void {
|
||||
for (brick in game.map.bricks) if (brick.config.index > 0) {
|
||||
if (!items.exists(brick.id)) {
|
||||
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.id] = item;
|
||||
if (brick.config.layer > 2) {
|
||||
upLayer.addChild(item.view);
|
||||
} else {
|
||||
groundLayer.addChild(item.view);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public function draw():Void {
|
||||
for (item in items) {
|
||||
item.update();
|
||||
}
|
||||
if (background == null) {
|
||||
drawBackground(game);
|
||||
drawBackground(game.engine);
|
||||
}
|
||||
}
|
||||
|
||||
private function onEnterFrame(event:Event):Void {
|
||||
draw();
|
||||
}
|
||||
|
||||
private function clearLayer(layer:DisplayObjectContainer) {
|
||||
while (layer.numChildren > 0) layer.removeChildAt(0);
|
||||
}
|
||||
|
||||
public function reset():Void {
|
||||
content.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
|
||||
for (item in items.iterator()) {
|
||||
item.dispose();
|
||||
}
|
||||
@@ -101,23 +103,23 @@ class Render extends SpriteView implements IRender {
|
||||
public function onSpawn(entity:EntityType):Void {
|
||||
switch entity {
|
||||
case EAGLE(eagle):
|
||||
var item = new EagleItem(eagle);
|
||||
var item = new EagleRenderItem(eagle);
|
||||
items.set(eagle.id, item);
|
||||
entryLayer.addChild(item.view);
|
||||
item.update();
|
||||
case TANK(tank):
|
||||
var item = new TankItem(tank);
|
||||
var item = new TankRenderItem(tank);
|
||||
items.set(tank.id, item);
|
||||
entryLayer.addChild(item.view);
|
||||
item.update();
|
||||
playAnimate(tank.rect.center, AnimateBundle.tankSpawn());
|
||||
playAnimate(item.rect.center, AnimateBundle.tankSpawn());
|
||||
case BULLET(bullet):
|
||||
var item = new BulletItem(bullet);
|
||||
var item = new BulletRenderItem(bullet);
|
||||
items.set(bullet.id, item);
|
||||
entryLayer.addChild(item.view);
|
||||
item.update();
|
||||
case BONUS(bonus):
|
||||
var item = new BonusItem(bonus);
|
||||
var item = new BonusRenderItem(bonus);
|
||||
items.set(bonus.id, item);
|
||||
upperLayer.addChild(item.view);
|
||||
item.update();
|
||||
@@ -125,25 +127,51 @@ class Render extends SpriteView implements IRender {
|
||||
}
|
||||
}
|
||||
|
||||
public function onCollision(entity:EntityType, with:EntityType):Void {
|
||||
}
|
||||
|
||||
public function onMove(entity:EntityType):Void {
|
||||
}
|
||||
|
||||
public function onDestroy(entity:EntityType):Void {
|
||||
}
|
||||
|
||||
public function onGameEvent(event:GameEvent):Void {
|
||||
switch event {
|
||||
case START(_):
|
||||
for (brick in game.engine.map.bricks) {
|
||||
var item:IRenderItem = new BrickRenderItem(brick);
|
||||
items[brick.id] = item;
|
||||
if (brick.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 MOVE(BULLET(id, position)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
item.move(position);
|
||||
}
|
||||
case MOVE(TANK(id, position)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
item.move(position);
|
||||
cast(item, TankRenderItem).moves = true;
|
||||
}
|
||||
case STOP(TANK(id)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
cast(item, TankRenderItem).moves = false;
|
||||
}
|
||||
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.hits = hits;
|
||||
item.bonus = bonus;
|
||||
}
|
||||
case DESTROY(TANK(id, shot)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
entryLayer.removeChild(item.view);
|
||||
var rect:Rectangle = item.value.rect;
|
||||
playAnimate(rect.center, AnimateBundle.tankBoom());
|
||||
playAnimate(item.rect.center, AnimateBundle.tankBoom());
|
||||
if (shot.score != 0) {
|
||||
showScore(rect.center, shot.score);
|
||||
showScore(item.rect.center, shot.score);
|
||||
}
|
||||
items.remove(id);
|
||||
}
|
||||
@@ -151,38 +179,35 @@ class Render extends SpriteView implements IRender {
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
entryLayer.removeChild(item.view);
|
||||
var rect:Rectangle = item.value.rect;
|
||||
var rect = item.rect;
|
||||
// move boom
|
||||
var point = rect.center.add(new Point(rect.width * rect.direction.x, rect.height * rect.direction.y));
|
||||
playAnimate(point, AnimateBundle.bulletBoom());
|
||||
items.remove(id);
|
||||
}
|
||||
case DESTROY(BONUS(id, shot)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
upperLayer.removeChild(item.view);
|
||||
var rect:Rectangle = item.value.rect;
|
||||
if (shot.score != 0) {
|
||||
showScore(rect.center, shot.score);
|
||||
}
|
||||
items.remove(id);
|
||||
}
|
||||
case DESTROY(EAGLE(id, shot)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
var rect:Rectangle = item.value.rect;
|
||||
playAnimate(rect.center, AnimateBundle.tankBoom());
|
||||
playAnimate(item.rect.center, AnimateBundle.tankBoom());
|
||||
if (shot.score != 0) {
|
||||
showScore(rect.center, shot.score);
|
||||
showScore(item.rect.center, shot.score);
|
||||
}
|
||||
cast(item, EagleRenderItem).death = true;
|
||||
}
|
||||
case MOVE(TANK(id, position)) | MOVE(BULLET(id, position)):
|
||||
case DESTROY(BONUS(id, shot)):
|
||||
if (items.exists(id)) {
|
||||
var item = items[id];
|
||||
item.value.rect.x = position.x;
|
||||
item.value.rect.y = position.y;
|
||||
item.value.rect.direction = position.direction;
|
||||
item.update();
|
||||
upperLayer.removeChild(item.view);
|
||||
if (shot.score != 0) {
|
||||
showScore(item.rect.center, shot.score);
|
||||
}
|
||||
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 _:
|
||||
}
|
||||
}
|
||||
|
||||
34
src/client/haxe/ru/m/tankz/render/item/BitmapRenderItem.hx
Normal file
34
src/client/haxe/ru/m/tankz/render/item/BitmapRenderItem.hx
Normal file
@@ -0,0 +1,34 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import flash.display.Bitmap;
|
||||
import flash.display.BitmapData;
|
||||
import flash.display.DisplayObject;
|
||||
import flash.display.PixelSnapping;
|
||||
import openfl.Assets;
|
||||
import ru.m.geom.Rectangle;
|
||||
|
||||
class BitmapRenderItem extends RenderItem {
|
||||
public var image(default, set):String;
|
||||
|
||||
private var bitmapData:BitmapData;
|
||||
private var bitmap:Bitmap;
|
||||
|
||||
public function new(rect:Rectangle) {
|
||||
super(rect);
|
||||
this.bitmap = new Bitmap(null, PixelSnapping.AUTO, true);
|
||||
move(rect.position);
|
||||
}
|
||||
|
||||
override private function get_view():DisplayObject {
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
private function set_image(value:String):String {
|
||||
if (image != value) {
|
||||
image = value;
|
||||
bitmapData = Assets.getBitmapData(image);
|
||||
bitmap.bitmapData = bitmapData;
|
||||
}
|
||||
return image;
|
||||
}
|
||||
}
|
||||
22
src/client/haxe/ru/m/tankz/render/item/BonusRenderItem.hx
Normal file
22
src/client/haxe/ru/m/tankz/render/item/BonusRenderItem.hx
Normal file
@@ -0,0 +1,22 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import ru.m.tankz.core.Bonus;
|
||||
import ru.m.tankz.Type.BonusType;
|
||||
|
||||
class BonusRenderItem extends BitmapRenderItem {
|
||||
|
||||
public var type(default, set):BonusType;
|
||||
|
||||
public function new(bonus:Bonus) {
|
||||
super(bonus.rect);
|
||||
type = bonus.config.type;
|
||||
}
|
||||
|
||||
private function set_type(value:BonusType):BonusType {
|
||||
if (type != value) {
|
||||
type = value;
|
||||
image = 'resources/image/bonus/${type}.png';
|
||||
}
|
||||
return type;
|
||||
}
|
||||
}
|
||||
54
src/client/haxe/ru/m/tankz/render/item/BrickRenderItem.hx
Normal file
54
src/client/haxe/ru/m/tankz/render/item/BrickRenderItem.hx
Normal file
@@ -0,0 +1,54 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
import flash.display.Shape;
|
||||
import openfl.Assets;
|
||||
import openfl.display.DisplayObject;
|
||||
import ru.m.tankz.map.Brick;
|
||||
import ru.m.tankz.Type.BrickType;
|
||||
|
||||
class BrickRenderItem extends RenderItem {
|
||||
|
||||
public var type(default, set):BrickType;
|
||||
|
||||
private var image:BitmapData;
|
||||
private var shape:Shape;
|
||||
|
||||
public function new(brick:Brick) {
|
||||
super(brick.rect);
|
||||
this.shape = new Shape();
|
||||
this.type = brick.config.type;
|
||||
redraw(brick);
|
||||
move(rect.position);
|
||||
}
|
||||
|
||||
override private function get_view():DisplayObject {
|
||||
return shape;
|
||||
}
|
||||
|
||||
private function set_type(value:BrickType):BrickType {
|
||||
if (type != value) {
|
||||
type = value;
|
||||
image = Assets.getBitmapData('resources/image/map/${type}.png');
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
public function redraw(brick:Brick):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);
|
||||
}
|
||||
}
|
||||
}
|
||||
shape.graphics.endFill();
|
||||
}
|
||||
}
|
||||
}
|
||||
21
src/client/haxe/ru/m/tankz/render/item/BulletRenderItem.hx
Normal file
21
src/client/haxe/ru/m/tankz/render/item/BulletRenderItem.hx
Normal file
@@ -0,0 +1,21 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import ru.m.tankz.core.Bullet;
|
||||
|
||||
class BulletRenderItem extends BitmapRenderItem {
|
||||
public var piercing(default, set):Int = -1;
|
||||
|
||||
public function new(bullet:Bullet) {
|
||||
super(bullet.rect);
|
||||
piercing = bullet.config.piercing;
|
||||
}
|
||||
|
||||
private function set_piercing(value:Int):Int {
|
||||
if (piercing != value) {
|
||||
piercing = value;
|
||||
var type = piercing > 0 ? 'piercing' : 'normal';
|
||||
image = 'resources/image/bullet/${type}.png';
|
||||
}
|
||||
return piercing;
|
||||
}
|
||||
}
|
||||
21
src/client/haxe/ru/m/tankz/render/item/EagleRenderItem.hx
Normal file
21
src/client/haxe/ru/m/tankz/render/item/EagleRenderItem.hx
Normal file
@@ -0,0 +1,21 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import ru.m.tankz.core.Eagle;
|
||||
|
||||
class EagleRenderItem extends BitmapRenderItem {
|
||||
public var death(default, set):Bool = true;
|
||||
|
||||
public function new(eagle:Eagle) {
|
||||
super(eagle.rect);
|
||||
death = false;
|
||||
}
|
||||
|
||||
private function set_death(value:Bool):Bool {
|
||||
if (death != value) {
|
||||
death = value;
|
||||
var suffix = death ? '-death' : '';
|
||||
image = 'resources/image/eagle/eagle${suffix}.png';
|
||||
}
|
||||
return death;
|
||||
}
|
||||
}
|
||||
13
src/client/haxe/ru/m/tankz/render/item/IRenderItem.hx
Normal file
13
src/client/haxe/ru/m/tankz/render/item/IRenderItem.hx
Normal file
@@ -0,0 +1,13 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import flash.display.DisplayObject;
|
||||
import ru.m.geom.Position;
|
||||
import ru.m.geom.Rectangle;
|
||||
|
||||
interface IRenderItem {
|
||||
public var view(get, null):DisplayObject;
|
||||
public var rect(default, null):Rectangle;
|
||||
public function move(position:Position):Void;
|
||||
public function update():Void;
|
||||
public function dispose():Void;
|
||||
}
|
||||
35
src/client/haxe/ru/m/tankz/render/item/RenderItem.hx
Normal file
35
src/client/haxe/ru/m/tankz/render/item/RenderItem.hx
Normal file
@@ -0,0 +1,35 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import flash.display.DisplayObject;
|
||||
import ru.m.geom.Position;
|
||||
import ru.m.geom.Rectangle;
|
||||
|
||||
class RenderItem implements IRenderItem {
|
||||
|
||||
public var view(get, null):DisplayObject;
|
||||
|
||||
public var rect(default, null):Rectangle;
|
||||
|
||||
public function new(rect:Rectangle) {
|
||||
this.rect = rect.clone();
|
||||
}
|
||||
|
||||
private function get_view():DisplayObject {
|
||||
throw "Not Implemented";
|
||||
}
|
||||
|
||||
public function move(position:Position):Void {
|
||||
view.x = rect.x = position.x;
|
||||
view.y = rect.y = position.y;
|
||||
if (position.direction != null) {
|
||||
rect.direction = position.direction;
|
||||
view.rotation = rect.direction.angle;
|
||||
view.x = rect.x - rect.width * (rect.direction.x + 1) / 2 + rect.width * (rect.direction.y + 1) / 2 + 0.5 * rect.width;
|
||||
view.y = rect.y - rect.height * (rect.direction.x + 1) / 2 - rect.height * (rect.direction.y + 1) / 2 + 1.5 * rect.height;
|
||||
}
|
||||
}
|
||||
|
||||
public function update():Void {}
|
||||
|
||||
public function dispose():Void {}
|
||||
}
|
||||
97
src/client/haxe/ru/m/tankz/render/item/TankRenderItem.hx
Normal file
97
src/client/haxe/ru/m/tankz/render/item/TankRenderItem.hx
Normal file
@@ -0,0 +1,97 @@
|
||||
package ru.m.tankz.render.item;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
import haxework.color.Color;
|
||||
import haxework.view.utils.BitmapUtil;
|
||||
import openfl.Assets;
|
||||
import ru.m.tankz.core.Tank;
|
||||
|
||||
class TankRenderItem extends BitmapRenderItem {
|
||||
public var color(default, default):Color;
|
||||
public var skin(default, set):String;
|
||||
public var hits(default, set):Int;
|
||||
public var bonus(default, set):Bool;
|
||||
public var moves(default, set):Bool;
|
||||
|
||||
private var images:Array<BitmapData>;
|
||||
private var frame:Int;
|
||||
|
||||
public function new(tank:Tank) {
|
||||
super(tank.rect);
|
||||
color = tank.color;
|
||||
skin = tank.config.skin;
|
||||
hits = tank.hits;
|
||||
bonus = tank.bonus;
|
||||
move(rect.position);
|
||||
}
|
||||
|
||||
private function redraw():Void {
|
||||
var image1 = Assets.getBitmapData('resources/image/tank/${skin}-0.png');
|
||||
var image2 = Assets.getBitmapData('resources/image/tank/${skin}-1.png');
|
||||
var color1:Color = switch hits {
|
||||
case 1: 0x869C43;
|
||||
case 2: 0xDEAF80;
|
||||
case 3: 0x5EA67A;
|
||||
case _: color;
|
||||
}
|
||||
var color2:Color = color1;
|
||||
if (bonus) {
|
||||
color1 = 0xff00aa;
|
||||
}
|
||||
if (!color1.zero) {
|
||||
image1 = BitmapUtil.colorize(image1, color1);
|
||||
}
|
||||
if (!color1.zero) {
|
||||
image2 = BitmapUtil.colorize(image2, color2);
|
||||
}
|
||||
images = [
|
||||
image1, image1, image1,
|
||||
image2, image2, image2,
|
||||
];
|
||||
frame = 0;
|
||||
bitmap.bitmapData = images[frame];
|
||||
}
|
||||
|
||||
private function set_skin(value:String):String {
|
||||
if (skin != value) {
|
||||
skin = value;
|
||||
redraw();
|
||||
}
|
||||
return skin;
|
||||
}
|
||||
|
||||
private function set_hits(value:Int):Int {
|
||||
if (hits != value) {
|
||||
hits = value;
|
||||
redraw();
|
||||
}
|
||||
return hits;
|
||||
}
|
||||
|
||||
private function set_bonus(value:Bool):Bool {
|
||||
if (bonus != value) {
|
||||
bonus = value;
|
||||
redraw();
|
||||
}
|
||||
return bonus;
|
||||
}
|
||||
|
||||
private function set_moves(value:Bool):Bool {
|
||||
if (moves != value) {
|
||||
moves = value;
|
||||
bitmap.bitmapData = images[0];
|
||||
}
|
||||
return moves;
|
||||
}
|
||||
|
||||
override public function update():Void {
|
||||
super.update();
|
||||
if (moves) {
|
||||
frame++;
|
||||
if (frame > images.length - 1) {
|
||||
frame = 0;
|
||||
}
|
||||
bitmap.bitmapData = images[frame];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,14 +14,22 @@ import ru.m.tankz.game.record.GameRecord;
|
||||
|
||||
public function save(record:GameRecord):Void {
|
||||
L.d("RecordStorage", 'save $record');
|
||||
write(record.id, record);
|
||||
write('${record.info.id}.info', record.info);
|
||||
write(record.info.id, record);
|
||||
}
|
||||
|
||||
public function iterator():Iterator<GameRecord> {
|
||||
override public function delete(id:String):Void {
|
||||
super.delete(id);
|
||||
super.delete('${id}.info');
|
||||
}
|
||||
|
||||
public function iterator():Iterator<GameRecordInfo> {
|
||||
var data:DynamicAccess<String> = so.data;
|
||||
for (id in data.keys()) {
|
||||
try {
|
||||
@yield return read(id);
|
||||
if (StringTools.endsWith(id, '.info')) {
|
||||
@yield return read(id);
|
||||
}
|
||||
} catch (error:Dynamic) {
|
||||
L.w("RecordStorage", 'read ', error);
|
||||
delete(id);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import flash.events.Event;
|
||||
import haxe.ds.Option;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.VGroupView;
|
||||
@@ -51,8 +50,7 @@ import ru.m.tankz.view.game.GameView;
|
||||
private function start(state:GameState):Void {
|
||||
gameView.type = state.type;
|
||||
game = new Game(state);
|
||||
game.connect(gameView.render);
|
||||
game.engine.connect(gameView.render);
|
||||
gameView.render.game = game;
|
||||
game.connect(soundManager);
|
||||
game.connect(this);
|
||||
if (gameView.panel != null) {
|
||||
@@ -63,15 +61,13 @@ import ru.m.tankz.view.game.GameView;
|
||||
game.connect(recorder);
|
||||
runner = new GameRunner(game);
|
||||
runner.start(state);
|
||||
content.addEventListener(Event.ENTER_FRAME, _redraw);
|
||||
gameView.render.draw(game.engine);
|
||||
gameView.render.draw();
|
||||
}
|
||||
|
||||
private function play(record:GameRecord):Void {
|
||||
gameView.type = record.type;
|
||||
gameView.type = record.info.type;
|
||||
game = new Game(record.state);
|
||||
game.connect(gameView.render);
|
||||
game.engine.connect(gameView.render);
|
||||
gameView.render.game = game;
|
||||
game.connect(soundManager);
|
||||
//game.connect(this);
|
||||
if (gameView.panel != null) {
|
||||
@@ -79,12 +75,10 @@ import ru.m.tankz.view.game.GameView;
|
||||
}
|
||||
player = new GamePlayer(game, record);
|
||||
player.start();
|
||||
content.addEventListener(Event.ENTER_FRAME, _redraw);
|
||||
gameView.render.draw(game.engine);
|
||||
gameView.render.draw();
|
||||
}
|
||||
|
||||
private function stop():Void {
|
||||
content.removeEventListener(Event.ENTER_FRAME, _redraw);
|
||||
if (runner != null) {
|
||||
runner.dispose();
|
||||
runner = null;
|
||||
@@ -122,10 +116,6 @@ import ru.m.tankz.view.game.GameView;
|
||||
stop();
|
||||
}
|
||||
|
||||
private function _redraw(_):Void {
|
||||
gameView.render.draw(game.engine);
|
||||
}
|
||||
|
||||
public function close():Void {
|
||||
switcher.change(LevelFrame.ID);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import ru.m.tankz.storage.RecordStorage;
|
||||
@:template class RecordFrame extends VGroupView {
|
||||
public static var ID(default, never):String = "record";
|
||||
|
||||
@:view var data:VListView<GameRecord>;
|
||||
@:view var data:VListView<GameRecordInfo>;
|
||||
|
||||
@:provide var recordStorage:RecordStorage;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@@ -18,13 +18,12 @@ import ru.m.tankz.storage.RecordStorage;
|
||||
|
||||
public function onShow():Void {
|
||||
var data = Lambda.array(recordStorage);
|
||||
data.sort(function(a:GameRecord, b:GameRecord) return Std.int(b.date.getTime() - a.date.getTime()));
|
||||
data.sort(function(a:GameRecordInfo, b:GameRecordInfo) return Std.int(b.date.getTime() - a.date.getTime()));
|
||||
this.data.data = data;
|
||||
}
|
||||
|
||||
private function onRecordSelect(item:IListItemView<GameRecord>):Void {
|
||||
//record = item.data;
|
||||
//switcher.change(GameFrame.ID);
|
||||
private function onRecordSelect(item:IListItemView<GameRecordInfo>):Void {
|
||||
|
||||
}
|
||||
|
||||
private function close() {
|
||||
|
||||
@@ -7,20 +7,20 @@ import haxework.view.list.ListView;
|
||||
import ru.m.tankz.game.record.GameRecord;
|
||||
import ru.m.tankz.storage.RecordStorage;
|
||||
|
||||
@:template class RecordView extends HGroupView implements IListItemView<GameRecord> {
|
||||
@:template class RecordView extends HGroupView implements IListItemView<GameRecordInfo> {
|
||||
@:view var date:LabelView;
|
||||
@:view var type:LabelView;
|
||||
@:view var level:LabelView;
|
||||
@:view var preset:LabelView;
|
||||
|
||||
public var item_index(default, default):Int;
|
||||
public var data(default, set):GameRecord;
|
||||
public var data(default, set):GameRecordInfo;
|
||||
|
||||
@:provide var recordStorage:RecordStorage;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@:provide var record:GameRecord;
|
||||
|
||||
private function set_data(value:GameRecord):GameRecord {
|
||||
private function set_data(value:GameRecordInfo):GameRecordInfo {
|
||||
if (data != value) {
|
||||
data = value;
|
||||
date.text = data.date.toString();
|
||||
@@ -32,7 +32,7 @@ import ru.m.tankz.storage.RecordStorage;
|
||||
}
|
||||
|
||||
private function play():Void {
|
||||
record = data;
|
||||
record = recordStorage.read(data.id);
|
||||
switcher.change(GameFrame.ID);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user