[client] add JoystickDevice
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
62
src/client/haxe/ru/m/control/JoystickDevice.hx
Normal file
62
src/client/haxe/ru/m/control/JoystickDevice.hx
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user