Files
Leenkx_Examples/logic_gamepad/Sources/lnx/VirtualGamepad.hx
2026-05-06 17:52:45 -07:00

113 lines
3.0 KiB
Haxe

package lnx;
import iron.Trait;
import iron.math.Vec2;
import iron.system.Input;
using kha.graphics2.GraphicsExtension;
@:access(iron.system.Gamepad)
class VirtualGamepad extends Trait {
@prop public var gamepad : Int = 0;
@prop public var radius : Int = 100;
@prop public var offset : Int = 45;
@prop public var sizeRatio : Float = 2.2;
public var colorA : kha.Color = 0xff888888;
public var colorB : kha.Color = 0xffcf2b43;
var leftPadX = 0;
var leftPadY = 0;
var rightPadX = 0;
var rightPadY = 0;
var leftStickX = 0;
var leftStickY = 0;
var rightStickX = 0;
var rightStickY = 0;
// var leftStickXLast = 0;
// var leftStickYLast = 0;
// var rightStickXLast = 0;
// var rightStickYLast = 0;
var leftLocked = false;
var rightLocked = false;
var gamepad_ : Gamepad;
public function new() {
super();
notifyOnInit(function() {
gamepad_ = Input.getGamepad( gamepad );
notifyOnUpdate(update);
notifyOnRender2D(render2D);
});
}
function update() {
var r = radius;
var o = offset;
leftPadX = r + o;
rightPadX = iron.App.w() - r - o;
leftPadY = rightPadY = iron.App.h() - r - o;
final mouse = Input.getMouse();
if (mouse.started() ) {
leftLocked = Vec2.distancef(mouse.x, mouse.y, leftPadX, leftPadY) <= r;
} else if (mouse.released()) {
leftLocked = false;
}
if (leftLocked) {
leftStickX = Std.int(mouse.x - leftPadX);
leftStickY = Std.int(mouse.y - leftPadY);
if (Math.sqrt(leftStickX * leftStickX + leftStickY * leftStickY) > r) {
leftStickX = Std.int(r * (leftStickX / Math.sqrt(leftStickX * leftStickX + leftStickY * leftStickY)));
leftStickY = Std.int(r * (leftStickY / Math.sqrt(leftStickX * leftStickX + leftStickY * leftStickY)));
}
} else {
leftStickX = leftStickY = 0;
}
if (mouse.started() ) {
rightLocked = Vec2.distancef(mouse.x, mouse.y, rightPadX, rightPadY) <= r;
} else if (mouse.released()) {
rightLocked = false;
}
if (rightLocked) {
rightStickX = Std.int(mouse.x - rightPadX);
rightStickY = Std.int(mouse.y - rightPadY);
if (Math.sqrt(rightStickX * rightStickX + rightStickY * rightStickY) > r) {
rightStickX = Std.int(r * (rightStickX / Math.sqrt(rightStickX * rightStickX + rightStickY * rightStickY)));
rightStickY = Std.int(r * (rightStickY / Math.sqrt(rightStickX * rightStickX + rightStickY * rightStickY)));
}
}
else {
rightStickX = rightStickY = 0;
}
gamepad_.axisListener(0, leftStickX / r);
gamepad_.axisListener(1, leftStickY / r);
gamepad_.axisListener(2, rightStickY / r);
gamepad_.axisListener(3, rightStickX / r);
// leftStickXLast = leftStickX;
// leftStickYLast = leftStickY;
// rightStickXLast = rightStickX;
// rightStickYLast = rightStickY;
}
function render2D(g: kha.graphics2.Graphics) {
var r = radius;
var r2 = Std.int(r / sizeRatio);
g.color = colorA;
g.fillCircle(leftPadX, leftPadY, r);
g.fillCircle(rightPadX, rightPadY, r);
g.color = colorB;
g.fillCircle(leftPadX + leftStickX, leftPadY + leftStickY, r2);
g.fillCircle(rightPadX + rightStickX, rightPadY + rightStickY, r2);
}
}