Skip to content

Commit 7b8e398

Browse files
committed
Improvements for Windows
1 parent cfac5aa commit 7b8e398

File tree

9 files changed

+123
-38
lines changed

9 files changed

+123
-38
lines changed

engine/Orbit.Input/ButtonElement.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,23 @@ protected void SetState(ref bool field, bool newValue, [CallerMemberName] string
1717
{
1818
ArgumentNullException.ThrowIfNull(buttonName);
1919

20-
field = newValue;
21-
22-
this.controller.RaiseButtonPressed(elementName + buttonName, field);
20+
if (field != newValue)
21+
{
22+
field = newValue;
23+
24+
this.controller.RaiseButtonPressed(elementName + buttonName, field);
25+
}
2326
}
2427

2528
protected void SetValue(ref float field, float newValue, [CallerMemberName] string? buttonName = null)
2629
{
2730
ArgumentNullException.ThrowIfNull(buttonName);
28-
29-
field = newValue;
30-
31-
this.controller.RaiseButtonValueChanged(elementName + buttonName, field);
31+
32+
if (Math.Abs(field - newValue) < 0.0001f)
33+
{
34+
field = newValue;
35+
36+
this.controller.RaiseButtonValueChanged(elementName + buttonName, field);
37+
}
3238
}
3339
}

engine/Orbit.Input/GameController.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,12 @@ internal void RaiseButtonValueChanged(string button, float value)
116116
private void SetState(ref bool field, bool newValue, [CallerMemberName] string? buttonName = null)
117117
{
118118
ArgumentNullException.ThrowIfNull(buttonName);
119-
120-
field = newValue;
121-
122-
this.RaiseButtonPressed(buttonName, field);
119+
120+
if (field != newValue)
121+
{
122+
field = newValue;
123+
124+
this.RaiseButtonPressed(buttonName, field);
125+
}
123126
}
124127
}

engine/Orbit.Input/MauiAppBuilderExtensions.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public static MauiAppBuilder UseOrbitInput(
2626
this MauiAppBuilder builder,
2727
Action<GameControllerOptions>? configureControllerOptions = null)
2828
{
29+
var controllerOptions = new GameControllerOptions();
30+
configureControllerOptions?.Invoke(controllerOptions);
31+
2932
builder.ConfigureLifecycleEvents(appLifecycle =>
3033
{
3134
#if ANDROID
@@ -36,10 +39,7 @@ public static MauiAppBuilder UseOrbitInput(
3639
android.OnCreate((activity, bundle) =>
3740
{
3841
if (!appCreated)
39-
{
40-
var controllerOptions = new GameControllerOptions();
41-
configureControllerOptions?.Invoke(controllerOptions);
42-
42+
{
4343
appCreated = true;
4444

4545
if (controllerOptions.AutoAttachToLifecycleEvents)
@@ -55,6 +55,10 @@ public static MauiAppBuilder UseOrbitInput(
5555
#endif
5656
});
5757

58+
#if WINDOWS
59+
GameControllerManager.Current.StartControllerMonitoringUponDetection = controllerOptions.StartControllerMonitoringUponDetection;
60+
#endif
61+
5862
return builder;
5963
}
6064
}

engine/Orbit.Input/Orbit.Input.csproj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,13 @@
4747
</PropertyGroup>
4848

4949
<ItemGroup>
50-
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)"/>
50+
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
51+
</ItemGroup>
52+
53+
<ItemGroup>
54+
<Compile Update="Platforms\Windows\GameControllerOptions.cs">
55+
<ExcludeFromCurrentConfiguration>false</ExcludeFromCurrentConfiguration>
56+
</Compile>
5157
</ItemGroup>
5258

5359
</Project>

engine/Orbit.Input/Platforms/Windows/GameController.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace Orbit.Input;
55
public partial class GameController
66
{
77
private readonly Gamepad gamepad;
8+
private CancellationTokenSource? cancellationTokenSource;
89

910
public GameController(Gamepad gamepad)
1011
{
@@ -18,6 +19,32 @@ public GameController(Gamepad gamepad)
1819
RightShoulder = new Shoulder(this, nameof(RightShoulder));
1920
}
2021

22+
public void StartUpdates(TimeSpan updateFrequency)
23+
{
24+
if (this.cancellationTokenSource is not null)
25+
{
26+
return;
27+
}
28+
29+
this.cancellationTokenSource = new();
30+
31+
Task.Run(async () =>
32+
{
33+
while (this.cancellationTokenSource?.IsCancellationRequested is false)
34+
{
35+
Update();
36+
37+
await Task.Delay(updateFrequency);
38+
}
39+
});
40+
}
41+
42+
public void StopUpdates()
43+
{
44+
this.cancellationTokenSource?.Cancel();
45+
this.cancellationTokenSource = null;
46+
}
47+
2148
private void Update()
2249
{
2350
var reading = gamepad.GetCurrentReading();

engine/Orbit.Input/Platforms/Windows/GameControllerManager.cs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,40 @@ public partial class GameControllerManager
77
private GameControllerManager()
88
{
99
}
10-
11-
public partial Task Initialize()
12-
{
13-
var gamePads = Gamepad.Gamepads;
1410

15-
foreach (var gamePad in gamePads)
16-
{
17-
gameControllers.Add(new GameController(gamePad));
18-
}
11+
public bool StartControllerMonitoringUponDetection { get; set; } = true;
12+
13+
public TimeSpan ControllerUpdateFrequency { get; set; } = TimeSpan.FromMicroseconds(100);
14+
15+
public partial Task StartDiscovery()
16+
{
17+
Gamepad.GamepadAdded += OnGamepadAdded;
18+
RawGameController.RawGameControllerAdded += OnRawGameControllerAdded;
1919

2020
return Task.CompletedTask;
2121
}
22+
23+
private void OnRawGameControllerAdded(object? sender, RawGameController rawGameController)
24+
{
25+
var barry = new bool[rawGameController.ButtonCount];
26+
var sarry = new GameControllerSwitchPosition[rawGameController.SwitchCount];
27+
var aarry = new double[rawGameController.AxisCount];
28+
rawGameController.GetCurrentReading(barry, sarry, aarry);
29+
30+
//var controller = new GameController(rawGameController);
31+
//gameControllers.Add(controller);
32+
//GameControllerConnected?.Invoke(this, new GameControllerConnectedEventArgs(controller));
33+
}
34+
35+
private void OnGamepadAdded(object? sender, Gamepad gamepad)
36+
{
37+
var controller = new GameController(gamepad);
38+
gameControllers.Add(controller);
39+
GameControllerConnected?.Invoke(this, new GameControllerConnectedEventArgs(controller));
40+
41+
if (StartControllerMonitoringUponDetection)
42+
{
43+
controller.StartUpdates(ControllerUpdateFrequency);
44+
}
45+
}
2246
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Orbit.Input;
2+
3+
public partial class GameControllerOptions
4+
{
5+
public bool StartControllerMonitoringUponDetection { get; set; } = true;
6+
7+
public TimeSpan ControllerUpdateFrequency { get; set; } = TimeSpan.FromMicroseconds(100);
8+
}

games/Platformer/MainPage.xaml.cs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public partial class MainPage : ContentPage
99
{
1010
private Orbit.Input.GameController? gameController;
1111
private readonly Orbit.Input.GameControllerManager gameControllerManager;
12-
private readonly IGameSceneManager gameSceneManager;
12+
private readonly IGameSceneManager gameSceneManager;
1313
private readonly PlayerStateManager playerStateManager;
1414
private readonly SettingsService settingsService;
1515

@@ -25,38 +25,43 @@ public MainPage(
2525
this.playerStateManager = playerStateManager;
2626
this.settingsService = settingsService;
2727
this.gameControllerManager = gameControllerManager;
28-
28+
2929
// TODO: disconnected.
30-
this.gameControllerManager.GameControllerConnected += GameControllerManagerOnGameControllerConnected;
30+
this.gameControllerManager.GameControllerConnected += OnGameControllerConnected;
3131
_ = this.gameControllerManager.StartDiscovery();
3232

3333
gameSceneManager.LoadScene<FirstScene>(GameView);
3434
gameSceneManager.Start();
3535
}
3636

37-
private void GameControllerManagerOnGameControllerConnected(object? sender, GameControllerConnectedEventArgs e)
37+
private void OnGameControllerConnected(object? sender, GameControllerConnectedEventArgs e)
3838
{
3939
if (this.gameController is not null)
4040
{
4141
return;
4242
}
43-
43+
4444
this.gameController = e.GameController;
45-
45+
4646
this.gameController.When(
4747
button: "LeftStickXAxis", // TODO: need something more concrete
4848
changesValue: value =>
4949
{
50-
if (value < 0)
50+
if (Math.Abs(value) < 0.0001f)
51+
{
52+
return;
53+
}
54+
55+
if (value < 0.0000001f)
5156
{
5257
this.playerStateManager.State = CharacterState.MovingLeft;
5358
}
54-
else if (value > 0)
59+
else if (value > 0.0000001f)
5560
{
5661
this.playerStateManager.State = CharacterState.MovingRight;
5762
}
5863
});
59-
64+
6065
this.gameController.When(
6166
button: "ButtonSouth",
6267
isPressed: isPressed =>
@@ -79,7 +84,7 @@ void OnGameViewEndInteraction(object sender, TouchEventArgs e)
7984
void OnGameViewStartInteraction(object sender, TouchEventArgs e)
8085
{
8186
}
82-
87+
8388
private void OnJumpButtonPressed(object? sender, EventArgs e)
8489
{
8590
this.playerStateManager.State = CharacterState.Jumping;
@@ -89,12 +94,12 @@ private void OnLeftButtonPressed(object? sender, EventArgs e)
8994
{
9095
this.playerStateManager.State = CharacterState.MovingLeft;
9196
}
92-
97+
9398
private void OnRightButtonPressed(object? sender, EventArgs e)
9499
{
95100
this.playerStateManager.State = CharacterState.MovingRight;
96101
}
97-
102+
98103
private void OnJumpButtonReleased(object? sender, EventArgs e)
99104
{
100105
this.playerStateManager.State = CharacterState.Idle;
@@ -104,7 +109,7 @@ private void OnLeftButtonReleased(object? sender, EventArgs e)
104109
{
105110
this.playerStateManager.State = CharacterState.Idle;
106111
}
107-
112+
108113
private void OnRightButtonReleased(object? sender, EventArgs e)
109114
{
110115
this.playerStateManager.State = CharacterState.Idle;

games/Platformer/MauiProgram.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public static MauiApp CreateMauiApp()
1919
{
2020
#if ANDROID
2121
controllerOptions.AutoAttachToLifecycleEvents = true;
22+
#elif WINDOWS
23+
controllerOptions.ControllerUpdateFrequency = TimeSpan.FromMilliseconds(16);
2224
#endif
2325
})
2426
.ConfigureFonts(fonts =>
@@ -38,7 +40,7 @@ public static MauiApp CreateMauiApp()
3840

3941
builder.Services.AddSingleton<PlayerStateManager>();
4042
builder.Services.AddSingleton<SettingsService>();
41-
builder.Services.AddSingleton<GameControllerManager>();
43+
builder.Services.AddSingleton(GameControllerManager.Current);
4244

4345
return builder.Build();
4446
}

0 commit comments

Comments
 (0)