[client] refactored GameFrame

This commit is contained in:
2019-05-13 17:34:53 +03:00
parent b0ae85334b
commit 13240677b0
23 changed files with 132 additions and 169 deletions

View 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;
}

View File

@@ -13,10 +13,9 @@ import ru.m.geom.Point;
import ru.m.tankz.core.EntityType; import ru.m.tankz.core.EntityType;
import ru.m.tankz.engine.IEngine; import ru.m.tankz.engine.IEngine;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.IGame;
import ru.m.tankz.render.RenderItem; 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 backgroundLayer:Sprite;
private var groundLayer:Sprite; private var groundLayer:Sprite;

View File

@@ -7,12 +7,8 @@ views:
$type: ru.m.tankz.view.StartFrame $type: ru.m.tankz.view.StartFrame
- id: level - id: level
$type: ru.m.tankz.view.LevelFrame $type: ru.m.tankz.view.LevelFrame
- id: classic - id: game
$type: ru.m.tankz.view.classic.ClassicGameFrame $type: ru.m.tankz.view.GameFrame
- id: dota
$type: ru.m.tankz.view.dota.DotaGameFrame
- id: death
$type: ru.m.tankz.view.death.DeathGameFrame
- id: result - id: result
$type: ru.m.tankz.view.ResultFrame $type: ru.m.tankz.view.ResultFrame
- id: settings - id: settings

View File

@@ -1,9 +1,9 @@
package ru.m.tankz.view.common; package ru.m.tankz.view;
import flash.events.Event; import flash.events.Event;
import haxe.ds.Option; import haxe.ds.Option;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
import haxework.view.GroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.Game; import ru.m.tankz.game.Game;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameRunner; 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.GameRecord;
import ru.m.tankz.game.record.GameRecorder; import ru.m.tankz.game.record.GameRecorder;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.render.Render;
import ru.m.tankz.sound.SoundManager; import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.storage.RecordStorage; 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 static inline var TAG = "GameFrame";
private var render(get, null):Render; @:view("game") private var gameView(default, null):GameView;
private var panel(get, null):IGamePanel;
@:provide var network:NetworkManager; @:provide var network:NetworkManager;
@:provide var soundManager:SoundManager; @:provide var soundManager:SoundManager;
@@ -40,14 +39,6 @@ class GameFrame extends GroupView implements GameListener {
private var recorder:GameRecorder; private var recorder:GameRecorder;
private var player:GamePlayer; private var player:GamePlayer;
private function get_render():Render {
throw "Not implemented";
}
private function get_panel():IGamePanel {
return null;
}
public function onShow():Void { public function onShow():Void {
if (record != null) { if (record != null) {
play(record); play(record);
@@ -58,13 +49,14 @@ class GameFrame extends GroupView implements GameListener {
} }
private function start(state:GameState):Void { private function start(state:GameState):Void {
gameView.type = state.type;
game = new Game(state); game = new Game(state);
game.connect(render); game.connect(gameView.render);
game.engine.connect(render); game.engine.connect(gameView.render);
game.connect(soundManager); game.connect(soundManager);
game.connect(this); game.connect(this);
if (panel != null) { if (gameView.panel != null) {
game.connect(panel); game.connect(gameView.panel);
} }
//game.connect(new GameTracer()); //game.connect(new GameTracer());
recorder = new GameRecorder(); recorder = new GameRecorder();
@@ -72,22 +64,23 @@ class GameFrame extends GroupView implements GameListener {
runner = new GameRunner(game); runner = new GameRunner(game);
runner.start(state); runner.start(state);
content.addEventListener(Event.ENTER_FRAME, _redraw); content.addEventListener(Event.ENTER_FRAME, _redraw);
render.draw(game.engine); gameView.render.draw(game.engine);
} }
private function play(record:GameRecord):Void { private function play(record:GameRecord):Void {
gameView.type = record.type;
game = new Game(record.state); game = new Game(record.state);
game.connect(render); game.connect(gameView.render);
game.engine.connect(render); game.engine.connect(gameView.render);
game.connect(soundManager); game.connect(soundManager);
//game.connect(this); //game.connect(this);
if (panel != null) { if (gameView.panel != null) {
game.connect(panel); game.connect(gameView.panel);
} }
player = new GamePlayer(game, record); player = new GamePlayer(game, record);
player.start(); player.start();
content.addEventListener(Event.ENTER_FRAME, _redraw); content.addEventListener(Event.ENTER_FRAME, _redraw);
render.draw(game.engine); gameView.render.draw(game.engine);
} }
private function stop():Void { private function stop():Void {
@@ -100,7 +93,7 @@ class GameFrame extends GroupView implements GameListener {
game.dispose(); game.dispose();
game = null; game = null;
} }
render.reset(); gameView.render.reset();
} }
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
@@ -130,6 +123,10 @@ class GameFrame extends GroupView implements GameListener {
} }
private function _redraw(_):Void { private function _redraw(_):Void {
render.draw(game.engine); gameView.render.draw(game.engine);
}
public function close():Void {
switcher.change(LevelFrame.ID);
} }
} }

View 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()

View File

@@ -8,14 +8,8 @@ import haxework.view.VGroupView;
import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameState; 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.storage.GameStorage;
import ru.m.tankz.Type; 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; import ru.m.tankz.view.popup.LevelPopup;
@:template class LevelFrame extends VGroupView { @:template class LevelFrame extends VGroupView {
@@ -39,12 +33,7 @@ import ru.m.tankz.view.popup.LevelPopup;
private function start(level:LevelConfig, preset:GamePreset):Void { private function start(level:LevelConfig, preset:GamePreset):Void {
state.levelId = level.id; state.levelId = level.id;
state.presetId = preset.id; state.presetId = preset.id;
switcher.change(switch state.type { switcher.change(GameFrame.ID);
case ClassicGame.TYPE: ClassicGameFrame.ID;
case DotaGame.TYPE: DotaGameFrame.ID;
case DeathGame.TYPE: DeathGameFrame.ID;
case _: StartFrame.ID;
});
} }
private function levelViewFactory(index:Int, levelId:LevelId):ButtonView { private function levelViewFactory(index:Int, levelId:LevelId):ButtonView {
@@ -70,6 +59,6 @@ import ru.m.tankz.view.popup.LevelPopup;
state.config.presets, state.config.presets,
storage.get(state.type) storage.get(state.type)
); );
levelPopup.show().then(function(preset) start(level, preset)).catchError(function(_) {}); levelPopup.show().then(function(preset) preset != null ? start(level, preset) : {});
} }
} }

View File

@@ -5,13 +5,7 @@ import haxework.view.list.ListView.IListItemView;
import haxework.view.list.VListView; import haxework.view.list.VListView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.record.GameRecord; 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.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 { @:template class RecordFrame extends VGroupView {
public static var ID(default, never):String = "record"; 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 { private function onRecordSelect(item:IListItemView<GameRecord>):Void {
record = item.data; record = item.data;
// ToDo: copy@paste from LevelFrame switcher.change(GameFrame.ID);
switcher.change(switch record.type {
case ClassicGame.TYPE: ClassicGameFrame.ID;
case DotaGame.TYPE: DotaGameFrame.ID;
case DeathGame.TYPE: DeathGameFrame.ID;
case _: StartFrame.ID;
});
} }
private function close() { private function close() {

View File

@@ -6,11 +6,7 @@ import haxework.view.frame.FrameSwitcher;
import haxework.view.LabelView; import haxework.view.LabelView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.GameState; 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.common.LifeView;
import ru.m.tankz.view.dota.DotaGameFrame;
@:template class ResultFrame extends VGroupView { @:template class ResultFrame extends VGroupView {
public static var ID(default, never):String = "result"; public static var ID(default, never):String = "result";
@@ -42,11 +38,7 @@ import ru.m.tankz.view.dota.DotaGameFrame;
} }
private function next() { private function next() {
frames.change(switch state == null ? null : state.type { frames.change(GameFrame.ID);
case ClassicGame.TYPE: ClassicGameFrame.ID;
case DotaGame.TYPE: DotaGameFrame.ID;
case _: StartFrame.ID;
});
} }
private function close() { private function close() {

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -1,4 +1,4 @@
package ru.m.tankz.view.classic; package ru.m.tankz.view.game;
import haxework.view.LabelView; import haxework.view.LabelView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
@@ -6,7 +6,6 @@ import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.preset.ClassicGame; import ru.m.tankz.preset.ClassicGame;
import ru.m.tankz.Type.PlayerId; import ru.m.tankz.Type.PlayerId;
import ru.m.tankz.view.common.IGamePanel;
import ru.m.tankz.view.common.LifeView; import ru.m.tankz.view.common.LifeView;
@:template class ClassicGamePanel extends VGroupView implements IGamePanel { @:template class ClassicGamePanel extends VGroupView implements IGamePanel {

View File

@@ -1,11 +1,10 @@
package ru.m.tankz.view.death; package ru.m.tankz.view.game;
import haxework.view.DataView; import haxework.view.DataView;
import haxework.view.LabelView; import haxework.view.LabelView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.view.common.IGamePanel;
import ru.m.tankz.view.common.LifeView; import ru.m.tankz.view.common.LifeView;
@:template class DeathGamePanel extends VGroupView implements IGamePanel { @:template class DeathGamePanel extends VGroupView implements IGamePanel {

View File

@@ -1,4 +1,4 @@
package ru.m.tankz.view.dota; package ru.m.tankz.view.game;
import haxework.view.HGroupView; import haxework.view.HGroupView;
import haxework.view.LabelView; import haxework.view.LabelView;
@@ -6,7 +6,6 @@ import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.preset.DotaGame; import ru.m.tankz.preset.DotaGame;
import ru.m.tankz.Type.TeamId; import ru.m.tankz.Type.TeamId;
import ru.m.tankz.view.common.IGamePanel;
import ru.m.tankz.view.common.LifeView; import ru.m.tankz.view.common.LifeView;
@:template class DotaGamePanel extends HGroupView implements IGamePanel { @:template class DotaGamePanel extends HGroupView implements IGamePanel {

View 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}';
}
}
}

View 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%

View File

@@ -1,4 +1,4 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.game;
import haxework.view.IView; import haxework.view.IView;
import ru.m.tankz.game.IGame; import ru.m.tankz.game.IGame;