L3R3 button visual effect for onScreen touchPad

This commit is contained in:
TrueZhuangjia committed 2025-01-25 22:04:07 +08:00
1 parent 8d0b646fbe
commit 422c34f945
3 files changed
+111 -25

No files matched your search

+93 -7
View File
@@ -37,7 +37,10 @@ import UIKit
@objc public var offSetX: CGFloat @objc public var offSetX: CGFloat
@objc public var offSetY: CGFloat @objc public var offSetY: CGFloat
private var quickDoubleTapDetected: Bool
private var touchTapTimeInterval: TimeInterval
private var touchTapTimeStamp: TimeInterval
private let QUICK_TAP_TIME_INTERVAL = 0.2
private var onScreenControls: OnScreenControls private var onScreenControls: OnScreenControls
private let label: UILabel private let label: UILabel
@@ -49,6 +52,7 @@ import UIKit
private let moonlightPurple: CGColor = UIColor(red: 0.5, green: 0.5, blue: 1.0, alpha: 0.86).cgColor private let moonlightPurple: CGColor = UIColor(red: 0.5, green: 0.5, blue: 1.0, alpha: 0.86).cgColor
private let crossMarkColor: CGColor = UIColor(white: 1, alpha: 0.7).cgColor private let crossMarkColor: CGColor = UIColor(white: 1, alpha: 0.7).cgColor
private let stickBallColor: CGColor = UIColor(white: 1, alpha: 0.75).cgColor private let stickBallColor: CGColor = UIColor(white: 1, alpha: 0.75).cgColor
private var stickInputScale: CGFloat = 30
private let borderLayer = CAShapeLayer() private let borderLayer = CAShapeLayer()
@@ -57,6 +61,7 @@ import UIKit
private var leftIndicator = CAShapeLayer() private var leftIndicator = CAShapeLayer()
private var rightIndicator = CAShapeLayer() private var rightIndicator = CAShapeLayer()
private var l3r3Indicator = CAShapeLayer()
private var crossMarkLayer = CAShapeLayer() private var crossMarkLayer = CAShapeLayer()
private var stickBallLayer = CAShapeLayer() private var stickBallLayer = CAShapeLayer()
private var lrudIndicatorBall = CAShapeLayer() private var lrudIndicatorBall = CAShapeLayer()
@@ -79,6 +84,9 @@ import UIKit
self.offSetY = 0 self.offSetY = 0
self.onScreenControls = OnScreenControls() self.onScreenControls = OnScreenControls()
self.appWindow = UIApplication.shared.windows.first! self.appWindow = UIApplication.shared.windows.first!
self.quickDoubleTapDetected = false
self.touchTapTimeInterval = 100
self.touchTapTimeStamp = 100
super.init(frame: .zero) super.init(frame: .zero)
upIndicator = createLrudDirectionLayer() upIndicator = createLrudDirectionLayer()
@@ -90,6 +98,7 @@ import UIKit
rightIndicator = createLrudDirectionLayer() rightIndicator = createLrudDirectionLayer()
rightIndicator.anchorPoint = CGPoint(x: 0, y: 0.5) rightIndicator.anchorPoint = CGPoint(x: 0, y: 0.5)
setupView() setupView()
} }
@@ -226,6 +235,28 @@ import UIKit
setupBorderLayer(); setupBorderLayer();
} }
private func createAndShowl3r3Indicator() -> CAShapeLayer{
let indicatorFrame = CAShapeLayer();
let indicatorBorder = CAShapeLayer();
indicatorFrame.frame = CGRectMake(0, 0, 80, 80)
indicatorFrame.cornerRadius = 9
indicatorBorder.borderWidth = 9
indicatorBorder.frame = indicatorFrame.bounds.insetBy(dx: -indicatorBorder.borderWidth, dy: -indicatorBorder.borderWidth) // Adjust the inset as needed
indicatorBorder.borderColor = UIColor.clear.cgColor
indicatorBorder.cornerRadius = indicatorFrame.cornerRadius + indicatorBorder.borderWidth
indicatorBorder.backgroundColor = UIColor.clear.cgColor
indicatorBorder.fillColor = UIColor.clear.cgColor
let path = UIBezierPath(roundedRect: indicatorBorder.bounds, cornerRadius: indicatorBorder.cornerRadius)
indicatorBorder.path = path.cgPath
indicatorBorder.borderColor = moonlightPurple
self.layer.superlayer?.addSublayer(indicatorBorder)
indicatorBorder.position = CGPointMake(CGRectGetMinX(self.frame)+touchBeganLocation.x, CGRectGetMinY(self.frame)+touchBeganLocation.y)
return indicatorBorder
}
@@ -307,7 +338,7 @@ import UIKit
CATransaction.begin() CATransaction.begin()
CATransaction.setDisableActions(true) CATransaction.setDisableActions(true)
self.stickBallLayer.removeAllAnimations() self.stickBallLayer.removeAllAnimations()
self.stickBallLayer.position = CGPointMake(CGRectGetMidX(self.crossMarkLayer.frame) + offSetX/3, CGRectGetMinY(self.crossMarkLayer.frame) + offSetY/3) self.stickBallLayer.position = CGPointMake(CGRectGetMidX(self.crossMarkLayer.frame) + touchInputToStickBallCoord(input: offSetX), CGRectGetMinY(self.crossMarkLayer.frame) + touchInputToStickBallCoord(input: offSetY))
CATransaction.commit() CATransaction.commit()
} }
@@ -485,6 +516,38 @@ import UIKit
//========================================================================================================== //==========================================================================================================
//=========================================send on screen controller stick events
private func touchInputToStickInput(input: CGFloat) -> CGFloat{
var target = 0x7FFE * input / stickInputScale
if target > 0x7FFE {target = 0x7FFE}
if target < -0x7FFE {target = -0x7FFE}
return target
}
private func touchInputToStickBallCoord(input: CGFloat) -> CGFloat {
if input > stickInputScale {return 18}
if input < -stickInputScale {return -18}
return input * (18/stickInputScale)
}
private func sendRightStickTouchPadEvent(inputX: CGFloat, inputY: CGFloat){
let targetX = self.touchInputToStickInput(input: inputX)
let targetY = -self.touchInputToStickInput(input: inputY)
// vertical input must be inverted
self.onScreenControls.sendRightStickTouchPadEvent(targetX, targetY)
}
private func sendLeftStickTouchPadEvent(inputX: CGFloat, inputY: CGFloat){
let targetX = self.touchInputToStickInput(input: inputX)
let targetY = -self.touchInputToStickInput(input: inputY)
self.onScreenControls.sendLeftStickTouchPadEvent(targetX, targetY)
}
//==========================================================================================================
// Touch event handling // Touch event handling
@@ -493,6 +556,12 @@ import UIKit
// print("touchDown: %f", CACurrentMediaTime()) // print("touchDown: %f", CACurrentMediaTime())
if touches.count == 1 { if touches.count == 1 {
let currentTime = CACurrentMediaTime()
touchTapTimeInterval = currentTime - touchTapTimeStamp
touchTapTimeStamp = currentTime
quickDoubleTapDetected = touchTapTimeInterval < QUICK_TAP_TIME_INTERVAL
let touch = touches.first let touch = touches.first
self.touchBeganLocation = touch!.location(in: self) self.touchBeganLocation = touch!.location(in: self)
self.latestTouchLocation = touchBeganLocation self.latestTouchLocation = touchBeganLocation
@@ -508,12 +577,27 @@ import UIKit
if !OnScreenButtonView.editMode { if !OnScreenButtonView.editMode {
if CommandManager.touchPadCmds.contains(self.keyString) && touches.count == 1{ if CommandManager.touchPadCmds.contains(self.keyString) && touches.count == 1{
switch self.keyString { switch self.keyString {
case "LSPAD", "RSPAD": case "LSPAD":
self.showStickIndicator() self.showStickIndicator()
if quickDoubleTapDetected {
self.l3r3Indicator = self.createAndShowl3r3Indicator()
self.onScreenControls.pressDownL3()}
break
case "RSPAD":
self.showStickIndicator()
if quickDoubleTapDetected {
self.l3r3Indicator = self.createAndShowl3r3Indicator()
self.onScreenControls.pressDownR3()}
break break
case "LSVPAD": case "LSVPAD":
if quickDoubleTapDetected {
self.l3r3Indicator = self.createAndShowl3r3Indicator()
self.onScreenControls.pressDownL3()}
break break
case "RSVPAD": case "RSVPAD":
if quickDoubleTapDetected {
self.l3r3Indicator = self.createAndShowl3r3Indicator()
self.onScreenControls.pressDownR3()}
break break
case "DPAD", "WASDPAD", "ARROWPAD": case "DPAD", "WASDPAD", "ARROWPAD":
self.lrudIndicatorBall = createAndShowLrudBall(at: touchBeganLocation) self.lrudIndicatorBall = createAndShowLrudBall(at: touchBeganLocation)
@@ -590,18 +674,18 @@ import UIKit
switch self.keyString{ switch self.keyString{
case "LSPAD": case "LSPAD":
self.onScreenControls.sendLeftStickTouchPadEvent(withDeltaX: offSetX, deltaY: offSetY) self.sendLeftStickTouchPadEvent(inputX: offSetX, inputY: offSetY)
updateStickBallPosition() updateStickBallPosition()
break break
case "RSPAD": case "RSPAD":
self.onScreenControls.sendRightStickTouchPadEvent(withDeltaX: offSetX, deltaY: offSetY); self.sendRightStickTouchPadEvent(inputX: offSetX, inputY: offSetY);
updateStickBallPosition() updateStickBallPosition()
break break
case "LSVPAD": case "LSVPAD":
self.onScreenControls.sendLeftStickTouchPadEvent(withDeltaX: deltaX, deltaY: deltaY) self.sendLeftStickTouchPadEvent(inputX: deltaX, inputY: deltaY)
break break
case "RSVPAD": case "RSVPAD":
self.onScreenControls.sendRightStickTouchPadEvent(withDeltaX: deltaX, deltaY: deltaY); self.sendRightStickTouchPadEvent(inputX: deltaX, inputY: deltaY);
break break
case "DPAD", "WASDPAD", "ARROWPAD": case "DPAD", "WASDPAD", "ARROWPAD":
handleLrudTouchMove() handleLrudTouchMove()
@@ -616,6 +700,7 @@ import UIKit
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// self.pressed = false // will be reset outside the class // self.pressed = false // will be reset outside the class
super.touchesEnded(touches, with: event) super.touchesEnded(touches, with: event)
quickDoubleTapDetected = false
if !OnScreenButtonView.editMode && CommandManager.touchPadCmds.contains(self.keyString) && touches.count == 1 { if !OnScreenButtonView.editMode && CommandManager.touchPadCmds.contains(self.keyString) && touches.count == 1 {
switch self.keyString{ switch self.keyString{
case "LSPAD": case "LSPAD":
@@ -657,6 +742,7 @@ import UIKit
} }
self.buttonUpVisualEffect() self.buttonUpVisualEffect()
self.l3r3Indicator.removeFromSuperlayer()
if OnScreenButtonView.editMode { if OnScreenButtonView.editMode {
guard let superview = superview else { return } guard let superview = superview else { return }
+4 -2
View File
@@ -105,10 +105,12 @@ typedef NS_ENUM(NSInteger, OnScreenControlsLevel) {
+ (NSMutableSet* )touchAddrsCapturedByOnScreenControls; + (NSMutableSet* )touchAddrsCapturedByOnScreenControls;
+ (void) testMethod; + (void) testMethod;
- (void) sendRightStickTouchPadEventWithDeltaX:(CGFloat) deltaX deltaY: (CGFloat) deltaY; - (void) sendRightStickTouchPadEvent:(CGFloat) stickX : (CGFloat) stickY;
- (void) clearRightStickTouchPadFlag; - (void) clearRightStickTouchPadFlag;
- (void) sendLeftStickTouchPadEventWithDeltaX:(CGFloat) deltaX deltaY: (CGFloat) deltaY; - (void) sendLeftStickTouchPadEvent:(CGFloat) stickX : (CGFloat) stickY;
- (void) clearLeftStickTouchPadFlag; - (void) clearLeftStickTouchPadFlag;
- (void) pressDownL3;
- (void) pressDownR3;
- (id) initWithView:(UIView*)view controllerSup:(ControllerSupport*)controllerSupport streamConfig:(StreamConfiguration*)streamConfig; - (id) initWithView:(UIView*)view controllerSup:(ControllerSupport*)controllerSupport streamConfig:(StreamConfiguration*)streamConfig;
- (BOOL) handleTouchDownEvent:(NSSet*)touches; - (BOOL) handleTouchDownEvent:(NSSet*)touches;
+14 -16
View File
@@ -146,25 +146,13 @@ static float L3_Y;
NSLog(@"swift calling test"); NSLog(@"swift calling test");
} }
- (void) sendRightStickTouchPadEventWithDeltaX:(CGFloat) deltaX deltaY: (CGFloat) deltaY{ - (void) sendRightStickTouchPadEvent:(CGFloat) stickX : (CGFloat) stickY{
CGFloat controllerX = 0x7FFE * deltaX / 30; [_controllerSupport updateRightStick:_controller x: stickX y: stickY]; // stick value populated to the controllerSupport here
if(controllerX > 0x7FFE) controllerX = 0x7FFE;
if(controllerX < -0x7FFE) controllerX = -0x7FFE;
CGFloat controllerY = 0x7FFE * deltaY / 30;
if(controllerY > 0x7FFE) controllerY = 0x7FFE;
if(controllerY < -0x7FFE) controllerY = -0x7FFE;
[_controllerSupport updateRightStick:_controller x: controllerX y: - controllerY]; // stick value populated to the controllerSupport here
[_controllerSupport updateFinished:_controller]; [_controllerSupport updateFinished:_controller];
} }
- (void) sendLeftStickTouchPadEventWithDeltaX:(CGFloat) deltaX deltaY: (CGFloat) deltaY{ - (void) sendLeftStickTouchPadEvent:(CGFloat) stickX : (CGFloat) stickY{
CGFloat controllerX = 0x7FFE * deltaX / 35; [_controllerSupport updateLeftStick:_controller x: stickX y: stickY]; // stick value populated to the controllerSupport here
if(controllerX > 0x7FFE) controllerX = 0x7FFE;
if(controllerX < -0x7FFE) controllerX = -0x7FFE;
CGFloat controllerY = 0x7FFE * deltaY / 35;
if(controllerY > 0x7FFE) controllerY = 0x7FFE;
if(controllerY < -0x7FFE) controllerY = -0x7FFE;
[_controllerSupport updateLeftStick:_controller x: controllerX y: - controllerY]; // stick value populated to the controllerSupport here
[_controllerSupport updateFinished:_controller]; [_controllerSupport updateFinished:_controller];
} }
@@ -181,6 +169,16 @@ static float L3_Y;
[_controllerSupport updateFinished:_controller]; [_controllerSupport updateFinished:_controller];
} }
- (void) pressDownL3{
[_controllerSupport setButtonFlag:_controller flags:LS_CLK_FLAG];
[_controllerSupport updateFinished:_controller];
}
- (void) pressDownR3{
[_controllerSupport setButtonFlag:_controller flags:RS_CLK_FLAG];
[_controllerSupport updateFinished:_controller];
}
// sending self as an instance to OnScreenButtonView // sending self as an instance to OnScreenButtonView
- (void)sendInstance{ - (void)sendInstance{