Responds to ControllerView inputs

This commit is contained in:
Riley Testut 2015-07-22 21:56:28 +01:00
parent 5fde8a69d8
commit 513129c3d5
7 changed files with 171 additions and 20 deletions

@ -1 +1 @@
Subproject commit 92a390d01eaafbce5852531d8e072ae29752dedb
Subproject commit 026b22be17246068f7e333437545db490882521f

@ -1 +1 @@
Subproject commit e591a53f115fc3a8b9dcdfea677e6f14d788f04f
Subproject commit 746632eee940d597777d2c32d5e031807fd788fb

View File

@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
BF090CF41B490D8300DCAB45 /* UIDevice+Vibration.m in Sources */ = {isa = PBXBuildFile; fileRef = BF090CF31B490D8300DCAB45 /* UIDevice+Vibration.m */; };
BF46894F1AAC46EF00A2586D /* DirectoryContentsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF46894E1AAC46EF00A2586D /* DirectoryContentsDataSource.swift */; };
BF9F4FCF1AAD7B87004C9500 /* DeltaCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9F4FCE1AAD7B87004C9500 /* DeltaCore.framework */; };
BF9F4FD01AAD7B87004C9500 /* DeltaCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BF9F4FCE1AAD7B87004C9500 /* DeltaCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@ -40,6 +41,9 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
BF090CF11B490D8300DCAB45 /* Delta-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Delta-Bridging-Header.h"; sourceTree = "<group>"; };
BF090CF21B490D8300DCAB45 /* UIDevice+Vibration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+Vibration.h"; sourceTree = "<group>"; };
BF090CF31B490D8300DCAB45 /* UIDevice+Vibration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+Vibration.m"; sourceTree = "<group>"; };
BF46894E1AAC46EF00A2586D /* DirectoryContentsDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryContentsDataSource.swift; sourceTree = "<group>"; };
BF9F4FCE1AAD7B87004C9500 /* DeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BFC134E01AAD82460087AD7B /* SNESDeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SNESDeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@ -69,6 +73,15 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
BF090CEE1B490C1A00DCAB45 /* Extensions */ = {
isa = PBXGroup;
children = (
BF090CF21B490D8300DCAB45 /* UIDevice+Vibration.h */,
BF090CF31B490D8300DCAB45 /* UIDevice+Vibration.m */,
);
name = Extensions;
sourceTree = "<group>";
};
BF46894D1AAC469800A2586D /* Game Selection */ = {
isa = PBXGroup;
children = (
@ -120,6 +133,7 @@
BFFA71E01AAC406100EE9DD1 /* Main.storyboard */,
BF46894D1AAC469800A2586D /* Game Selection */,
BFFB709D1AF99ACA00DE56FE /* Emulation */,
BF090CEE1B490C1A00DCAB45 /* Extensions */,
BFEC732F1AAECCBD00650035 /* Resources */,
BFFA71DA1AAC406100EE9DD1 /* Supporting Files */,
);
@ -129,6 +143,7 @@
BFFA71DA1AAC406100EE9DD1 /* Supporting Files */ = {
isa = PBXGroup;
children = (
BF090CF11B490D8300DCAB45 /* Delta-Bridging-Header.h */,
BFFA71E51AAC406100EE9DD1 /* LaunchScreen.xib */,
BFFA71DB1AAC406100EE9DD1 /* Info.plist */,
);
@ -221,6 +236,7 @@
BFFB709F1AF99B1700DE56FE /* EmulationViewController.swift in Sources */,
BFFA71DD1AAC406100EE9DD1 /* AppDelegate.swift in Sources */,
BF46894F1AAC46EF00A2586D /* DirectoryContentsDataSource.swift in Sources */,
BF090CF41B490D8300DCAB45 /* UIDevice+Vibration.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -333,15 +349,15 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Delta-cubiloonxwcpqtawcqdjabbtttfl/Build/Products/Debug-iphoneos",
);
CLANG_ENABLE_MODULES = YES;
INFOPLIST_FILE = Delta/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_CFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.rileytestut.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Delta/Delta-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
@ -349,15 +365,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Delta-cubiloonxwcpqtawcqdjabbtttfl/Build/Products/Debug-iphoneos",
);
CLANG_ENABLE_MODULES = YES;
INFOPLIST_FILE = Delta/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_CFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.rileytestut.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Delta/Delta-Bridging-Header.h";
};
name = Release;
};

View File

@ -0,0 +1,5 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "UIDevice+Vibration.h"

View File

@ -7,21 +7,26 @@
//
import UIKit
import DeltaCore
import SNESDeltaCore
class EmulationViewController: UIViewController
{
//MARK: - Properties -
/** Properties **/
let game: Game
let emulatorCore: EmulatorCore
@IBOutlet private(set) var controllerView: ControllerView!
//MARK: - Private Properties
@IBOutlet private var controllerViewHeightConstraint: NSLayoutConstraint!
//MARK: - Initializers -
/** Initializers **/
required init(game: Game)
{
self.game = game
self.emulatorCore = SNESEmulatorCore(game: game)
self.emulatorCore = EmulatorCore(game: game)
super.init(nibName: "EmulationViewController", bundle: nil)
}
@ -30,18 +35,20 @@ class EmulationViewController: UIViewController
fatalError("initWithCoder: not implemented.")
}
//MARK: UIViewController
//MARK: - Overrides -
/** Overrides **/
//MARK: - UIViewController
/// UIViewController
override func viewDidLoad()
{
super.viewDidLoad()
let skinURL = self.game.URL.URLByDeletingLastPathComponent?.URLByAppendingPathComponent("Standard.deltaskin")
let controllerSkin = ControllerSkin(URL: skinURL!)
let controllerSkin = ControllerSkin.defaultControllerSkinForGameUTI(self.game.UTI)
self.controllerView.controllerSkin = controllerSkin
print(self.controllerView.intrinsicContentSize())
self.controllerView.addReceiver(self)
self.emulatorCore.setGameController(self.controllerView, atIndex: 0)
}
override func viewDidAppear(animated: Bool)
@ -59,6 +66,12 @@ class EmulationViewController: UIViewController
self.controllerViewHeightConstraint.constant = self.controllerView.intrinsicContentSize().height * scale
}
override func prefersStatusBarHidden() -> Bool
{
return true
}
/// <UIContentContainer>
override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator)
@ -69,9 +82,28 @@ class EmulationViewController: UIViewController
self.controllerView.finishAnimatingUpdateControllerSkin()
}
}
override func prefersStatusBarHidden() -> Bool
}
//MARK: - <GameControllerReceiver> -
/// <GameControllerReceiver>
extension EmulationViewController: GameControllerReceiverType
{
func gameController(gameController: GameControllerType, didActivateInput input: InputType)
{
return true
if UIDevice.currentDevice().supportsVibration
{
UIDevice.currentDevice().vibrate()
}
guard let input = input as? ControllerInput else { return }
print("Activated \(input)")
}
func gameController(gameController: GameControllerType, didDeactivateInput input: InputType)
{
guard let input = input as? ControllerInput else { return }
print("Deactivated \(input)")
}
}

View File

@ -0,0 +1,21 @@
//
// UIDevice+Vibration.h
// Delta
//
// Created by Riley Testut on 7/5/15.
// Copyright © 2015 Riley Testut. All rights reserved.
//
@import UIKit;
NS_ASSUME_NONNULL_BEGIN
@interface UIDevice (Vibration)
@property (nonatomic, readonly, getter=isVibrationSupported) BOOL supportsVibration;
- (void)vibrate;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,78 @@
//
// UIDevice+Vibration.m
// Delta
//
// Created by Riley Testut on 7/5/15.
// Copyright © 2015 Riley Testut. All rights reserved.
//
#import "UIDevice+Vibration.h"
#include <sys/sysctl.h>
@import AudioToolbox;
// Private vibration API declarations
#if !APP_STORE_BUILD
void AudioServicesStopSystemSound(int);
void AudioServicesPlaySystemSoundWithVibration(int, id, NSDictionary *);
#endif
@implementation UIDevice (Vibration)
#pragma mark - Vibration -
- (void)vibrate
{
#if !APP_STORE_BUILD
AudioServicesStopSystemSound(kSystemSoundID_Vibrate);
int64_t vibrationLength = 30;
if ([[self modelGeneration] hasPrefix:@"iPhone6"])
{
// iPhone 5S has a weaker vibration motor, so we vibrate for 10ms longer to compensate
vibrationLength = 40;
}
NSArray *pattern = @[@NO, @0, @YES, @(vibrationLength)];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
dictionary[@"VibePattern"] = pattern;
dictionary[@"Intensity"] = @1;
AudioServicesPlaySystemSoundWithVibration(kSystemSoundID_Vibrate, nil, dictionary);
#endif
}
#pragma mark - Device Info -
- (NSString *)modelGeneration
{
char *type = "hw.machine";
size_t size;
sysctlbyname(type, NULL, &size, NULL, 0);
char *name = malloc(size);
sysctlbyname(type, name, &size, NULL, 0);
NSString *modelName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
free(name);
return modelName;
}
#pragma mark - Getters/Setters -
- (BOOL)isVibrationSupported
{
#if APP_STORE_BUILD || TARGET_IPHONE_SIMULATOR
return NO;
#else
// No way to detect if hardware supports vibration, so we assume if it's not an iPhone, it doesn't have a vibration motor
return [self.model hasPrefix:@"iPhone"];
#endif
}
@end