[client] fix control
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user