[client] fix control

This commit is contained in:
2019-06-06 17:38:37 +03:00
parent abd1b834d7
commit dbf30decae
15 changed files with 67 additions and 59 deletions

View File

@@ -15,7 +15,7 @@ import ru.m.tankz.proto.pack.Request;
import ru.m.tankz.proto.pack.Response; import ru.m.tankz.proto.pack.Response;
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.MultiplayerStorage; import ru.m.tankz.storage.NetworkStorage;
import ru.m.tankz.storage.RecordStorage; import ru.m.tankz.storage.RecordStorage;
import ru.m.tankz.storage.SettingsStorage; import ru.m.tankz.storage.SettingsStorage;
@@ -25,7 +25,7 @@ class Init {
@:provide static var levelBundle:ILevelBundle; @:provide static var levelBundle:ILevelBundle;
@:provide static var configBundle:IConfigBundle; @:provide static var configBundle:IConfigBundle;
@:provide static var settingsStorage:SettingsStorage; @:provide static var settingsStorage:SettingsStorage;
@:provide static var multiplayerStorage:MultiplayerStorage; @:provide static var multiplayerStorage:NetworkStorage;
@:provide static var gameStorage:GameStorage; @:provide static var gameStorage:GameStorage;
@:provide static var recordStorage:RecordStorage; @:provide static var recordStorage:RecordStorage;
@:provide static var soundManager:SoundManager; @:provide static var soundManager:SoundManager;
@@ -51,7 +51,7 @@ class Init {
levelBundle = new LevelBundle(); levelBundle = new LevelBundle();
configBundle = new ConfigBundle(); configBundle = new ConfigBundle();
settingsStorage = new SettingsStorage(); settingsStorage = new SettingsStorage();
multiplayerStorage = new MultiplayerStorage(); multiplayerStorage = new NetworkStorage();
gameStorage = new GameStorage(); gameStorage = new GameStorage();
recordStorage = new RecordStorage(); recordStorage = new RecordStorage();
soundManager = new SoundManager(); soundManager = new SoundManager();

View File

@@ -18,7 +18,7 @@ class ActionConfig {
} }
public function asKeyBinding():KeyBinding { public function asKeyBinding():KeyBinding {
var result = new Map<Int, TankAction>(); var result = new KeyBinding();
for (item in data) { for (item in data) {
result[item.key] = item.action; result[item.key] = item.action;
} }

View File

@@ -3,7 +3,6 @@ package ru.m.tankz.control;
import flash.events.FocusEvent; import flash.events.FocusEvent;
import flash.events.KeyboardEvent; import flash.events.KeyboardEvent;
import flash.Lib; import flash.Lib;
import flash.ui.Keyboard;
import haxe.Timer; import haxe.Timer;
import ru.m.tankz.control.ActionConfig; import ru.m.tankz.control.ActionConfig;
import ru.m.tankz.control.Control; import ru.m.tankz.control.Control;
@@ -21,10 +20,19 @@ class HumanControl extends Control {
public function new(playerId:PlayerId, controlIndex:Int) { public function new(playerId:PlayerId, controlIndex:Int) {
super(playerId); super(playerId);
this.keyBinding = storage.getActionConfig(controlIndex).asKeyBinding(); this.keyBinding = storage.getActionConfig(controlIndex).asKeyBinding();
moveQueue = new Array<Int>(); moveQueue = [];
}
override public function start():Void {
super.start();
Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 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 { private function onKeyDown(event:KeyboardEvent):Void {

View File

@@ -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; import ru.m.tankz.Type;
class LocalControlFactory extends BaseControlFactory { class LocalControlFactory extends BaseControlFactory {

View File

@@ -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.GameEvent;
import ru.m.tankz.game.GameRunner;
import ru.m.tankz.game.GameState;
import ru.m.tankz.game.record.GameRecorder; import ru.m.tankz.game.record.GameRecorder;
import ru.m.tankz.storage.RecordStorage; import ru.m.tankz.storage.RecordStorage;

View File

@@ -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.network.NetworkManager;
import ru.m.tankz.control.Control; import ru.m.tankz.control.Control;

View File

@@ -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; import ru.m.tankz.Type;
class NetworkControlFactory extends BaseControlFactory { class NetworkControlFactory extends BaseControlFactory {
@@ -7,4 +9,8 @@ class NetworkControlFactory extends BaseControlFactory {
override private function buildHuman(id:PlayerId, index:Int):Control { override private function buildHuman(id:PlayerId, index:Int):Control {
return new NetworkControl(id, index); return new NetworkControl(id, index);
} }
override private function buildBot(id:PlayerId, type:String):Control {
return null;
}
} }

View File

@@ -1,10 +1,10 @@
package ru.m.tankz.game; package ru.m.tankz.network;
import haxe.Unserializer; import haxe.Unserializer;
import ru.m.tankz.control.NetworkControlFactory;
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.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkControlFactory;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.pack.GameEventResponse; import ru.m.tankz.proto.pack.GameEventResponse;
import ru.m.tankz.proto.room.RoomSlotProto; import ru.m.tankz.proto.room.RoomSlotProto;

View File

@@ -21,7 +21,7 @@ import ru.m.tankz.proto.room.RoomListRequest;
import ru.m.tankz.proto.room.RoomProto; import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.proto.room.RoomRequest; import ru.m.tankz.proto.room.RoomRequest;
import ru.m.tankz.proto.room.StartRequest; import ru.m.tankz.proto.room.StartRequest;
import ru.m.tankz.storage.MultiplayerStorage; import ru.m.tankz.storage.NetworkStorage;
typedef ClientConnection = IConnection<Request, Response>; typedef ClientConnection = IConnection<Request, Response>;
@@ -46,7 +46,7 @@ class NetworkManager {
public var gameEventSignal:Signal<GameEventResponse>; public var gameEventSignal:Signal<GameEventResponse>;
@:provide private var connection:ClientConnection; @:provide private var connection:ClientConnection;
@:provide private var storage:MultiplayerStorage; @:provide private var storage:NetworkStorage;
private var reconnectTimer:Timer; private var reconnectTimer:Timer;
private var reconnectDelay:Int; private var reconnectDelay:Int;

View File

@@ -2,12 +2,12 @@ package ru.m.tankz.storage;
import haxework.storage.SharedObjectStorage; import haxework.storage.SharedObjectStorage;
class MultiplayerStorage extends SharedObjectStorage { class NetworkStorage extends SharedObjectStorage {
public var user(get, set):User; public var user(get, set):User;
public function new() { public function new() {
super("multiplayer"); super("network");
} }
private inline function get_user():User { private inline function get_user():User {

View File

@@ -9,7 +9,7 @@ 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.game.IGame; 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.storage.GameStorage;
import ru.m.tankz.Type; import ru.m.tankz.Type;
import ru.m.tankz.view.popup.LevelPopup; import ru.m.tankz.view.popup.LevelPopup;

View File

@@ -6,7 +6,7 @@ import haxework.view.list.VListView;
import haxework.view.TextView; import haxework.view.TextView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.IGame; 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.network.NetworkManager;
import ru.m.tankz.proto.room.RoomProto; import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.proto.room.RoomSlotProto; import ru.m.tankz.proto.room.RoomSlotProto;

View File

@@ -4,6 +4,7 @@ import ru.m.geom.Point;
import ru.m.geom.Position; import ru.m.geom.Position;
import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.control.Control;
import ru.m.tankz.control.Controller; import ru.m.tankz.control.Controller;
import ru.m.tankz.control.IControlFactory; import ru.m.tankz.control.IControlFactory;
import ru.m.tankz.control.NoneControlFactory; import ru.m.tankz.control.NoneControlFactory;
@@ -28,6 +29,8 @@ import ru.m.tankz.Type;
public var controlFactory(default, null):IControlFactory; public var controlFactory(default, null):IControlFactory;
public var pause(default, set):Bool; public var pause(default, set):Bool;
private var controls:Map<String, Control>;
@:provide var configBundle:IConfigBundle; @:provide var configBundle:IConfigBundle;
public function new(state:GameState) { public function new(state:GameState) {
@@ -37,6 +40,7 @@ import ru.m.tankz.Type;
this.config = configBundle.get(type); this.config = configBundle.get(type);
this.controlFactory = new NoneControlFactory(); this.controlFactory = new NoneControlFactory();
this.pause = false; this.pause = false;
this.controls = new Map();
connect(this); connect(this);
} }
@@ -76,9 +80,19 @@ import ru.m.tankz.Type;
var team = getTeam(teamId); var team = getTeam(teamId);
team.eagleId = id; team.eagleId = id;
case SPAWN(TANK(id, rect, playerId, info)): case SPAWN(TANK(id, rect, playerId, info)):
var player = getPlayer(playerId); if (controls.exists(playerId)) {
player.tankId = id; var control = controls[playerId];
player.state.tank = info.type; 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 _: case _:
} }
} }
@@ -104,8 +118,8 @@ import ru.m.tankz.Type;
var controlType:Controller = AController.fromString(playerControl != null ? playerControl.control : player.config.control); var controlType:Controller = AController.fromString(playerControl != null ? playerControl.control : player.config.control);
var control = controlFactory.build(player.id, controlType); var control = controlFactory.build(player.id, controlType);
if (control != null) { if (control != null) {
player.control = control; controls[player.id] = control;
player.control.bind(this, engine); control.bind(this, engine);
} else { } else {
// ToDo: remove player // ToDo: remove player
player.state.life = 0; player.state.life = 0;
@@ -115,6 +129,10 @@ import ru.m.tankz.Type;
} }
public function dispose():Void { public function dispose():Void {
for (control in controls) {
control.dispose();
}
controls = new Map();
gameEventSignal.dispose(); gameEventSignal.dispose();
} }
} }

View File

@@ -130,14 +130,6 @@ class GameRunner extends Game implements EngineListener {
} }
private function complete(winner:TeamId):Void { 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() { Timer.delay(function() {
gameEventSignal.emit(COMPLETE(state, winner)); gameEventSignal.emit(COMPLETE(state, winner));
}, 3000); }, 3000);
@@ -165,8 +157,9 @@ class GameRunner extends Game implements EngineListener {
public function onCollision(entity:EntityType, with:EntityType):Void { public function onCollision(entity:EntityType, with:EntityType):Void {
switch entity { switch entity {
case EntityType.TANK(tank): case EntityType.TANK(tank):
var control = getPlayer(tank.playerId).control; if (controls.exists(tank.playerId)) {
if (control != null) control.onCollision(with); controls[tank.playerId].onCollision(with);
}
case _: case _:
} }
switch [entity, with] { switch [entity, with] {
@@ -352,11 +345,6 @@ class GameRunner extends Game implements EngineListener {
case ACTION(tankId, STOP): case ACTION(tankId, STOP):
gameEventSignal.emit(STOP(TANK(tankId))); gameEventSignal.emit(STOP(TANK(tankId)));
engine.stop(tankId); engine.stop(tankId);
case SPAWN(TANK(_, _, playerId, _)):
var control = getPlayer(playerId).control;
if (control != null) {
control.start();
}
case SPAWN(BULLET(_, _, playerId, _)): case SPAWN(BULLET(_, _, playerId, _)):
getPlayer(playerId).bullets++; getPlayer(playerId).bullets++;
case DESTROY(EAGLE(id, shot)): case DESTROY(EAGLE(id, shot)):
@@ -371,9 +359,6 @@ class GameRunner extends Game implements EngineListener {
var tank:Tank = engine.getEntity(id); var tank:Tank = engine.getEntity(id);
var team = getTeam(tank.playerId.team); var team = getTeam(tank.playerId.team);
var player = getPlayer(tank.playerId); var player = getPlayer(tank.playerId);
if (player.control != null) {
player.control.stop();
}
player.tankId = -1; player.tankId = -1;
team.onDestroy(player.id); team.onDestroy(player.id);
if (player.state.life > 0) { if (player.state.life > 0) {

View File

@@ -1,15 +1,13 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.game.GameState;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.control.Control; import ru.m.tankz.game.GameState;
import ru.m.tankz.Type; import ru.m.tankz.Type;
class Player { class Player {
public var config(default, null):PlayerConfig; public var config(default, null):PlayerConfig;
public var id(default, null):PlayerId; public var id(default, null):PlayerId;
public var tankId(default, set):Int; public var tankId(default, set):Int;
public var control(default, set):Control;
public var isAlive(get, null):Bool; public var isAlive(get, null):Bool;
public var state(default, default):PlayerState; public var state(default, default):PlayerState;
public var bullets(default, default):Int; public var bullets(default, default):Int;
@@ -17,7 +15,6 @@ class Player {
public function new(teamId:TeamId, config:PlayerConfig, state:PlayerState = null) { public function new(teamId:TeamId, config:PlayerConfig, state:PlayerState = null) {
this.config = config; this.config = config;
this.id = new PlayerId(teamId, config.index); this.id = new PlayerId(teamId, config.index);
this.control = null;
this.state = state == null ? new PlayerState(id) : state; this.state = state == null ? new PlayerState(id) : state;
this.state.reset(); this.state.reset();
this.state.life = Math.isNaN(config.life) ? 0 : config.life; this.state.life = Math.isNaN(config.life) ? 0 : config.life;
@@ -27,21 +24,9 @@ class Player {
private function set_tankId(value:Int):Int { private function set_tankId(value:Int):Int {
tankId = value; tankId = value;
if (control != null) {
control.tankId = tankId;
}
return 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 { private function get_isAlive():Bool {
return tankId > -1 || state.life > 0; return tankId > -1 || state.life > 0;
} }