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

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

View File

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