[client] refactored GameFrame
This commit is contained in:
10
src/client/haxe/ru/m/tankz/render/IRender.hx
Normal file
10
src/client/haxe/ru/m/tankz/render/IRender.hx
Normal file
@@ -0,0 +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;
|
||||
public function reset():Void;
|
||||
}
|
||||
@@ -13,10 +13,9 @@ 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.game.IGame;
|
||||
import ru.m.tankz.render.RenderItem;
|
||||
|
||||
class Render extends SpriteView implements GameListener implements EngineListener {
|
||||
class Render extends SpriteView implements IRender {
|
||||
|
||||
private var backgroundLayer:Sprite;
|
||||
private var groundLayer:Sprite;
|
||||
|
||||
@@ -7,12 +7,8 @@ views:
|
||||
$type: ru.m.tankz.view.StartFrame
|
||||
- id: level
|
||||
$type: ru.m.tankz.view.LevelFrame
|
||||
- id: classic
|
||||
$type: ru.m.tankz.view.classic.ClassicGameFrame
|
||||
- id: dota
|
||||
$type: ru.m.tankz.view.dota.DotaGameFrame
|
||||
- id: death
|
||||
$type: ru.m.tankz.view.death.DeathGameFrame
|
||||
- id: game
|
||||
$type: ru.m.tankz.view.GameFrame
|
||||
- id: result
|
||||
$type: ru.m.tankz.view.ResultFrame
|
||||
- id: settings
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package ru.m.tankz.view.common;
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import flash.events.Event;
|
||||
import haxe.ds.Option;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.GroupView;
|
||||
import haxework.view.VGroupView;
|
||||
import ru.m.tankz.game.Game;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.game.GameRunner;
|
||||
@@ -13,18 +13,17 @@ import ru.m.tankz.game.record.GamePlayer;
|
||||
import ru.m.tankz.game.record.GameRecord;
|
||||
import ru.m.tankz.game.record.GameRecorder;
|
||||
import ru.m.tankz.network.NetworkManager;
|
||||
import ru.m.tankz.render.Render;
|
||||
import ru.m.tankz.sound.SoundManager;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.storage.RecordStorage;
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
import ru.m.tankz.view.game.GameView;
|
||||
|
||||
class GameFrame extends GroupView implements GameListener {
|
||||
@:template class GameFrame extends VGroupView implements GameListener {
|
||||
public static inline var ID = "game";
|
||||
|
||||
private static inline var TAG = "GameFrame";
|
||||
|
||||
private var render(get, null):Render;
|
||||
private var panel(get, null):IGamePanel;
|
||||
@:view("game") private var gameView(default, null):GameView;
|
||||
|
||||
@:provide var network:NetworkManager;
|
||||
@:provide var soundManager:SoundManager;
|
||||
@@ -40,14 +39,6 @@ class GameFrame extends GroupView implements GameListener {
|
||||
private var recorder:GameRecorder;
|
||||
private var player:GamePlayer;
|
||||
|
||||
private function get_render():Render {
|
||||
throw "Not implemented";
|
||||
}
|
||||
|
||||
private function get_panel():IGamePanel {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function onShow():Void {
|
||||
if (record != null) {
|
||||
play(record);
|
||||
@@ -58,13 +49,14 @@ class GameFrame extends GroupView implements GameListener {
|
||||
}
|
||||
|
||||
private function start(state:GameState):Void {
|
||||
gameView.type = state.type;
|
||||
game = new Game(state);
|
||||
game.connect(render);
|
||||
game.engine.connect(render);
|
||||
game.connect(gameView.render);
|
||||
game.engine.connect(gameView.render);
|
||||
game.connect(soundManager);
|
||||
game.connect(this);
|
||||
if (panel != null) {
|
||||
game.connect(panel);
|
||||
if (gameView.panel != null) {
|
||||
game.connect(gameView.panel);
|
||||
}
|
||||
//game.connect(new GameTracer());
|
||||
recorder = new GameRecorder();
|
||||
@@ -72,22 +64,23 @@ class GameFrame extends GroupView implements GameListener {
|
||||
runner = new GameRunner(game);
|
||||
runner.start(state);
|
||||
content.addEventListener(Event.ENTER_FRAME, _redraw);
|
||||
render.draw(game.engine);
|
||||
gameView.render.draw(game.engine);
|
||||
}
|
||||
|
||||
private function play(record:GameRecord):Void {
|
||||
gameView.type = record.type;
|
||||
game = new Game(record.state);
|
||||
game.connect(render);
|
||||
game.engine.connect(render);
|
||||
game.connect(gameView.render);
|
||||
game.engine.connect(gameView.render);
|
||||
game.connect(soundManager);
|
||||
//game.connect(this);
|
||||
if (panel != null) {
|
||||
game.connect(panel);
|
||||
if (gameView.panel != null) {
|
||||
game.connect(gameView.panel);
|
||||
}
|
||||
player = new GamePlayer(game, record);
|
||||
player.start();
|
||||
content.addEventListener(Event.ENTER_FRAME, _redraw);
|
||||
render.draw(game.engine);
|
||||
gameView.render.draw(game.engine);
|
||||
}
|
||||
|
||||
private function stop():Void {
|
||||
@@ -100,7 +93,7 @@ class GameFrame extends GroupView implements GameListener {
|
||||
game.dispose();
|
||||
game = null;
|
||||
}
|
||||
render.reset();
|
||||
gameView.render.reset();
|
||||
}
|
||||
|
||||
public function onGameEvent(event:GameEvent):Void {
|
||||
@@ -130,6 +123,10 @@ class GameFrame extends GroupView implements GameListener {
|
||||
}
|
||||
|
||||
private function _redraw(_):Void {
|
||||
render.draw(game.engine);
|
||||
gameView.render.draw(game.engine);
|
||||
}
|
||||
|
||||
public function close():Void {
|
||||
switcher.change(LevelFrame.ID);
|
||||
}
|
||||
}
|
||||
14
src/client/haxe/ru/m/tankz/view/GameFrame.yaml
Normal file
14
src/client/haxe/ru/m/tankz/view/GameFrame.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
views:
|
||||
- $type: haxework.view.VGroupView
|
||||
skinId: container
|
||||
views:
|
||||
- id: game
|
||||
$type: ru.m.tankz.view.game.GameView
|
||||
# - $type: haxework.view.HGroupView
|
||||
# skinId: panel
|
||||
# views:
|
||||
# - id: close
|
||||
# $type: haxework.view.ButtonView
|
||||
# skinId: button.close
|
||||
# +onPress: $code:close()
|
||||
@@ -8,14 +8,8 @@ import haxework.view.VGroupView;
|
||||
import ru.m.tankz.bundle.ILevelBundle;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.preset.DeathGame;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.classic.ClassicGameFrame;
|
||||
import ru.m.tankz.view.death.DeathGameFrame;
|
||||
import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
import ru.m.tankz.view.popup.LevelPopup;
|
||||
|
||||
@:template class LevelFrame extends VGroupView {
|
||||
@@ -39,12 +33,7 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
private function start(level:LevelConfig, preset:GamePreset):Void {
|
||||
state.levelId = level.id;
|
||||
state.presetId = preset.id;
|
||||
switcher.change(switch state.type {
|
||||
case ClassicGame.TYPE: ClassicGameFrame.ID;
|
||||
case DotaGame.TYPE: DotaGameFrame.ID;
|
||||
case DeathGame.TYPE: DeathGameFrame.ID;
|
||||
case _: StartFrame.ID;
|
||||
});
|
||||
switcher.change(GameFrame.ID);
|
||||
}
|
||||
|
||||
private function levelViewFactory(index:Int, levelId:LevelId):ButtonView {
|
||||
@@ -70,6 +59,6 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
state.config.presets,
|
||||
storage.get(state.type)
|
||||
);
|
||||
levelPopup.show().then(function(preset) start(level, preset)).catchError(function(_) {});
|
||||
levelPopup.show().then(function(preset) preset != null ? start(level, preset) : {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,13 +5,7 @@ import haxework.view.list.ListView.IListItemView;
|
||||
import haxework.view.list.VListView;
|
||||
import haxework.view.VGroupView;
|
||||
import ru.m.tankz.game.record.GameRecord;
|
||||
import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.preset.DeathGame;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.storage.RecordStorage;
|
||||
import ru.m.tankz.view.classic.ClassicGameFrame;
|
||||
import ru.m.tankz.view.death.DeathGameFrame;
|
||||
import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
|
||||
@:template class RecordFrame extends VGroupView {
|
||||
public static var ID(default, never):String = "record";
|
||||
@@ -28,13 +22,7 @@ import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
|
||||
private function onRecordSelect(item:IListItemView<GameRecord>):Void {
|
||||
record = item.data;
|
||||
// ToDo: copy@paste from LevelFrame
|
||||
switcher.change(switch record.type {
|
||||
case ClassicGame.TYPE: ClassicGameFrame.ID;
|
||||
case DotaGame.TYPE: DotaGameFrame.ID;
|
||||
case DeathGame.TYPE: DeathGameFrame.ID;
|
||||
case _: StartFrame.ID;
|
||||
});
|
||||
switcher.change(GameFrame.ID);
|
||||
}
|
||||
|
||||
private function close() {
|
||||
|
||||
@@ -6,11 +6,7 @@ import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.LabelView;
|
||||
import haxework.view.VGroupView;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.view.classic.ClassicGameFrame;
|
||||
import ru.m.tankz.view.common.LifeView;
|
||||
import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
|
||||
@:template class ResultFrame extends VGroupView {
|
||||
public static var ID(default, never):String = "result";
|
||||
@@ -42,11 +38,7 @@ import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
}
|
||||
|
||||
private function next() {
|
||||
frames.change(switch state == null ? null : state.type {
|
||||
case ClassicGame.TYPE: ClassicGameFrame.ID;
|
||||
case DotaGame.TYPE: DotaGameFrame.ID;
|
||||
case _: StartFrame.ID;
|
||||
});
|
||||
frames.change(GameFrame.ID);
|
||||
}
|
||||
|
||||
private function close() {
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package ru.m.tankz.view.classic;
|
||||
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
import ru.m.tankz.render.Render;
|
||||
import ru.m.tankz.view.common.GameFrame;
|
||||
|
||||
@:template class ClassicGameFrame extends GameFrame {
|
||||
public static inline var ID = "classic";
|
||||
|
||||
@:view("render") private var renderView(default, null):Render;
|
||||
@:view("panel") private var panelView(default, null):IGamePanel;
|
||||
|
||||
override private function get_render():Render {
|
||||
return renderView;
|
||||
}
|
||||
|
||||
override private function get_panel():IGamePanel {
|
||||
return panelView;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
skinId: container
|
||||
views:
|
||||
- $type: haxework.view.HGroupView
|
||||
layout.margin: 5
|
||||
views:
|
||||
- id: render
|
||||
$type: ru.m.tankz.render.Render
|
||||
- id: panel
|
||||
$type: ru.m.tankz.view.classic.ClassicGamePanel
|
||||
@@ -1,21 +0,0 @@
|
||||
package ru.m.tankz.view.death;
|
||||
|
||||
import ru.m.tankz.render.Render;
|
||||
import ru.m.tankz.view.common.GameFrame;
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
|
||||
@:template class DeathGameFrame extends GameFrame {
|
||||
|
||||
public static inline var ID = "death";
|
||||
|
||||
@:view("render") private var renderView(default, null):Render;
|
||||
@:view("panel") private var panelView(default, null):IGamePanel;
|
||||
|
||||
override private function get_render():Render {
|
||||
return renderView;
|
||||
}
|
||||
|
||||
override private function get_panel():IGamePanel {
|
||||
return panelView;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
skinId: container
|
||||
views:
|
||||
- $type: haxework.view.HGroupView
|
||||
layout.margin: 5
|
||||
views:
|
||||
- id: render
|
||||
$type: ru.m.tankz.render.Render
|
||||
- id: panel
|
||||
$type: ru.m.tankz.view.death.DeathGamePanel
|
||||
@@ -1,21 +0,0 @@
|
||||
package ru.m.tankz.view.dota;
|
||||
|
||||
import ru.m.tankz.view.common.GameFrame;
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
import ru.m.tankz.render.Render;
|
||||
|
||||
@:template class DotaGameFrame extends GameFrame {
|
||||
|
||||
public static inline var ID = "dota";
|
||||
|
||||
@:view("render") private var renderView(default, null):Render;
|
||||
@:view("panel") private var panelView(default, null):IGamePanel;
|
||||
|
||||
override private function get_render():Render {
|
||||
return renderView;
|
||||
}
|
||||
|
||||
override private function get_panel():IGamePanel {
|
||||
return panelView;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
skinId: container
|
||||
views:
|
||||
- $type: haxework.view.VGroupView
|
||||
layout.margin: 5
|
||||
views:
|
||||
- id: panel
|
||||
$type: ru.m.tankz.view.dota.DotaGamePanel
|
||||
- id: render
|
||||
$type: ru.m.tankz.render.Render
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.m.tankz.view.classic;
|
||||
package ru.m.tankz.view.game;
|
||||
|
||||
import haxework.view.LabelView;
|
||||
import haxework.view.VGroupView;
|
||||
@@ -6,7 +6,6 @@ import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.Type.PlayerId;
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
import ru.m.tankz.view.common.LifeView;
|
||||
|
||||
@:template class ClassicGamePanel extends VGroupView implements IGamePanel {
|
||||
@@ -1,11 +1,10 @@
|
||||
package ru.m.tankz.view.death;
|
||||
package ru.m.tankz.view.game;
|
||||
|
||||
import haxework.view.DataView;
|
||||
import haxework.view.LabelView;
|
||||
import haxework.view.VGroupView;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
import ru.m.tankz.view.common.LifeView;
|
||||
|
||||
@:template class DeathGamePanel extends VGroupView implements IGamePanel {
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.m.tankz.view.dota;
|
||||
package ru.m.tankz.view.game;
|
||||
|
||||
import haxework.view.HGroupView;
|
||||
import haxework.view.LabelView;
|
||||
@@ -6,7 +6,6 @@ import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.Type.TeamId;
|
||||
import ru.m.tankz.view.common.IGamePanel;
|
||||
import ru.m.tankz.view.common.LifeView;
|
||||
|
||||
@:template class DotaGamePanel extends HGroupView implements IGamePanel {
|
||||
51
src/client/haxe/ru/m/tankz/view/game/GameView.hx
Normal file
51
src/client/haxe/ru/m/tankz/view/game/GameView.hx
Normal file
@@ -0,0 +1,51 @@
|
||||
package ru.m.tankz.view.game;
|
||||
|
||||
import haxework.view.IGroupView;
|
||||
import haxework.view.VGroupView;
|
||||
import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.preset.DeathGame;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.render.IRender;
|
||||
import ru.m.tankz.Type;
|
||||
|
||||
@:template class GameView extends VGroupView {
|
||||
|
||||
@:view public var render(default, null):IRender;
|
||||
public var panel(default, null):IGamePanel;
|
||||
public var type(default, set):GameType;
|
||||
|
||||
@:view public var top(default, null):IGroupView;
|
||||
@:view public var bottom(default, null):IGroupView;
|
||||
@:view public var left(default, null):IGroupView;
|
||||
@:view public var right(default, null):IGroupView;
|
||||
|
||||
private function set_type(value:GameType):GameType {
|
||||
if (type != value) {
|
||||
type = value;
|
||||
if (panel != null) {
|
||||
panel.remove();
|
||||
}
|
||||
panel = buildPanel(type);
|
||||
panelContainer(type).addView(panel);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
private function buildPanel(type:GameType):IGamePanel {
|
||||
return switch type {
|
||||
case ClassicGame.TYPE: new ClassicGamePanel();
|
||||
case DotaGame.TYPE: new DotaGamePanel();
|
||||
case DeathGame.TYPE: new DeathGamePanel();
|
||||
case _: throw 'Unsupported type: ${type}';
|
||||
}
|
||||
}
|
||||
|
||||
private function panelContainer(type:GameType):IGroupView {
|
||||
return switch type {
|
||||
case ClassicGame.TYPE: right;
|
||||
case DotaGame.TYPE: top;
|
||||
case DeathGame.TYPE: right;
|
||||
case _: throw 'Unsupported type: ${type}';
|
||||
}
|
||||
}
|
||||
}
|
||||
22
src/client/haxe/ru/m/tankz/view/game/GameView.yaml
Normal file
22
src/client/haxe/ru/m/tankz/view/game/GameView.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
views:
|
||||
- id: top
|
||||
$type: haxework.view.GroupView
|
||||
layout.hAlign: center
|
||||
geometry.size.width: 100%
|
||||
- $type: haxework.view.HGroupView
|
||||
views:
|
||||
- id: left
|
||||
$type: haxework.view.GroupView
|
||||
layout.vAlign: middle
|
||||
geometry.size.height: 100%
|
||||
- id: render
|
||||
$type: ru.m.tankz.render.Render
|
||||
- id: right
|
||||
$type: haxework.view.GroupView
|
||||
layout.vAlign: middle
|
||||
geometry.size.height: 100%
|
||||
- id: bottom
|
||||
$type: haxework.view.GroupView
|
||||
layout.hAlign: center
|
||||
geometry.size.width: 100%
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.m.tankz.view.common;
|
||||
package ru.m.tankz.view.game;
|
||||
|
||||
import haxework.view.IView;
|
||||
import ru.m.tankz.game.IGame;
|
||||
Reference in New Issue
Block a user