[client] add JoystickDevice

This commit is contained in:
2019-06-18 20:47:04 +03:00
parent 282bc68734
commit 73822dc95a
7 changed files with 107 additions and 16 deletions

View File

@@ -1,30 +1,43 @@
package ru.m.control; package ru.m.control;
import ru.m.control.IControlBus;
import haxework.signal.Signal; import haxework.signal.Signal;
import ru.m.control.IControlBus;
class ControlBus implements IControlBus { class ControlBus implements IControlBus {
private static inline var TAG = "control";
public var devices(default, null):Array<IControlDevice>;
public var signal(default, null):Signal3<DeviceType, DeviceAction, Bool>; public var signal(default, null):Signal3<DeviceType, DeviceAction, Bool>;
public var devicesSignal(default, null):Signal<Array<IControlDevice>>;
private var connections:Map<DeviceType, DeviceAction->Bool->Void>; private var connections:Map<DeviceType, DeviceAction->Bool->Void>;
public function new() { public function new() {
devices = [];
signal = new Signal3(); signal = new Signal3();
devicesSignal = new Signal();
connections = new Map(); connections = new Map();
} }
public function connect(device:IControlDevice):Void { public function connect(device:IControlDevice):Void {
var connector = function(action:DeviceAction, on:Bool):Void { var connector = function(action:DeviceAction, on:Bool):Void {
//L.d("TAG", '${device.type}, ${action}, ${on}');
signal.emit(device.type, action, on); signal.emit(device.type, action, on);
} }
connections.set(device.type, connector); connections.set(device.type, connector);
device.signal.connect(connector); device.signal.connect(connector);
devices.push(device);
devicesSignal.emit(devices);
} }
public function disconnect(device:IControlDevice):Void { public function disconnect(device:IControlDevice):Void {
if (connections.exists(device.type)) { if (connections.exists(device.type)) {
device.signal.disconnect(connections.get(device.type)); device.signal.disconnect(connections.get(device.type));
connections.remove(device.type); connections.remove(device.type);
devices.remove(device);
devicesSignal.emit(devices);
} }
} }
} }

View File

@@ -3,7 +3,10 @@ package ru.m.control;
import haxework.signal.Signal; import haxework.signal.Signal;
interface IControlBus { interface IControlBus {
public var devices(default, null):Array<IControlDevice>;
public var signal(default, null):Signal3<DeviceType, DeviceAction, Bool>; public var signal(default, null):Signal3<DeviceType, DeviceAction, Bool>;
public var devicesSignal(default, null):Signal<Array<IControlDevice>>;
public function connect(device:IControlDevice):Void; public function connect(device:IControlDevice):Void;
public function disconnect(device:IControlDevice):Void; public function disconnect(device:IControlDevice):Void;

View File

@@ -0,0 +1,62 @@
package ru.m.control;
import haxework.signal.Signal;
import lime.ui.Joystick;
import ru.m.control.DeviceAction;
import ru.m.control.DeviceType;
import ru.m.geom.Direction;
class JoystickDevice implements IControlDevice {
public var type(default, null):DeviceType;
public var signal(default, null):Signal2<DeviceAction, Bool>;
private var joystick:Joystick;
private var axisState:Map<Int, Direction>;
public function new(joystick:Joystick) {
this.joystick = joystick;
type = GAMEPAD(joystick.id);
signal = new Signal2();
axisState = new Map();
joystick.onButtonDown.add(onButtonDown);
joystick.onButtonUp.add(onButtonUp);
joystick.onAxisMove.add(onAxisMove);
}
private function onButtonDown(code:Int):Void {
signal.emit(KEY(code), true);
}
private function onButtonUp(code:Int):Void {
signal.emit(KEY(code), false);
}
private function onAxisMove(axis:Int, position:Float):Void {
var direction:Direction = switch [axis, position] {
case [0, 1]: Direction.RIGHT;
case [0, -1]: Direction.LEFT;
case [1, 1]: Direction.BOTTOM;
case [1, -1]: Direction.TOP;
case _: null;
}
if (direction != null) {
axisState.set(axis, direction);
signal.emit(DIRECTION(direction), true);
} else if (position == 0) {
if (axisState.exists(axis)) {
signal.emit(DIRECTION(axisState.get(axis)), false);
axisState.remove(axis);
}
}
}
public function dispose():Void {
if (joystick != null) {
joystick.onButtonDown.remove(onButtonDown);
joystick.onButtonUp.remove(onButtonUp);
joystick.onAxisMove.remove(onAxisMove);
joystick = null;
}
}
}

View File

@@ -1,17 +1,18 @@
package ru.m.tankz; package ru.m.tankz;
import flash.Lib; import flash.Lib;
import ru.m.control.KeyboardDevice;
import ru.m.control.ControlBus;
import ru.m.control.IControlBus;
import lime.ui.Joystick;
import lime.ui.Gamepad;
import haxework.animate.FadeAnimate; import haxework.animate.FadeAnimate;
import haxework.animate.UnFadeAnimate; import haxework.animate.UnFadeAnimate;
import haxework.resources.IResources; import haxework.resources.IResources;
import haxework.resources.Resources; import haxework.resources.Resources;
import haxework.view.popup.PopupManager; import haxework.view.popup.PopupManager;
import lime.ui.Gamepad;
import lime.ui.Joystick;
import ru.m.connect.IConnection; import ru.m.connect.IConnection;
import ru.m.control.ControlBus;
import ru.m.control.IControlBus;
import ru.m.control.JoystickDevice;
import ru.m.control.KeyboardDevice;
import ru.m.tankz.bundle.ConfigBundle; import ru.m.tankz.bundle.ConfigBundle;
import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.bundle.ILevelBundle;
@@ -81,10 +82,10 @@ class Init {
}); });
for (device in Joystick.devices) { for (device in Joystick.devices) {
trace('joystick', device); bus.connect(new JoystickDevice(device));
} }
Joystick.onConnect.add(function(device) { Joystick.onConnect.add(function(device) {
trace('connect joystick', device); bus.connect(new JoystickDevice(device));
}); });
} }
} }

View File

@@ -24,7 +24,6 @@ class HumanControl extends Control {
public function new(playerId:PlayerId, controlIndex:Int) { public function new(playerId:PlayerId, controlIndex:Int) {
super(playerId); super(playerId);
config = storage.getActionConfig(controlIndex); config = storage.getActionConfig(controlIndex);
trace(controlIndex, config.device, config.binding);
moveQueue = []; moveQueue = [];
} }

View File

@@ -34,8 +34,13 @@ import ru.m.tankz.view.GamepadView;
@:provide var game:IGame; @:provide var game:IGame;
@:provide static var bus:IControlBus; @:provide static var bus:IControlBus;
public function init():Void {
bus.connect(gamepad);
}
public function onShow():Void { public function onShow():Void {
gamepad.visible = false; gamepad.visible = false;
// ToDo:
for (i in 0...1) { for (i in 0...1) {
switch settings.getActionConfig(i).device { switch settings.getActionConfig(i).device {
case GAMEPAD(GamepadView.ID): case GAMEPAD(GamepadView.ID):
@@ -44,7 +49,6 @@ import ru.m.tankz.view.GamepadView;
case _: case _:
} }
} }
bus.connect(gamepad);
gameView.type = game.type; gameView.type = game.type;
soundManager.config = game.config; soundManager.config = game.config;
gameView.render.config = game.config; gameView.render.config = game.config;
@@ -76,7 +80,6 @@ import ru.m.tankz.view.GamepadView;
} }
public function onHide():Void { public function onHide():Void {
bus.disconnect(gamepad);
stop(); stop();
soundManager.stopAll(); soundManager.stopAll();
} }

View File

@@ -1,14 +1,15 @@
package ru.m.tankz.view.settings; package ru.m.tankz.view.settings;
import haxe.EnumTools.EnumValueTools; import haxe.EnumTools.EnumValueTools;
import haxework.view.GroupView;
import haxework.view.ButtonGroup; import haxework.view.ButtonGroup;
import haxework.view.DataView; import haxework.view.DataView;
import haxework.view.GroupView;
import haxework.view.LabelView; import haxework.view.LabelView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import promhx.Promise; import promhx.Promise;
import ru.m.control.DeviceAction; import ru.m.control.DeviceAction;
import ru.m.control.DeviceType; import ru.m.control.DeviceType;
import ru.m.control.IControlBus;
import ru.m.tankz.control.ActionConfig; import ru.m.tankz.control.ActionConfig;
import ru.m.tankz.storage.SettingsStorage; import ru.m.tankz.storage.SettingsStorage;
import ru.m.tankz.view.settings.ActionView; import ru.m.tankz.view.settings.ActionView;
@@ -23,15 +24,24 @@ import ru.m.tankz.view.settings.ActionView;
@:view var device:ButtonGroup<DeviceType>; @:view var device:ButtonGroup<DeviceType>;
@:provide static var storage:SettingsStorage; @:provide static var storage:SettingsStorage;
@:provide static var bus:IControlBus;
private function set_controlIndex(value: Int): Int { public function init() {
this.controlIndex = value; bus.devicesSignal.connect(function(devices) refresh());
}
private function refresh():Void {
label.text = 'Player ${controlIndex+1}'; label.text = 'Player ${controlIndex+1}';
var config = storage.getActionConfig(controlIndex); var config = storage.getActionConfig(controlIndex);
list.data = bindingToArray(config.binding); list.data = bindingToArray(config.binding);
device.data = [KEYBOARD, GAMEPAD(GamepadView.ID)]; device.data = bus.devices.map(function(device) return device.type);
device.selected = config.device; device.selected = config.device;
panel.visible = list.visible = EnumValueTools.equals(config.device, KEYBOARD); panel.visible = list.visible = EnumValueTools.equals(config.device, KEYBOARD);
}
private function set_controlIndex(value: Int): Int {
this.controlIndex = value;
refresh();
return this.controlIndex; return this.controlIndex;
} }
@@ -42,7 +52,7 @@ import ru.m.tankz.view.settings.ActionView;
} }
panel.visible = list.visible = EnumValueTools.equals(config.device, KEYBOARD); panel.visible = list.visible = EnumValueTools.equals(config.device, KEYBOARD);
storage.setActionConffig(controlIndex, config); storage.setActionConffig(controlIndex, config);
controlIndex = controlIndex; refresh();
} }
private function viewFactory(index:Int, value:ActionItem) { private function viewFactory(index:Int, value:ActionItem) {