blob: eb81b6b1d3617aed2d8b6086ad67d540db6906bd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#import "view-controller.hh"
#import "controller-adapter-keyboard.hh"
#import "controller-adapter-gamepad.hh"
#import "scene.hh"
@implementation ViewController
{
Scene* _scene;
NSSize _sceneSize;
ControllerAdapterKeyboard* _keyboardController;
NSMutableArray<ControllerAdapterGamepad*>* _gamepadControllers;
}
- (instancetype)initWithFilePath:(NSString*)filePath
{
self = [super initWithNibName:nil bundle:nil];
if (self)
{
_scene = [[Scene alloc] initWithFilePath:filePath];
_sceneSize = [_scene size];
_keyboardController = [[ControllerAdapterKeyboard alloc] init];
_gamepadControllers = [NSMutableArray array];
for (GCController* controller in [GCController controllers])
{
auto gamepad = [controller extendedGamepad];
if (gamepad)
{
auto adapter = [[ControllerAdapterGamepad alloc] initWithProfile:gamepad];
[_gamepadControllers addObject:adapter];
}
}
[self updateControllers];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleControllerConnected:)
name:GCControllerDidConnectNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleControllerDisconnected:)
name:GCControllerDidDisconnectNotification
object:nil];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)loadView
{
auto view = [[SKView alloc] init];
[view setIgnoresSiblingOrder:YES];
[view setShowsFPS:YES];
[view presentScene:_scene];
[self setView:view];
}
- (void)updateControllers
{
// Prefer controllers, then fallback to keyboard input.
if ([_gamepadControllers count] >= 1)
{
[_scene setPrimaryController:[_gamepadControllers objectAtIndex:0]];
if ([_gamepadControllers count] >= 2)
{
[_scene setSecondaryController:[_gamepadControllers objectAtIndex:1]];
}
else
{
[_scene setSecondaryController:_keyboardController];
}
}
else
{
[_scene setPrimaryController:_keyboardController];
[_scene setSecondaryController:nil];
}
}
- (void)handleControllerConnected:(NSNotification*)notification
{
auto controller = (GCController*)[notification object];
auto gamepad = [controller extendedGamepad];
if (gamepad)
{
auto adapter = [[ControllerAdapterGamepad alloc] initWithProfile:gamepad];
[_gamepadControllers addObject:adapter];
}
[self updateControllers];
}
- (void)handleControllerDisconnected:(NSNotification*)notification
{
auto controller = (GCController*)[notification object];
for (auto i = NSUInteger{ [_gamepadControllers count] }; i > 0; --i)
{
auto adapter = [_gamepadControllers objectAtIndex:(i - 1)];
if ([[adapter profile] controller] == controller)
{
[_gamepadControllers removeObjectAtIndex:(i - 1)];
}
}
[self updateControllers];
}
- (NSSize)minimumDisplaySize
{
return _sceneSize;
}
- (NSSize)preferredDisplaySize
{
return NSMakeSize(_sceneSize.width * 3., _sceneSize.height * 3.);
}
@end
|