resizable on-screen sticks & single layer on-screen controller buttons
This commit is contained in:
1 parent
5db6aa0695
commit
fadf023563
6 files changed
+162
-53
No files matched your search
@@ -10,6 +10,7 @@
|
|||||||
#import "OnScreenButtonState.h"
|
#import "OnScreenButtonState.h"
|
||||||
#import "Moonlight-Swift.h"
|
#import "Moonlight-Swift.h"
|
||||||
#import "LayoutOnScreenControlsViewController.h"
|
#import "LayoutOnScreenControlsViewController.h"
|
||||||
|
#import "OnScreenControls.h"
|
||||||
|
|
||||||
@implementation OSCProfilesManager
|
@implementation OSCProfilesManager
|
||||||
|
|
||||||
@@ -269,6 +270,10 @@ static NSMutableDictionary *onScreenButtonViewsDict;
|
|||||||
OnScreenButtonState *buttonState = [[OnScreenButtonState alloc] initWithButtonName:oscButtonLayer.name buttonType:GameControllerButton andPosition:oscButtonLayer.position];
|
OnScreenButtonState *buttonState = [[OnScreenButtonState alloc] initWithButtonName:oscButtonLayer.name buttonType:GameControllerButton andPosition:oscButtonLayer.position];
|
||||||
// add hidden attr here
|
// add hidden attr here
|
||||||
buttonState.isHidden = oscButtonLayer.isHidden;
|
buttonState.isHidden = oscButtonLayer.isHidden;
|
||||||
|
buttonState.oscLayerSizeFactor = [OnScreenControls getControllerLayerSizeFactor:oscButtonLayer];
|
||||||
|
NSLog(@"oscLayerName: %@, sizeFactor: %f", oscButtonLayer.name, buttonState.oscLayerSizeFactor);
|
||||||
|
// buttonState.oscLayerSizeFactor = oscButtonLayer.bounds;
|
||||||
|
|
||||||
NSData *buttonStateEncoded = [NSKeyedArchiver archivedDataWithRootObject:buttonState requiringSecureCoding:YES error:nil];
|
NSData *buttonStateEncoded = [NSKeyedArchiver archivedDataWithRootObject:buttonState requiringSecureCoding:YES error:nil];
|
||||||
[buttonStatesEncoded addObject: buttonStateEncoded];
|
[buttonStatesEncoded addObject: buttonStateEncoded];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (nonatomic, assign) NSTimeInterval timestamp;
|
@property (nonatomic, assign) NSTimeInterval timestamp;
|
||||||
@property (nonatomic, assign) CGFloat widthFactor; // for OnScreenButtonView
|
@property (nonatomic, assign) CGFloat widthFactor; // for OnScreenButtonView
|
||||||
@property (nonatomic, assign) CGFloat heightFactor; // for OnScreenButtonView
|
@property (nonatomic, assign) CGFloat heightFactor; // for OnScreenButtonView
|
||||||
|
@property (nonatomic, assign) CGFloat oscLayerSizeFactor; // for OnScreenController CALayer
|
||||||
|
|
||||||
// @property (nonatomic, assign) BOOL hasValidPosition;
|
// @property (nonatomic, assign) BOOL hasValidPosition;
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
[encoder encodeBool:self.isHidden forKey:@"isHidden"];
|
[encoder encodeBool:self.isHidden forKey:@"isHidden"];
|
||||||
[encoder encodeFloat:self.widthFactor forKey:@"widthFactor"];
|
[encoder encodeFloat:self.widthFactor forKey:@"widthFactor"];
|
||||||
[encoder encodeFloat:self.heightFactor forKey:@"heightFactor"];
|
[encoder encodeFloat:self.heightFactor forKey:@"heightFactor"];
|
||||||
|
[encoder encodeFloat:self.oscLayerSizeFactor forKey:@"oscLayerSizeFactor"];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id) initWithCoder:(NSCoder*)decoder {
|
- (id) initWithCoder:(NSCoder*)decoder {
|
||||||
@@ -47,8 +48,8 @@
|
|||||||
self.isHidden = [decoder decodeBoolForKey:@"isHidden"];
|
self.isHidden = [decoder decodeBoolForKey:@"isHidden"];
|
||||||
self.widthFactor = [decoder decodeFloatForKey:@"widthFactor"];
|
self.widthFactor = [decoder decodeFloatForKey:@"widthFactor"];
|
||||||
self.heightFactor = [decoder decodeFloatForKey:@"heightFactor"];
|
self.heightFactor = [decoder decodeFloatForKey:@"heightFactor"];
|
||||||
|
self.oscLayerSizeFactor = [decoder decodeFloatForKey:@"oscLayerSizeFactor"];
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,8 @@ typedef NS_ENUM(NSInteger, OnScreenControlsLevel) {
|
|||||||
- (OnScreenControlsLevel) getLevel;
|
- (OnScreenControlsLevel) getLevel;
|
||||||
- (void) setDPadCenter;
|
- (void) setDPadCenter;
|
||||||
- (void) setAnalogStickPositions;
|
- (void) setAnalogStickPositions;
|
||||||
- (void) positionOSCButtons;
|
- (void) positionAndResizeSingleControllerLayers;
|
||||||
- (void) resizeControllerLayersWith:(CALayer*)layer and:(CGFloat)sizeFactor;
|
- (void) resizeControllerLayerWith:(CALayer*)layer and:(CGFloat)sizeFactor;
|
||||||
|
+ (CGFloat) getControllerLayerSizeFactor:(CALayer*)layer;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -19,6 +19,15 @@
|
|||||||
(y) ? (buttonFlags | (x)) : (buttonFlags & ~(x)))
|
(y) ? (buttonFlags | (x)) : (buttonFlags & ~(x)))
|
||||||
|
|
||||||
static NSMutableSet* touchAddrsCapturedByOnScreenControls;
|
static NSMutableSet* touchAddrsCapturedByOnScreenControls;
|
||||||
|
static CGRect standardRoundButtonBounds;
|
||||||
|
static CGRect standardRectangleButtonBounds;
|
||||||
|
static CGRect standardStickBounds;
|
||||||
|
static CGRect standardStickBackgroundBounds;
|
||||||
|
static CGRect standardUpDownButtonBounds;
|
||||||
|
static CGRect standardLeftRightButtonBounds;
|
||||||
|
static NSSet *validPositionButtonNames;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@implementation OnScreenControls {
|
@implementation OnScreenControls {
|
||||||
|
|
||||||
@@ -59,6 +68,8 @@ static NSMutableSet* touchAddrsCapturedByOnScreenControls;
|
|||||||
BOOL _swapABXY;
|
BOOL _swapABXY;
|
||||||
BOOL _largerStickLR1;
|
BOOL _largerStickLR1;
|
||||||
CGFloat _oscTapExlusionAreaSizeFactor;
|
CGFloat _oscTapExlusionAreaSizeFactor;
|
||||||
|
CGFloat _leftStickSizeFactor;
|
||||||
|
CGFloat _rightStickSizeFactor;
|
||||||
OSCProfilesManager *profilesManager;
|
OSCProfilesManager *profilesManager;
|
||||||
NSMutableDictionary *_activeCustomOscButtonPositionDict;
|
NSMutableDictionary *_activeCustomOscButtonPositionDict;
|
||||||
}
|
}
|
||||||
@@ -100,8 +111,10 @@ static const float DEAD_ZONE_PADDING = 15;
|
|||||||
|
|
||||||
static const double STICK_CLICK_RATE = 100;
|
static const double STICK_CLICK_RATE = 100;
|
||||||
static const float STICK_DEAD_ZONE = .1;
|
static const float STICK_DEAD_ZONE = .1;
|
||||||
static float STICK_INNER_SIZE;
|
static float RIGHT_STICK_INNER_SIZE;
|
||||||
static float STICK_OUTER_SIZE;
|
static float RIGHT_STICK_OUTER_SIZE;
|
||||||
|
static float LEFT_STICK_INNER_SIZE;
|
||||||
|
static float LEFT_STICK_OUTER_SIZE;
|
||||||
static float LS_CENTER_X;
|
static float LS_CENTER_X;
|
||||||
static float LS_CENTER_Y;
|
static float LS_CENTER_Y;
|
||||||
static float RS_CENTER_X;
|
static float RS_CENTER_X;
|
||||||
@@ -234,12 +247,12 @@ static float L3_Y;
|
|||||||
_leftButton.name = @"leftButton";
|
_leftButton.name = @"leftButton";
|
||||||
|
|
||||||
|
|
||||||
_standardRoundButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"AButton"].size.width, [UIImage imageNamed:@"AButton"].size.height);
|
_standardRoundButtonBounds = standardRoundButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"AButton"].size.width, [UIImage imageNamed:@"AButton"].size.height);
|
||||||
_standardRectangleButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"StartButton"].size.width, [UIImage imageNamed:@"StartButton"].size.height);
|
_standardRectangleButtonBounds = standardRectangleButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"StartButton"].size.width, [UIImage imageNamed:@"StartButton"].size.height);
|
||||||
_standardStickBounds = CGRectMake(0, 0, [UIImage imageNamed:@"StickInner"].size.width * 1.33, [UIImage imageNamed:@"StickInner"].size.height * 1.33);
|
_standardStickBounds = standardStickBounds = CGRectMake(0, 0, [UIImage imageNamed:@"StickInner"].size.width * 1.33, [UIImage imageNamed:@"StickInner"].size.height * 1.33);
|
||||||
_standardStickBackgroundBounds = CGRectMake(0, 0, [UIImage imageNamed:@"StickOuter"].size.width * 1.10, [UIImage imageNamed:@"StickOuter"].size.height * 1.10);
|
_standardStickBackgroundBounds = standardStickBackgroundBounds = CGRectMake(0, 0, [UIImage imageNamed:@"StickOuter"].size.width * 1.10, [UIImage imageNamed:@"StickOuter"].size.height * 1.10);
|
||||||
_standardUpDownButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"UpButton"].size.width, [UIImage imageNamed:@"UpButton"].size.height);
|
_standardUpDownButtonBounds = standardUpDownButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"UpButton"].size.width, [UIImage imageNamed:@"UpButton"].size.height);
|
||||||
_standardLeftRightButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"LeftButton"].size.width, [UIImage imageNamed:@"LeftButton"].size.height);
|
_standardLeftRightButtonBounds = standardLeftRightButtonBounds = CGRectMake(0, 0, [UIImage imageNamed:@"LeftButton"].size.width, [UIImage imageNamed:@"LeftButton"].size.height);
|
||||||
|
|
||||||
_activeCustomOscButtonPositionDict = [[NSMutableDictionary alloc] init];
|
_activeCustomOscButtonPositionDict = [[NSMutableDictionary alloc] init];
|
||||||
touchAddrsCapturedByOnScreenControls = [[NSMutableSet alloc] init];
|
touchAddrsCapturedByOnScreenControls = [[NSMutableSet alloc] init];
|
||||||
@@ -270,7 +283,7 @@ static float L3_Y;
|
|||||||
- (void) updateControls {
|
- (void) updateControls {
|
||||||
if(self._level == OnScreenControlsLevelCustom){
|
if(self._level == OnScreenControlsLevelCustom){
|
||||||
// mark all OSC buttons that has valid coords of positions
|
// mark all OSC buttons that has valid coords of positions
|
||||||
NSSet *validPositionButtonNames = [NSSet setWithObjects:
|
validPositionButtonNames = [NSSet setWithObjects:
|
||||||
@"l2Button",
|
@"l2Button",
|
||||||
@"l1Button",
|
@"l1Button",
|
||||||
@"dPad",
|
@"dPad",
|
||||||
@@ -297,6 +310,10 @@ static float L3_Y;
|
|||||||
[_activeCustomOscButtonPositionDict setObject:[NSValue valueWithCGPoint:buttonState.position] forKey:buttonState.name]; // we got a buttonname -> position dict here
|
[_activeCustomOscButtonPositionDict setObject:[NSValue valueWithCGPoint:buttonState.position] forKey:buttonState.name]; // we got a buttonname -> position dict here
|
||||||
NSLog(@"_activeCustomOscButtonPositionDict update, button name:%@, position: %f, %f", buttonState.name, buttonState.position.x, buttonState.position.y);
|
NSLog(@"_activeCustomOscButtonPositionDict update, button name:%@, position: %f, %f", buttonState.name, buttonState.position.x, buttonState.position.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// retrieve complex control size factors
|
||||||
|
if([buttonState.name isEqualToString:@"leftStick"]) _leftStickSizeFactor = buttonState.oscLayerSizeFactor;
|
||||||
|
if([buttonState.name isEqualToString:@"rightStick"]) _rightStickSizeFactor = buttonState.oscLayerSizeFactor;
|
||||||
}
|
}
|
||||||
NSLog(@"_activeCustomOscButtonPositionDict update, active button number: %lu", (unsigned long)[_activeCustomOscButtonPositionDict count]);
|
NSLog(@"_activeCustomOscButtonPositionDict update, active button number: %lu", (unsigned long)[_activeCustomOscButtonPositionDict count]);
|
||||||
}
|
}
|
||||||
@@ -377,7 +394,7 @@ static float L3_Y;
|
|||||||
[self drawBumpers];
|
[self drawBumpers];
|
||||||
[self drawTriggers];
|
[self drawTriggers];
|
||||||
[self drawSticks];
|
[self drawSticks];
|
||||||
[self positionOSCButtons];
|
[self positionAndResizeSingleControllerLayers];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -612,7 +629,7 @@ static float L3_Y;
|
|||||||
|
|
||||||
# define LR2_Y_UP_OFFSET 8
|
# define LR2_Y_UP_OFFSET 8
|
||||||
# define LR1_Y_DOWN_OFFSET 3.5
|
# define LR1_Y_DOWN_OFFSET 3.5
|
||||||
- (void) positionOSCButtons {
|
- (void) positionAndResizeSingleControllerLayers {
|
||||||
OSCProfile *oscProfile = [profilesManager getSelectedProfile];
|
OSCProfile *oscProfile = [profilesManager getSelectedProfile];
|
||||||
bool defaultProfileSelected = [profilesManager getIndexOfSelectedProfile] == 0;
|
bool defaultProfileSelected = [profilesManager getIndexOfSelectedProfile] == 0;
|
||||||
|
|
||||||
@@ -621,7 +638,6 @@ static float L3_Y;
|
|||||||
OnScreenButtonState *buttonStateDecoded = [NSKeyedUnarchiver unarchivedObjectOfClass:[OnScreenButtonState class] fromData:buttonStateEncoded error:nil];
|
OnScreenButtonState *buttonStateDecoded = [NSKeyedUnarchiver unarchivedObjectOfClass:[OnScreenButtonState class] fromData:buttonStateEncoded error:nil];
|
||||||
|
|
||||||
for (CALayer *buttonLayer in self.OSCButtonLayers) { // iterate through each button layer on screen and position and hide/unhide each according to the instructions of its associated 'buttonState'
|
for (CALayer *buttonLayer in self.OSCButtonLayers) { // iterate through each button layer on screen and position and hide/unhide each according to the instructions of its associated 'buttonState'
|
||||||
|
|
||||||
if ([buttonLayer.name isEqualToString:buttonStateDecoded.name]) {
|
if ([buttonLayer.name isEqualToString:buttonStateDecoded.name]) {
|
||||||
if ([buttonLayer.name isEqualToString:@"upButton"] == NO &&
|
if ([buttonLayer.name isEqualToString:@"upButton"] == NO &&
|
||||||
[buttonLayer.name isEqualToString:@"rightButton"] == NO &&
|
[buttonLayer.name isEqualToString:@"rightButton"] == NO &&
|
||||||
@@ -637,6 +653,18 @@ static float L3_Y;
|
|||||||
if( defaultProfileSelected && _largerStickLR1)
|
if( defaultProfileSelected && _largerStickLR1)
|
||||||
if([buttonLayer.name isEqualToString:@"l2Button"] || [buttonLayer.name isEqualToString:@"r2Button"]) buttonLayer.position = CGPointMake(buttonLayer.position.x, buttonLayer.position.y - LR2_Y_UP_OFFSET);
|
if([buttonLayer.name isEqualToString:@"l2Button"] || [buttonLayer.name isEqualToString:@"r2Button"]) buttonLayer.position = CGPointMake(buttonLayer.position.x, buttonLayer.position.y - LR2_Y_UP_OFFSET);
|
||||||
if([buttonLayer.name isEqualToString:@"l1Button"] || [buttonLayer.name isEqualToString:@"r1Button"]) buttonLayer.position = CGPointMake(buttonLayer.position.x, buttonLayer.position.y + LR1_Y_DOWN_OFFSET);
|
if([buttonLayer.name isEqualToString:@"l1Button"] || [buttonLayer.name isEqualToString:@"r1Button"]) buttonLayer.position = CGPointMake(buttonLayer.position.x, buttonLayer.position.y + LR1_Y_DOWN_OFFSET);
|
||||||
|
|
||||||
|
// Here we deal with resizing single layer controllers only
|
||||||
|
if ([buttonLayer.name isEqualToString:@"l1Button"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"r1Button"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"l2Button"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"r2Button"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"aButton"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"bButton"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"xButton"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"yButton"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"selectButton"] ||
|
||||||
|
[buttonLayer.name isEqualToString:@"startButton"]) [self resizeControllerLayerWith:buttonLayer and:buttonStateDecoded.oscLayerSizeFactor];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -727,16 +755,28 @@ static float L3_Y;
|
|||||||
|
|
||||||
// make stick larger
|
// make stick larger
|
||||||
if(_largerStickLR1){
|
if(_largerStickLR1){
|
||||||
STICK_INNER_SIZE = rightStickImage.size.width *1.33;
|
// sticks are resized here by the sizefactor persisted in the osc profile.
|
||||||
STICK_OUTER_SIZE = rightStickBgImage.size.width *1.10;
|
RIGHT_STICK_INNER_SIZE = rightStickImage.size.width *1.33 * _rightStickSizeFactor;
|
||||||
_rightStick.bounds = _leftStick.bounds = CGRectMake(0, 0, STICK_INNER_SIZE, STICK_INNER_SIZE);
|
RIGHT_STICK_OUTER_SIZE = rightStickBgImage.size.width *1.10 * _rightStickSizeFactor;
|
||||||
_rightStickBackground.bounds = _leftStickBackground.bounds = CGRectMake(0, 0, STICK_OUTER_SIZE, STICK_OUTER_SIZE);
|
_rightStick.bounds = CGRectMake(0, 0, RIGHT_STICK_INNER_SIZE, RIGHT_STICK_INNER_SIZE);
|
||||||
|
_rightStickBackground.bounds = CGRectMake(0, 0, RIGHT_STICK_OUTER_SIZE, RIGHT_STICK_OUTER_SIZE);
|
||||||
|
|
||||||
|
LEFT_STICK_INNER_SIZE = rightStickImage.size.width *1.33 * _leftStickSizeFactor;
|
||||||
|
LEFT_STICK_OUTER_SIZE = rightStickBgImage.size.width *1.10 * _leftStickSizeFactor;
|
||||||
|
_leftStick.bounds = CGRectMake(0, 0, LEFT_STICK_INNER_SIZE, LEFT_STICK_INNER_SIZE);
|
||||||
|
_leftStickBackground.bounds = CGRectMake(0, 0, LEFT_STICK_OUTER_SIZE, LEFT_STICK_OUTER_SIZE);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
STICK_INNER_SIZE = rightStickImage.size.width;
|
// sticks are resized here by the sizefactor persisted in the osc profile.
|
||||||
STICK_OUTER_SIZE = rightStickBgImage.size.width;
|
RIGHT_STICK_INNER_SIZE = rightStickImage.size.width * _rightStickSizeFactor;
|
||||||
_rightStick.bounds = _leftStick.bounds = CGRectMake(0, 0, STICK_INNER_SIZE, STICK_INNER_SIZE);
|
RIGHT_STICK_OUTER_SIZE = rightStickBgImage.size.width * _rightStickSizeFactor;
|
||||||
_rightStickBackground.bounds = _leftStickBackground.bounds = CGRectMake(0, 0, STICK_OUTER_SIZE, STICK_OUTER_SIZE);
|
_rightStick.bounds = CGRectMake(0, 0, RIGHT_STICK_INNER_SIZE, RIGHT_STICK_INNER_SIZE);
|
||||||
|
_rightStickBackground.bounds = CGRectMake(0, 0, RIGHT_STICK_OUTER_SIZE, RIGHT_STICK_OUTER_SIZE);
|
||||||
|
|
||||||
|
LEFT_STICK_INNER_SIZE = rightStickImage.size.width * _leftStickSizeFactor;
|
||||||
|
LEFT_STICK_OUTER_SIZE = rightStickBgImage.size.width * _leftStickSizeFactor;
|
||||||
|
_leftStick.bounds = CGRectMake(0, 0, LEFT_STICK_INNER_SIZE, LEFT_STICK_INNER_SIZE);
|
||||||
|
_leftStickBackground.bounds = CGRectMake(0, 0, LEFT_STICK_OUTER_SIZE, LEFT_STICK_OUTER_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -797,14 +837,15 @@ static float L3_Y;
|
|||||||
- (BOOL) handleTouchMovedEvent:touches {
|
- (BOOL) handleTouchMovedEvent:touches {
|
||||||
BOOL updated = false;
|
BOOL updated = false;
|
||||||
BOOL buttonTouch = false;
|
BOOL buttonTouch = false;
|
||||||
float rsMaxX = RS_CENTER_X + STICK_OUTER_SIZE / 2;
|
// we'll set fixed stick range despite stick & its background are resizable
|
||||||
float rsMaxY = RS_CENTER_Y + STICK_OUTER_SIZE / 2;
|
float rsMaxX = RS_CENTER_X + standardStickBackgroundBounds.size.width / 2;
|
||||||
float rsMinX = RS_CENTER_X - STICK_OUTER_SIZE / 2;
|
float rsMaxY = RS_CENTER_Y + standardStickBackgroundBounds.size.width / 2;
|
||||||
float rsMinY = RS_CENTER_Y - STICK_OUTER_SIZE / 2;
|
float rsMinX = RS_CENTER_X - standardStickBackgroundBounds.size.width / 2;
|
||||||
float lsMaxX = LS_CENTER_X + STICK_OUTER_SIZE / 2;
|
float rsMinY = RS_CENTER_Y - standardStickBackgroundBounds.size.width / 2;
|
||||||
float lsMaxY = LS_CENTER_Y + STICK_OUTER_SIZE / 2;
|
float lsMaxX = LS_CENTER_X + standardStickBackgroundBounds.size.width / 2;
|
||||||
float lsMinX = LS_CENTER_X - STICK_OUTER_SIZE / 2;
|
float lsMaxY = LS_CENTER_Y + standardStickBackgroundBounds.size.width / 2;
|
||||||
float lsMinY = LS_CENTER_Y - STICK_OUTER_SIZE / 2;
|
float lsMinX = LS_CENTER_X - standardStickBackgroundBounds.size.width / 2;
|
||||||
|
float lsMinY = LS_CENTER_Y - standardStickBackgroundBounds.size.width / 2;
|
||||||
|
|
||||||
for (UITouch* touch in touches) {
|
for (UITouch* touch in touches) {
|
||||||
CGPoint touchLocation = [touch locationInView:_view];
|
CGPoint touchLocation = [touch locationInView:_view];
|
||||||
@@ -816,7 +857,7 @@ static float L3_Y;
|
|||||||
if (yLoc > lsMaxY) yLoc = lsMaxY;
|
if (yLoc > lsMaxY) yLoc = lsMaxY;
|
||||||
if (yLoc < lsMinY) yLoc = lsMinY;
|
if (yLoc < lsMinY) yLoc = lsMinY;
|
||||||
|
|
||||||
_leftStick.frame = CGRectMake(xLoc - STICK_INNER_SIZE / 2, yLoc - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE);
|
_leftStick.frame = CGRectMake(xLoc - LEFT_STICK_INNER_SIZE / 2, yLoc - LEFT_STICK_INNER_SIZE / 2, LEFT_STICK_INNER_SIZE, LEFT_STICK_INNER_SIZE);
|
||||||
|
|
||||||
float xStickVal = (xLoc - LS_CENTER_X) / (lsMaxX - LS_CENTER_X);
|
float xStickVal = (xLoc - LS_CENTER_X) / (lsMaxX - LS_CENTER_X);
|
||||||
float yStickVal = (yLoc - LS_CENTER_Y) / (lsMaxY - LS_CENTER_Y);
|
float yStickVal = (yLoc - LS_CENTER_Y) / (lsMaxY - LS_CENTER_Y);
|
||||||
@@ -833,7 +874,7 @@ static float L3_Y;
|
|||||||
if (yLoc > rsMaxY) yLoc = rsMaxY;
|
if (yLoc > rsMaxY) yLoc = rsMaxY;
|
||||||
if (yLoc < rsMinY) yLoc = rsMinY;
|
if (yLoc < rsMinY) yLoc = rsMinY;
|
||||||
|
|
||||||
_rightStick.frame = CGRectMake(xLoc - STICK_INNER_SIZE / 2, yLoc - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE);
|
_rightStick.frame = CGRectMake(xLoc - RIGHT_STICK_INNER_SIZE / 2, yLoc - RIGHT_STICK_INNER_SIZE / 2, RIGHT_STICK_INNER_SIZE, RIGHT_STICK_INNER_SIZE);
|
||||||
|
|
||||||
float xStickVal = (xLoc - RS_CENTER_X) / (rsMaxX - RS_CENTER_X);
|
float xStickVal = (xLoc - RS_CENTER_X) / (rsMaxX - RS_CENTER_X);
|
||||||
float yStickVal = (yLoc - RS_CENTER_Y) / (rsMaxY - RS_CENTER_Y);
|
float yStickVal = (yLoc - RS_CENTER_Y) / (rsMaxY - RS_CENTER_Y);
|
||||||
@@ -1209,7 +1250,7 @@ static float L3_Y;
|
|||||||
_r2Button.shadowOpacity = 0.0;
|
_r2Button.shadowOpacity = 0.0;
|
||||||
updated = true;
|
updated = true;
|
||||||
} else if (touch == _lsTouch) {
|
} else if (touch == _lsTouch) {
|
||||||
_leftStick.frame = CGRectMake(LS_CENTER_X - STICK_INNER_SIZE / 2, LS_CENTER_Y - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE);
|
_leftStick.frame = CGRectMake(LS_CENTER_X - LEFT_STICK_INNER_SIZE / 2, LS_CENTER_Y - LEFT_STICK_INNER_SIZE / 2, LEFT_STICK_INNER_SIZE, LEFT_STICK_INNER_SIZE);
|
||||||
_leftStick.shadowOpacity = 0.0;
|
_leftStick.shadowOpacity = 0.0;
|
||||||
_leftStick.opacity = STICK_OPACITY; // reset stick to half transparent
|
_leftStick.opacity = STICK_OPACITY; // reset stick to half transparent
|
||||||
[_controllerSupport updateLeftStick:_controller x:0 y:0];
|
[_controllerSupport updateLeftStick:_controller x:0 y:0];
|
||||||
@@ -1218,7 +1259,7 @@ static float L3_Y;
|
|||||||
_lsTouch = nil;
|
_lsTouch = nil;
|
||||||
updated = true;
|
updated = true;
|
||||||
} else if (touch == _rsTouch) {
|
} else if (touch == _rsTouch) {
|
||||||
_rightStick.frame = CGRectMake(RS_CENTER_X - STICK_INNER_SIZE / 2, RS_CENTER_Y - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE);
|
_rightStick.frame = CGRectMake(RS_CENTER_X - RIGHT_STICK_INNER_SIZE / 2, RS_CENTER_Y - RIGHT_STICK_INNER_SIZE / 2, RIGHT_STICK_INNER_SIZE, RIGHT_STICK_INNER_SIZE);
|
||||||
_rightStick.shadowOpacity = 0.0;
|
_rightStick.shadowOpacity = 0.0;
|
||||||
_rightStick.opacity = STICK_OPACITY;
|
_rightStick.opacity = STICK_OPACITY;
|
||||||
[_controllerSupport updateRightStick:_controller x:0 y:0];
|
[_controllerSupport updateRightStick:_controller x:0 y:0];
|
||||||
@@ -1434,10 +1475,70 @@ static float L3_Y;
|
|||||||
CGPoint touchLocation = [touch locationInView:_view];
|
CGPoint touchLocation = [touch locationInView:_view];
|
||||||
return (touchLocation.x > deadZoneStartX && touchLocation.x < deadZoneEndX
|
return (touchLocation.x > deadZoneStartX && touchLocation.x < deadZoneEndX
|
||||||
&& touchLocation.y > deadZoneStartY && touchLocation.y < deadZoneEndY);
|
&& touchLocation.y > deadZoneStartY && touchLocation.y < deadZoneEndY);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) resizeControllerLayersWith:(CALayer*)layer and:(CGFloat)sizeFactor{
|
+ (CGFloat) getControllerLayerSizeFactor:(CALayer*)layer{
|
||||||
|
CGFloat sizeFactor = 1.0;
|
||||||
|
if([layer.name isEqualToString:@"aButton"]||
|
||||||
|
[layer.name isEqualToString:@"bButton"] ||
|
||||||
|
[layer.name isEqualToString:@"xButton"] ||
|
||||||
|
[layer.name isEqualToString:@"yButton"] ||
|
||||||
|
[layer.name isEqualToString:@"l1Button"] ||
|
||||||
|
[layer.name isEqualToString:@"l2Button"] ||
|
||||||
|
[layer.name isEqualToString:@"r1Button"] ||
|
||||||
|
[layer.name isEqualToString:@"r2Button"]){
|
||||||
|
sizeFactor = layer.bounds.size.width / standardRoundButtonBounds.size.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if([layer.name isEqualToString:@"selectButton"] ||
|
||||||
|
[layer.name isEqualToString:@"startButton"]) {
|
||||||
|
sizeFactor = layer.bounds.size.width / standardRectangleButtonBounds.size.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if([layer.name isEqualToString:@"rightStickBackground"]) {
|
||||||
|
sizeFactor = layer.bounds.size.width / standardStickBackgroundBounds.size.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if([layer.name isEqualToString:@"leftStickBackground"]){
|
||||||
|
sizeFactor = layer.bounds.size.width / standardStickBackgroundBounds.size.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if([layer.name isEqualToString:@"dPad"]){
|
||||||
|
for(CALayer* subLayer in layer.sublayers){
|
||||||
|
if([subLayer.name isEqualToString:@"upButton"]){
|
||||||
|
sizeFactor = subLayer.bounds.size.height / standardUpDownButtonBounds.size.height;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sub controller layers embedded in super layers
|
||||||
|
if([layer.name isEqualToString:@"upButton"] ||
|
||||||
|
[layer.name isEqualToString:@"downButton"]){
|
||||||
|
sizeFactor = layer.bounds.size.height / standardUpDownButtonBounds.size.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if([layer.name isEqualToString:@"leftButton"] ||
|
||||||
|
[layer.name isEqualToString:@"rightButton"]){
|
||||||
|
sizeFactor = layer.bounds.size.width / standardUpDownButtonBounds.size.height; // left & right buttons are just 90 rotations of up & down buttons
|
||||||
|
}
|
||||||
|
|
||||||
|
if([layer.name isEqualToString:@"leftStick"] ||
|
||||||
|
[layer.name isEqualToString:@"rightStick"]){
|
||||||
|
sizeFactor = layer.bounds.size.width / standardStickBounds.size.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return sizeFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- (void) resizeControllerLayers{
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
- (void) resizeControllerLayerWith:(CALayer*)layer and:(CGFloat)sizeFactor{
|
||||||
// CALayer* superLayer = layer.superlayer;
|
// CALayer* superLayer = layer.superlayer;
|
||||||
// if(layerBeingDragged.name == @"")
|
// if(layerBeingDragged.name == @"")
|
||||||
if (layer == self._aButton ||
|
if (layer == self._aButton ||
|
||||||
@@ -1448,18 +1549,18 @@ static float L3_Y;
|
|||||||
layer == self._l2Button ||
|
layer == self._l2Button ||
|
||||||
layer == self._r1Button ||
|
layer == self._r1Button ||
|
||||||
layer == self._r2Button){
|
layer == self._r2Button){
|
||||||
layer.bounds = CGRectMake(0, 0, self.standardRoundButtonBounds.size.width * sizeFactor, self.standardRoundButtonBounds.size.height * sizeFactor);
|
layer.bounds = CGRectMake(layer.bounds.origin.x, layer.bounds.origin.y, standardRoundButtonBounds.size.width * sizeFactor, standardRoundButtonBounds.size.height * sizeFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layer == self._selectButton ||
|
if (layer == self._selectButton ||
|
||||||
layer == self._startButton) {
|
layer == self._startButton) {
|
||||||
layer.bounds = CGRectMake(0, 0, self.standardRectangleButtonBounds.size.width * sizeFactor, self.standardRectangleButtonBounds.size.height * sizeFactor);
|
layer.bounds = CGRectMake(layer.bounds.origin.x, layer.bounds.origin.y, standardRectangleButtonBounds.size.width * sizeFactor, standardRectangleButtonBounds.size.height * sizeFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layer == self._rightStickBackground) {
|
if (layer == self._rightStickBackground) {
|
||||||
// Resize the rightStick & Background bounds
|
// Resize the rightStick & Background bounds
|
||||||
self._rightStickBackground.bounds = CGRectMake(0, 0, self.standardStickBackgroundBounds.size.width * sizeFactor, self.standardStickBackgroundBounds.size.height * sizeFactor);
|
self._rightStickBackground.bounds = CGRectMake(layer.bounds.origin.x, layer.bounds.origin.y, standardStickBackgroundBounds.size.width * sizeFactor, standardStickBackgroundBounds.size.height * sizeFactor);
|
||||||
self._rightStick.bounds = CGRectMake(0, 0, self.standardStickBounds.size.width * sizeFactor, self.standardStickBounds.size.height * sizeFactor);
|
self._rightStick.bounds = CGRectMake(layer.bounds.origin.x, layer.bounds.origin.y, standardStickBounds.size.width * sizeFactor, standardStickBounds.size.height * sizeFactor);
|
||||||
|
|
||||||
// Retrieve the current frame to account for transformations, this will update the coords for new position CGPointMake
|
// Retrieve the current frame to account for transformations, this will update the coords for new position CGPointMake
|
||||||
CGRect transformedBackgroundFrame = self._rightStickBackground.frame;
|
CGRect transformedBackgroundFrame = self._rightStickBackground.frame;
|
||||||
@@ -1473,8 +1574,8 @@ static float L3_Y;
|
|||||||
|
|
||||||
if (layer == self._leftStickBackground){
|
if (layer == self._leftStickBackground){
|
||||||
// Resize the rightStick & Background bounds
|
// Resize the rightStick & Background bounds
|
||||||
self._leftStickBackground.bounds = CGRectMake(0, 0, self.standardStickBackgroundBounds.size.width * sizeFactor, self.standardStickBackgroundBounds.size.height * sizeFactor);
|
self._leftStickBackground.bounds = CGRectMake(layer.bounds.origin.x, layer.bounds.origin.y, standardStickBackgroundBounds.size.width * sizeFactor, standardStickBackgroundBounds.size.height * sizeFactor);
|
||||||
self._leftStick.bounds = CGRectMake(0, 0, self.standardStickBounds.size.width * sizeFactor, self.standardStickBounds.size.height * sizeFactor);
|
self._leftStick.bounds = CGRectMake(layer.bounds.origin.x, layer.bounds.origin.y, standardStickBounds.size.width * sizeFactor, standardStickBounds.size.height * sizeFactor);
|
||||||
|
|
||||||
// Retrieve the current frame to account for transformations, this will update the coords for new position CGPointMake
|
// Retrieve the current frame to account for transformations, this will update the coords for new position CGPointMake
|
||||||
CGRect transformedBackgroundFrame = self._leftStickBackground.frame;
|
CGRect transformedBackgroundFrame = self._leftStickBackground.frame;
|
||||||
@@ -1482,21 +1583,20 @@ static float L3_Y;
|
|||||||
// Explicitly adjust the position of _rightStickBackground using the transformed frame
|
// Explicitly adjust the position of _rightStickBackground using the transformed frame
|
||||||
self._leftStickBackground.position = CGPointMake(CGRectGetMidX(transformedBackgroundFrame), CGRectGetMidY(transformedBackgroundFrame));
|
self._leftStickBackground.position = CGPointMake(CGRectGetMidX(transformedBackgroundFrame), CGRectGetMidY(transformedBackgroundFrame));
|
||||||
|
|
||||||
// Update the position of _rightStick to match the new center of the transformed _rightStickBackground
|
// Update the position of _leftStick to match the new center of the transformed _rightStickBackground
|
||||||
self._leftStick.position = CGPointMake(CGRectGetMidX(self._leftStickBackground.bounds), CGRectGetMidY(self._leftStickBackground.bounds));
|
self._leftStick.position = CGPointMake(CGRectGetMidX(self._leftStickBackground.bounds), CGRectGetMidY(self._leftStickBackground.bounds));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layer == self._dPadBackground){
|
if (layer == self._dPadBackground){
|
||||||
|
|
||||||
// Calculate the distances of each button from the shared center based on their transformed positions
|
// Calculate the distances of each button from the shared center based on their transformed positions
|
||||||
CGFloat newDPadDistFactor = 0.1/sizeFactor;
|
CGFloat newDPadDistFactor = 0.1/sizeFactor;
|
||||||
|
|
||||||
// 1. Resize and reposition the Down button
|
// 1. Resize and reposition the Down button
|
||||||
|
|
||||||
CGFloat newLongSideLength = _standardLeftRightButtonBounds.size.width * sizeFactor;
|
CGFloat newLongSideLength = standardLeftRightButtonBounds.size.width * sizeFactor;
|
||||||
CGFloat newShortSideLength = _standardLeftRightButtonBounds.size.height * sizeFactor;
|
CGFloat newShortSideLength = standardLeftRightButtonBounds.size.height * sizeFactor;
|
||||||
|
|
||||||
CGPoint sharedCenter = CGPointMake(_standardLeftRightButtonBounds.size.width, _standardLeftRightButtonBounds.size.width); // this will anchor the center point of the dPad
|
CGPoint sharedCenter = CGPointMake(standardLeftRightButtonBounds.size.width, standardLeftRightButtonBounds.size.width); // this will anchor the center point of the dPad
|
||||||
|
|
||||||
// Resize and reposition the Up button
|
// Resize and reposition the Up button
|
||||||
_upButton.anchorPoint = CGPointMake(0.5, 1 + newDPadDistFactor);
|
_upButton.anchorPoint = CGPointMake(0.5, 1 + newDPadDistFactor);
|
||||||
|
|||||||
+6
-5
@@ -24,7 +24,7 @@
|
|||||||
OSCProfilesManager* profilesManager;
|
OSCProfilesManager* profilesManager;
|
||||||
OnScreenButtonView* selectedButtonView;
|
OnScreenButtonView* selectedButtonView;
|
||||||
CALayer* selectedControllerLayer;
|
CALayer* selectedControllerLayer;
|
||||||
CGRect controllerOriginalBounds;
|
CGRect controllerLoadedBounds;
|
||||||
bool buttonViewSelected;
|
bool buttonViewSelected;
|
||||||
bool controllerLayerSelected;
|
bool controllerLayerSelected;
|
||||||
__weak IBOutlet NSLayoutConstraint *toolbarTopConstraintiPhone;
|
__weak IBOutlet NSLayoutConstraint *toolbarTopConstraintiPhone;
|
||||||
@@ -379,10 +379,11 @@
|
|||||||
self->buttonViewSelected = false;
|
self->buttonViewSelected = false;
|
||||||
self->controllerLayerSelected = true;
|
self->controllerLayerSelected = true;
|
||||||
self->selectedControllerLayer = controllerLayer;
|
self->selectedControllerLayer = controllerLayer;
|
||||||
self->controllerOriginalBounds = controllerLayer.bounds;
|
self->controllerLoadedBounds = controllerLayer.bounds;
|
||||||
|
CGFloat sizeFactor = [OnScreenControls getControllerLayerSizeFactor:controllerLayer]; // calculated sizeFactor from loaded layer bounds.
|
||||||
|
|
||||||
// setup slider values
|
// setup slider values
|
||||||
// [self.buttonAndControllerWidthSlider setValue:100 * self->selectedButtonView.widthFactor];
|
[self.buttonAndControllerWidthSlider setValue:100 * sizeFactor];
|
||||||
// [self.buttonAndControllerHeightSlider setValue:100 * self->selectedButtonView.heightFactor];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -396,7 +397,7 @@
|
|||||||
[self->selectedButtonView resizeButtonView];
|
[self->selectedButtonView resizeButtonView];
|
||||||
}
|
}
|
||||||
if(self->selectedControllerLayer != nil && self->controllerLayerSelected){
|
if(self->selectedControllerLayer != nil && self->controllerLayerSelected){
|
||||||
[self.layoutOSC resizeControllerLayersWith:self->selectedControllerLayer and:self.buttonAndControllerWidthSlider.value/100];
|
[self.layoutOSC resizeControllerLayerWith:self->selectedControllerLayer and:self.buttonAndControllerWidthSlider.value/100];
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CALayer* superLayer = self->selectedControllerLayer.superlayer;
|
CALayer* superLayer = self->selectedControllerLayer.superlayer;
|
||||||
|
|||||||
Reference in new issue
Block a user