[client] use touch events in GamepadView

This commit is contained in:
2019-06-17 20:43:14 +03:00
parent 2b3f368e0f
commit f999c66fea
2 changed files with 42 additions and 21 deletions

View File

@@ -1,5 +1,7 @@
package ru.m.tankz;
import lime.ui.Joystick;
import lime.ui.Gamepad;
import haxework.animate.FadeAnimate;
import haxework.animate.UnFadeAnimate;
import haxework.resources.IResources;
@@ -62,5 +64,19 @@ class Init {
connection = buildConnection();
networkManager = new NetworkManager();
for (device in Gamepad.devices) {
trace('gamepad', device);
}
Gamepad.onConnect.add(function(device) {
trace('connect gamepad', device);
});
for (device in Joystick.devices) {
trace('joystick', device);
}
Joystick.onConnect.add(function(device) {
trace('connect joystick', device);
});
}
}

View File

@@ -1,7 +1,7 @@
package ru.m.tankz.view;
import flash.display.Graphics;
import flash.events.MouseEvent;
import flash.events.TouchEvent;
import haxework.signal.Signal;
import haxework.view.skin.ISkin;
import haxework.view.SpriteView;
@@ -49,51 +49,56 @@ class GamepadView extends SpriteView {
public var actionSignal(default, null):Signal2<GamepadAction, Bool>;
public var areas(default, null):Array<ActionArea>;
public var currentArea(default, null):ActionArea;
public var currentAreas(default, null):Map<Int, ActionArea>;
public function new() {
super();
areas = [];
currentAreas = new Map();
actionSignal = new Signal2();
skin = [new GamepadSkin(0x00ff00)];
content.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
content.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
}
private function onMouseDown(event:MouseEvent):Void {
onMouseMove(event);
content.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
content.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
private function onTouchBegin(event:TouchEvent):Void {
onTouchMove(event);
content.stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
content.stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
}
private function onMouseMove(event:MouseEvent):Void {
private function onTouchMove(event:TouchEvent):Void {
var point = new Point(event.localX, event.localY);
if (currentArea != null) {
if (!currentArea.rect.contain(point)) {
actionSignal.emit(currentArea.action, false);
currentArea = null;
if (currentAreas.exists(event.touchPointID)) {
var area = currentAreas[event.touchPointID];
if (!area.rect.contain(point)) {
currentAreas.remove(event.touchPointID);
actionSignal.emit(area.action, false);
}
}
for (area in areas) {
if (area.rect.contain(point)) {
currentArea = area;
actionSignal.emit(currentArea.action, true);
currentAreas[event.touchPointID] = area;
actionSignal.emit(area.action, true);
break;
}
}
}
private function onMouseUp(event:MouseEvent):Void {
content.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
content.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
if (currentArea != null) {
actionSignal.emit(currentArea.action, false);
currentArea = null;
private function onTouchEnd(event:TouchEvent):Void {
if (currentAreas.exists(event.touchPointID)) {
actionSignal.emit(currentAreas[event.touchPointID].action, false);
currentAreas.remove(event.touchPointID);
}
if (Lambda.count(currentAreas) == 0) {
content.stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
content.stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd);
}
}
override public function update():Void {
super.update();
areas = [];
var size = Math.min(width, height) / 8;
var size = Math.min(width, height) / 7;
var padding = size / 2;
areas.push({
action: GamepadAction.UP,