From dbf30decae92e4dd22e4111bd45a4a1ab344e2f4 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 6 Jun 2019 17:38:37 +0300 Subject: [PATCH] [client] fix control --- src/client/haxe/ru/m/tankz/Init.hx | 6 ++-- .../haxe/ru/m/tankz/control/ActionConfig.hx | 2 +- .../haxe/ru/m/tankz/control/HumanControl.hx | 14 ++++++++-- .../{control => local}/LocalControlFactory.hx | 5 +++- .../ru/m/tankz/{game => local}/LocalGame.hx | 6 ++-- .../{control => network}/NetworkControl.hx | 3 +- .../NetworkControlFactory.hx | 8 +++++- .../m/tankz/{game => network}/NetworkGame.hx | 4 +-- .../haxe/ru/m/tankz/network/NetworkManager.hx | 4 +-- ...ultiplayerStorage.hx => NetworkStorage.hx} | 4 +-- src/client/haxe/ru/m/tankz/view/LevelFrame.hx | 2 +- .../haxe/ru/m/tankz/view/network/RoomFrame.hx | 2 +- src/common/haxe/ru/m/tankz/game/Game.hx | 28 +++++++++++++++---- src/common/haxe/ru/m/tankz/game/GameRunner.hx | 21 ++------------ src/common/haxe/ru/m/tankz/game/Player.hx | 17 +---------- 15 files changed, 67 insertions(+), 59 deletions(-) rename src/client/haxe/ru/m/tankz/{control => local}/LocalControlFactory.hx (58%) rename src/client/haxe/ru/m/tankz/{game => local}/LocalGame.hx (84%) rename src/client/haxe/ru/m/tankz/{control => network}/NetworkControl.hx (82%) rename src/client/haxe/ru/m/tankz/{control => network}/NetworkControlFactory.hx (50%) rename src/client/haxe/ru/m/tankz/{game => network}/NetworkGame.hx (95%) rename src/client/haxe/ru/m/tankz/storage/{MultiplayerStorage.hx => NetworkStorage.hx} (80%) diff --git a/src/client/haxe/ru/m/tankz/Init.hx b/src/client/haxe/ru/m/tankz/Init.hx index 5edc81a..de745a7 100644 --- a/src/client/haxe/ru/m/tankz/Init.hx +++ b/src/client/haxe/ru/m/tankz/Init.hx @@ -15,7 +15,7 @@ import ru.m.tankz.proto.pack.Request; import ru.m.tankz.proto.pack.Response; import ru.m.tankz.sound.SoundManager; import ru.m.tankz.storage.GameStorage; -import ru.m.tankz.storage.MultiplayerStorage; +import ru.m.tankz.storage.NetworkStorage; import ru.m.tankz.storage.RecordStorage; import ru.m.tankz.storage.SettingsStorage; @@ -25,7 +25,7 @@ class Init { @:provide static var levelBundle:ILevelBundle; @:provide static var configBundle:IConfigBundle; @:provide static var settingsStorage:SettingsStorage; - @:provide static var multiplayerStorage:MultiplayerStorage; + @:provide static var multiplayerStorage:NetworkStorage; @:provide static var gameStorage:GameStorage; @:provide static var recordStorage:RecordStorage; @:provide static var soundManager:SoundManager; @@ -51,7 +51,7 @@ class Init { levelBundle = new LevelBundle(); configBundle = new ConfigBundle(); settingsStorage = new SettingsStorage(); - multiplayerStorage = new MultiplayerStorage(); + multiplayerStorage = new NetworkStorage(); gameStorage = new GameStorage(); recordStorage = new RecordStorage(); soundManager = new SoundManager(); diff --git a/src/client/haxe/ru/m/tankz/control/ActionConfig.hx b/src/client/haxe/ru/m/tankz/control/ActionConfig.hx index e0d6ccf..ec96bd1 100644 --- a/src/client/haxe/ru/m/tankz/control/ActionConfig.hx +++ b/src/client/haxe/ru/m/tankz/control/ActionConfig.hx @@ -18,7 +18,7 @@ class ActionConfig { } public function asKeyBinding():KeyBinding { - var result = new Map(); + var result = new KeyBinding(); for (item in data) { result[item.key] = item.action; } diff --git a/src/client/haxe/ru/m/tankz/control/HumanControl.hx b/src/client/haxe/ru/m/tankz/control/HumanControl.hx index 568d2bf..3645d31 100644 --- a/src/client/haxe/ru/m/tankz/control/HumanControl.hx +++ b/src/client/haxe/ru/m/tankz/control/HumanControl.hx @@ -3,7 +3,6 @@ package ru.m.tankz.control; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.Lib; -import flash.ui.Keyboard; import haxe.Timer; import ru.m.tankz.control.ActionConfig; import ru.m.tankz.control.Control; @@ -21,10 +20,19 @@ class HumanControl extends Control { public function new(playerId:PlayerId, controlIndex:Int) { super(playerId); this.keyBinding = storage.getActionConfig(controlIndex).asKeyBinding(); - moveQueue = new Array(); + moveQueue = []; + } + + override public function start():Void { + super.start(); Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); - //Lib.current.stage.addEventListener(FocusEvent.FOCUS_OUT, onFocusOut); + } + + override public function stop():Void { + super.stop(); + Lib.current.stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); + Lib.current.stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp); } private function onKeyDown(event:KeyboardEvent):Void { diff --git a/src/client/haxe/ru/m/tankz/control/LocalControlFactory.hx b/src/client/haxe/ru/m/tankz/local/LocalControlFactory.hx similarity index 58% rename from src/client/haxe/ru/m/tankz/control/LocalControlFactory.hx rename to src/client/haxe/ru/m/tankz/local/LocalControlFactory.hx index 1d1377f..e859632 100644 --- a/src/client/haxe/ru/m/tankz/control/LocalControlFactory.hx +++ b/src/client/haxe/ru/m/tankz/local/LocalControlFactory.hx @@ -1,5 +1,8 @@ -package ru.m.tankz.control; +package ru.m.tankz.local; +import ru.m.tankz.control.BaseControlFactory; +import ru.m.tankz.control.Control; +import ru.m.tankz.control.HumanControl; import ru.m.tankz.Type; class LocalControlFactory extends BaseControlFactory { diff --git a/src/client/haxe/ru/m/tankz/game/LocalGame.hx b/src/client/haxe/ru/m/tankz/local/LocalGame.hx similarity index 84% rename from src/client/haxe/ru/m/tankz/game/LocalGame.hx rename to src/client/haxe/ru/m/tankz/local/LocalGame.hx index 07303be..2895233 100644 --- a/src/client/haxe/ru/m/tankz/game/LocalGame.hx +++ b/src/client/haxe/ru/m/tankz/local/LocalGame.hx @@ -1,7 +1,9 @@ -package ru.m.tankz.game; +package ru.m.tankz.local; -import ru.m.tankz.control.LocalControlFactory; +import ru.m.tankz.local.LocalControlFactory; import ru.m.tankz.game.GameEvent; +import ru.m.tankz.game.GameRunner; +import ru.m.tankz.game.GameState; import ru.m.tankz.game.record.GameRecorder; import ru.m.tankz.storage.RecordStorage; diff --git a/src/client/haxe/ru/m/tankz/control/NetworkControl.hx b/src/client/haxe/ru/m/tankz/network/NetworkControl.hx similarity index 82% rename from src/client/haxe/ru/m/tankz/control/NetworkControl.hx rename to src/client/haxe/ru/m/tankz/network/NetworkControl.hx index 82e0fe6..70c98e3 100644 --- a/src/client/haxe/ru/m/tankz/control/NetworkControl.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkControl.hx @@ -1,5 +1,6 @@ -package ru.m.tankz.control; +package ru.m.tankz.network; +import ru.m.tankz.control.HumanControl; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.control.Control; diff --git a/src/client/haxe/ru/m/tankz/control/NetworkControlFactory.hx b/src/client/haxe/ru/m/tankz/network/NetworkControlFactory.hx similarity index 50% rename from src/client/haxe/ru/m/tankz/control/NetworkControlFactory.hx rename to src/client/haxe/ru/m/tankz/network/NetworkControlFactory.hx index 9c6a7a5..12034fb 100644 --- a/src/client/haxe/ru/m/tankz/control/NetworkControlFactory.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkControlFactory.hx @@ -1,5 +1,7 @@ -package ru.m.tankz.control; +package ru.m.tankz.network; +import ru.m.tankz.control.BaseControlFactory; +import ru.m.tankz.control.Control; import ru.m.tankz.Type; class NetworkControlFactory extends BaseControlFactory { @@ -7,4 +9,8 @@ class NetworkControlFactory extends BaseControlFactory { override private function buildHuman(id:PlayerId, index:Int):Control { return new NetworkControl(id, index); } + + override private function buildBot(id:PlayerId, type:String):Control { + return null; + } } diff --git a/src/client/haxe/ru/m/tankz/game/NetworkGame.hx b/src/client/haxe/ru/m/tankz/network/NetworkGame.hx similarity index 95% rename from src/client/haxe/ru/m/tankz/game/NetworkGame.hx rename to src/client/haxe/ru/m/tankz/network/NetworkGame.hx index 87a5a10..e6f34f7 100644 --- a/src/client/haxe/ru/m/tankz/game/NetworkGame.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkGame.hx @@ -1,10 +1,10 @@ -package ru.m.tankz.game; +package ru.m.tankz.network; import haxe.Unserializer; -import ru.m.tankz.control.NetworkControlFactory; import ru.m.tankz.game.Game; import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameState; +import ru.m.tankz.network.NetworkControlFactory; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.proto.pack.GameEventResponse; import ru.m.tankz.proto.room.RoomSlotProto; diff --git a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx index e926c73..13ae471 100644 --- a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx @@ -21,7 +21,7 @@ import ru.m.tankz.proto.room.RoomListRequest; import ru.m.tankz.proto.room.RoomProto; import ru.m.tankz.proto.room.RoomRequest; import ru.m.tankz.proto.room.StartRequest; -import ru.m.tankz.storage.MultiplayerStorage; +import ru.m.tankz.storage.NetworkStorage; typedef ClientConnection = IConnection; @@ -46,7 +46,7 @@ class NetworkManager { public var gameEventSignal:Signal; @:provide private var connection:ClientConnection; - @:provide private var storage:MultiplayerStorage; + @:provide private var storage:NetworkStorage; private var reconnectTimer:Timer; private var reconnectDelay:Int; diff --git a/src/client/haxe/ru/m/tankz/storage/MultiplayerStorage.hx b/src/client/haxe/ru/m/tankz/storage/NetworkStorage.hx similarity index 80% rename from src/client/haxe/ru/m/tankz/storage/MultiplayerStorage.hx rename to src/client/haxe/ru/m/tankz/storage/NetworkStorage.hx index 5fb7860..cdd2016 100644 --- a/src/client/haxe/ru/m/tankz/storage/MultiplayerStorage.hx +++ b/src/client/haxe/ru/m/tankz/storage/NetworkStorage.hx @@ -2,12 +2,12 @@ package ru.m.tankz.storage; import haxework.storage.SharedObjectStorage; -class MultiplayerStorage extends SharedObjectStorage { +class NetworkStorage extends SharedObjectStorage { public var user(get, set):User; public function new() { - super("multiplayer"); + super("network"); } private inline function get_user():User { diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx index cfbb039..dbc02fc 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx @@ -9,7 +9,7 @@ import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.config.Config; import ru.m.tankz.game.GameState; import ru.m.tankz.game.IGame; -import ru.m.tankz.game.LocalGame; +import ru.m.tankz.local.LocalGame; import ru.m.tankz.storage.GameStorage; import ru.m.tankz.Type; import ru.m.tankz.view.popup.LevelPopup; diff --git a/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx b/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx index 2a7e57c..0ffce24 100644 --- a/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx @@ -6,7 +6,7 @@ import haxework.view.list.VListView; import haxework.view.TextView; import haxework.view.VGroupView; import ru.m.tankz.game.IGame; -import ru.m.tankz.game.NetworkGame; +import ru.m.tankz.network.NetworkGame; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.proto.room.RoomProto; import ru.m.tankz.proto.room.RoomSlotProto; diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index cc95aa9..2d18b8b 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -4,6 +4,7 @@ import ru.m.geom.Point; import ru.m.geom.Position; import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.config.Config; +import ru.m.tankz.control.Control; import ru.m.tankz.control.Controller; import ru.m.tankz.control.IControlFactory; import ru.m.tankz.control.NoneControlFactory; @@ -28,6 +29,8 @@ import ru.m.tankz.Type; public var controlFactory(default, null):IControlFactory; public var pause(default, set):Bool; + private var controls:Map; + @:provide var configBundle:IConfigBundle; public function new(state:GameState) { @@ -37,6 +40,7 @@ import ru.m.tankz.Type; this.config = configBundle.get(type); this.controlFactory = new NoneControlFactory(); this.pause = false; + this.controls = new Map(); connect(this); } @@ -76,9 +80,19 @@ import ru.m.tankz.Type; var team = getTeam(teamId); team.eagleId = id; case SPAWN(TANK(id, rect, playerId, info)): - var player = getPlayer(playerId); - player.tankId = id; - player.state.tank = info.type; + if (controls.exists(playerId)) { + var control = controls[playerId]; + control.tankId = id; + control.start(); + } + case DESTROY(TANK(id, shot)): + for (control in controls) { + if (control.tankId == id) { + control.stop(); + control.tankId = -1; + break; + } + } case _: } } @@ -104,8 +118,8 @@ import ru.m.tankz.Type; var controlType:Controller = AController.fromString(playerControl != null ? playerControl.control : player.config.control); var control = controlFactory.build(player.id, controlType); if (control != null) { - player.control = control; - player.control.bind(this, engine); + controls[player.id] = control; + control.bind(this, engine); } else { // ToDo: remove player player.state.life = 0; @@ -115,6 +129,10 @@ import ru.m.tankz.Type; } public function dispose():Void { + for (control in controls) { + control.dispose(); + } + controls = new Map(); gameEventSignal.dispose(); } } diff --git a/src/common/haxe/ru/m/tankz/game/GameRunner.hx b/src/common/haxe/ru/m/tankz/game/GameRunner.hx index 747b012..27029c8 100644 --- a/src/common/haxe/ru/m/tankz/game/GameRunner.hx +++ b/src/common/haxe/ru/m/tankz/game/GameRunner.hx @@ -130,14 +130,6 @@ class GameRunner extends Game implements EngineListener { } private function complete(winner:TeamId):Void { - for (team in teams.iterator()) { - for (player in team.players) { - if (player.control != null) { - player.control.action(STOP); - player.control.dispose(); - } - } - } Timer.delay(function() { gameEventSignal.emit(COMPLETE(state, winner)); }, 3000); @@ -165,8 +157,9 @@ class GameRunner extends Game implements EngineListener { public function onCollision(entity:EntityType, with:EntityType):Void { switch entity { case EntityType.TANK(tank): - var control = getPlayer(tank.playerId).control; - if (control != null) control.onCollision(with); + if (controls.exists(tank.playerId)) { + controls[tank.playerId].onCollision(with); + } case _: } switch [entity, with] { @@ -352,11 +345,6 @@ class GameRunner extends Game implements EngineListener { case ACTION(tankId, STOP): gameEventSignal.emit(STOP(TANK(tankId))); engine.stop(tankId); - case SPAWN(TANK(_, _, playerId, _)): - var control = getPlayer(playerId).control; - if (control != null) { - control.start(); - } case SPAWN(BULLET(_, _, playerId, _)): getPlayer(playerId).bullets++; case DESTROY(EAGLE(id, shot)): @@ -371,9 +359,6 @@ class GameRunner extends Game implements EngineListener { var tank:Tank = engine.getEntity(id); var team = getTeam(tank.playerId.team); var player = getPlayer(tank.playerId); - if (player.control != null) { - player.control.stop(); - } player.tankId = -1; team.onDestroy(player.id); if (player.state.life > 0) { diff --git a/src/common/haxe/ru/m/tankz/game/Player.hx b/src/common/haxe/ru/m/tankz/game/Player.hx index 3ace588..7ba8616 100644 --- a/src/common/haxe/ru/m/tankz/game/Player.hx +++ b/src/common/haxe/ru/m/tankz/game/Player.hx @@ -1,15 +1,13 @@ package ru.m.tankz.game; -import ru.m.tankz.game.GameState; import ru.m.tankz.config.Config; -import ru.m.tankz.control.Control; +import ru.m.tankz.game.GameState; import ru.m.tankz.Type; class Player { public var config(default, null):PlayerConfig; public var id(default, null):PlayerId; public var tankId(default, set):Int; - public var control(default, set):Control; public var isAlive(get, null):Bool; public var state(default, default):PlayerState; public var bullets(default, default):Int; @@ -17,7 +15,6 @@ class Player { public function new(teamId:TeamId, config:PlayerConfig, state:PlayerState = null) { this.config = config; this.id = new PlayerId(teamId, config.index); - this.control = null; this.state = state == null ? new PlayerState(id) : state; this.state.reset(); this.state.life = Math.isNaN(config.life) ? 0 : config.life; @@ -27,21 +24,9 @@ class Player { private function set_tankId(value:Int):Int { tankId = value; - if (control != null) { - control.tankId = tankId; - } return tankId; } - private function set_control(value:Control):Control { - if (control != null) control.dispose(); - control = value; - if (control != null) { - control.tankId = tankId; - } - return control; - } - private function get_isAlive():Bool { return tankId > -1 || state.life > 0; }