L3R3 button visual effect for onScreen touchPad
This commit is contained in:
1 parent
8d0b646fbe
commit
422c34f945
3 files changed
+112
-26
No files matched your search
@@ -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()
|
||||||
@@ -89,6 +97,7 @@ import UIKit
|
|||||||
leftIndicator.anchorPoint = CGPoint(x: 1, y: 0.5)
|
leftIndicator.anchorPoint = CGPoint(x: 1, y: 0.5)
|
||||||
rightIndicator = createLrudDirectionLayer()
|
rightIndicator = createLrudDirectionLayer()
|
||||||
rightIndicator.anchorPoint = CGPoint(x: 0, y: 0.5)
|
rightIndicator.anchorPoint = CGPoint(x: 0, y: 0.5)
|
||||||
|
|
||||||
|
|
||||||
setupView()
|
setupView()
|
||||||
}
|
}
|
||||||
@@ -226,7 +235,29 @@ 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 }
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
Reference in new issue
Block a user