use dispatcher macro

This commit is contained in:
2019-04-22 10:36:39 +03:00
parent b86e0ddd20
commit 7ddba8f69b
6 changed files with 23 additions and 76 deletions

View File

@@ -15,7 +15,7 @@ import ru.m.tankz.engine.Engine;
import ru.m.tankz.render.RenderItem; import ru.m.tankz.render.RenderItem;
import ru.m.tankz.Type; import ru.m.tankz.Type;
class Render extends SpriteView { class Render extends SpriteView implements EngineListener {
private var backgroundLayer:Sprite; private var backgroundLayer:Sprite;
private var groundLayer:Sprite; private var groundLayer:Sprite;

View File

@@ -6,9 +6,10 @@ import flash.media.SoundChannel;
import flash.media.SoundTransform; import flash.media.SoundTransform;
import openfl.utils.Assets; import openfl.utils.Assets;
import ru.m.tankz.core.EntityType; import ru.m.tankz.core.EntityType;
import ru.m.tankz.engine.Engine;
import ru.m.tankz.Type; import ru.m.tankz.Type;
class SoundManager { class SoundManager implements EngineListener {
private static var TAG(default, never):String = 'SoundManager'; private static var TAG(default, never):String = 'SoundManager';
#if flash #if flash

View File

@@ -1,6 +1,5 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import ru.m.tankz.storage.GameStorage;
import flash.events.Event; import flash.events.Event;
import haxe.ds.Option; import haxe.ds.Option;
import haxe.Timer; import haxe.Timer;
@@ -11,9 +10,10 @@ import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.render.Render; 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.view.common.IGamePanel; import ru.m.tankz.view.common.IGamePanel;
class GameFrame extends GroupView { class GameFrame extends GroupView implements GameListener {
private static inline var TAG = "GameFrame"; private static inline var TAG = "GameFrame";

View File

@@ -1,10 +1,8 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import haxework.view.IView; import haxework.view.IView;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.Game.GameListener;
interface IGamePanel extends IView<Dynamic> extends GameListener {
interface IGamePanel extends IView<Dynamic> {
public function onGameStart(state:GameState):Void;
public function onGameChange(state:GameState):Void;
public function onGameComplete(state:GameState):Void;
} }

View File

@@ -1,6 +1,5 @@
package ru.m.tankz.engine; package ru.m.tankz.engine;
import haxework.signal.Signal;
import ru.m.geom.Line; import ru.m.geom.Line;
import ru.m.geom.Point; import ru.m.geom.Point;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
@@ -14,7 +13,7 @@ import ru.m.tankz.map.Grid;
import ru.m.tankz.map.LevelMap; import ru.m.tankz.map.LevelMap;
import ru.m.tankz.Type; import ru.m.tankz.Type;
typedef EngineListener = { interface EngineListener {
public function onSpawn(entity:EntityType):Void; public function onSpawn(entity:EntityType):Void;
public function onCollision(entity:EntityType, with:EntityType):Void; public function onCollision(entity:EntityType, with:EntityType):Void;
public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void; public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void;
@@ -54,33 +53,7 @@ class CollisionProcessor {
} }
} }
@:yield @:dispatcher(EngineListener) class Engine implements ControlHandler {
class EngineDispatcher {
public var spawnSignal(default, null):Signal1<EntityType>;
public var collisionSignal(default, null):Signal2<EntityType, EntityType>;
public var destroySignal(default, null):Signal2<EntityType, PlayerId>;
public function new() {
spawnSignal = new Signal1<EntityType>();
collisionSignal = new Signal2<EntityType, EntityType>();
destroySignal = new Signal2<EntityType, PlayerId>();
}
public function connect(listener:EngineListener) {
spawnSignal.connect(listener.onSpawn);
collisionSignal.connect(listener.onCollision);
destroySignal.connect(listener.onDestroy);
}
public function disconnect(listener:EngineListener) {
spawnSignal.disconnect(listener.onSpawn);
collisionSignal.disconnect(listener.onCollision);
destroySignal.disconnect(listener.onDestroy);
}
}
@:yield
class Engine extends EngineDispatcher implements ControlHandler {
public var config(default, default):Config; public var config(default, default):Config;
public var map(default, null):LevelMap; public var map(default, null):LevelMap;
@@ -92,7 +65,6 @@ class Engine extends EngineDispatcher implements ControlHandler {
private var time:Float; private var time:Float;
public function new(config:Config) { public function new(config:Config) {
super();
this.config = config; this.config = config;
map = new LevelMap(config.map); map = new LevelMap(config.map);
entities = new Map<Int, Entity>(); entities = new Map<Int, Entity>();

View File

@@ -2,7 +2,6 @@ package ru.m.tankz.game;
import haxe.ds.Option; import haxe.ds.Option;
import haxe.Timer; import haxe.Timer;
import haxework.signal.Signal;
import ru.m.geom.Point; import ru.m.geom.Point;
import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
@@ -19,35 +18,13 @@ import ru.m.tankz.game.GameState;
import ru.m.tankz.game.Spawner; import ru.m.tankz.game.Spawner;
import ru.m.tankz.Type; import ru.m.tankz.Type;
typedef GameListener = { interface GameListener {
public function onGameStart(state:GameState):Void; public function onGameStart(state:GameState):Void;
public function onGameChange(state:GameState):Void; public function onGameChange(state:GameState):Void;
public function onGameComplete(state:GameState):Void; public function onGameComplete(state:GameState):Void;
} }
class GameDispatcher { @:dispatcher(GameListener) class Game implements EngineListener {
public var onGameStart(default, null):Signal<GameState> = new Signal();
public var onGameChange(default, null):Signal<GameState> = new Signal();
public var onGameComplete(default, null):Signal<GameState> = new Signal();
public function new() {
}
public function connect(listener:GameListener) {
onGameStart.connect(listener.onGameStart);
onGameChange.connect(listener.onGameChange);
onGameComplete.connect(listener.onGameComplete);
}
public function disconnect(listener:GameListener) {
onGameStart.disconnect(listener.onGameStart);
onGameChange.disconnect(listener.onGameChange);
onGameComplete.disconnect(listener.onGameComplete);
}
}
class Game extends GameDispatcher {
private static var TAG(default, never):String = "Game"; private static var TAG(default, never):String = "Game";
@@ -65,7 +42,6 @@ class Game extends GameDispatcher {
@:provide var controlFactory:IControlFactory; @:provide var controlFactory:IControlFactory;
public function new(type:GameType) { public function new(type:GameType) {
super();
this.type = type; this.type = type;
this.config = configBundle.get(type); this.config = configBundle.get(type);
this.engine = new Engine(config); this.engine = new Engine(config);
@@ -142,8 +118,8 @@ class Game extends GameDispatcher {
engine.spawn(eagle); engine.spawn(eagle);
} }
} }
onGameStart.emit(state); gameStartSignal.emit(state);
onGameChange.emit(state); gameChangeSignal.emit(state);
} }
private function spawn(task:SpawnTask):Void { private function spawn(task:SpawnTask):Void {
@@ -155,7 +131,7 @@ class Game extends GameDispatcher {
player.tankId = tank.id; player.tankId = tank.id;
player.state.tank = tank.config.type; player.state.tank = tank.config.type;
engine.spawn(tank); engine.spawn(tank);
onGameChange.emit(state); gameChangeSignal.emit(state);
} }
private function checkComplete() { private function checkComplete() {
@@ -187,8 +163,8 @@ class Game extends GameDispatcher {
} }
} }
Timer.delay(function() { Timer.delay(function() {
//onGameChange.emit(state); //gameChangeSignal.emit(state);
onGameComplete.emit(state); gameCompleteSignal.emit(state);
}, 5000); }, 5000);
} }
@@ -240,7 +216,7 @@ class Game extends GameDispatcher {
getPlayer(bullet.playerId).state.score += eagle.score; getPlayer(bullet.playerId).state.score += eagle.score;
} }
checkComplete(); checkComplete();
onGameChange.emit(state); gameChangeSignal.emit(state);
} }
case _: case _:
} }
@@ -268,7 +244,7 @@ class Game extends GameDispatcher {
getPlayer(playerId).state.frags++; getPlayer(playerId).state.frags++;
getPlayer(playerId).state.score += tank.config.score * (tank.playerId.team == playerId.team ? 0 : 1); getPlayer(playerId).state.score += tank.config.score * (tank.playerId.team == playerId.team ? 0 : 1);
} }
onGameChange.emit(state); gameChangeSignal.emit(state);
case _: case _:
} }
} }
@@ -295,9 +271,9 @@ class Game extends GameDispatcher {
public function dispose():Void { public function dispose():Void {
engine.dispose(); engine.dispose();
onGameStart.dispose(); gameStartSignal.dispose();
onGameChange.dispose(); gameChangeSignal.dispose();
onGameComplete.dispose(); gameCompleteSignal.dispose();
} }
private function spawnBonus(?type:BonusType):Void { private function spawnBonus(?type:BonusType):Void {
@@ -343,7 +319,7 @@ class Game extends GameDispatcher {
if (bonus.config.score > 0) { if (bonus.config.score > 0) {
getPlayer(tank.playerId).state.score += bonus.config.score; getPlayer(tank.playerId).state.score += bonus.config.score;
} }
onGameChange.emit(state); gameChangeSignal.emit(state);
} }
public function upgradeTank(tank:Tank, level:Int = 1):Void { public function upgradeTank(tank:Tank, level:Int = 1):Void {