diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..91b6c66 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": ".NET Meteor Debugger", + "type": "dotnet-meteor.debugger", + "request": "launch", + "preLaunchTask": "dotnet-meteor: Build" + } + ] +} \ No newline at end of file diff --git a/ManagedDoom.Maui/Game/AggregatedUserInput.cs b/ManagedDoom.Maui/Game/AggregatedUserInput.cs new file mode 100644 index 0000000..0794ac6 --- /dev/null +++ b/ManagedDoom.Maui/Game/AggregatedUserInput.cs @@ -0,0 +1,50 @@ +using ManagedDoom.UserInput; + +namespace ManagedDoom.Maui.Game; + +public class AggregatedUserInput : IUserInput +{ + private readonly IReadOnlyList _userInputs; + + public AggregatedUserInput(IReadOnlyList userInputs) + { + _userInputs = userInputs; + } + + public void BuildTicCmd(TicCmd cmd) + { + cmd.Clear(); + + foreach (var userInput in _userInputs) + { + userInput.BuildTicCmd(cmd); + } + } + + public void Reset() + { + foreach (var userInput in _userInputs) + { + userInput.Reset(); + } + } + + public void GrabMouse() + { + foreach (var userInput in _userInputs) + { + userInput.GrabMouse(); + } + } + + public void ReleaseMouse() + { + foreach (var userInput in _userInputs) + { + userInput.ReleaseMouse(); + } + } + + public int MaxMouseSensitivity { get; } + public int MouseSensitivity { get; set; } +} \ No newline at end of file diff --git a/ManagedDoom.Maui/Game/GameControllerUserInput.cs b/ManagedDoom.Maui/Game/GameControllerUserInput.cs new file mode 100644 index 0000000..913751c --- /dev/null +++ b/ManagedDoom.Maui/Game/GameControllerUserInput.cs @@ -0,0 +1,76 @@ +using ManagedDoom.UserInput; +using Orbit.Input; + +namespace ManagedDoom.Maui.Game; + +public class GameControllerUserInput : IUserInput +{ + private Orbit.Input.GameController? _gameController; + private int _currentIndex; + + public GameControllerUserInput() + { + GameControllerManager.Current.GameControllerConnected += OnGameControllerConnected; + _ = GameControllerManager.Current.StartDiscovery(); + } + + private void OnGameControllerConnected(object? sender, GameControllerConnectedEventArgs args) + { + _gameController = args.GameController; + + _gameController.ButtonChanged += (o, eventArgs) => + { + if (eventArgs.ButtonName == _gameController.North.Name && + eventArgs.IsPressed) + { + _currentIndex = (_currentIndex + TicCmdButtons.WeaponShift) % (7 * TicCmdButtons.WeaponShift); + } + }; + } + + public void BuildTicCmd(TicCmd cmd) + { + if (_gameController is null) + { + return; + } + + if (_gameController.RightShoulder.Trigger.Value > 0) + { + cmd.Buttons |= TicCmdButtons.Attack; + } + + if (_gameController.South.Value) + { + cmd.Buttons |= TicCmdButtons.Use; + } + + if (_gameController.North.Value) + { + cmd.Buttons |= TicCmdButtons.Change; + cmd.Buttons |= (byte)_currentIndex; + } + + cmd.AngleTurn -= (short)(_gameController.RightStick.XAxis.Value * 0x150); + cmd.ForwardMove += (sbyte)(_gameController.LeftStick.YAxis.Value * 0x8); + cmd.SideMove += (sbyte)(_gameController.LeftStick.XAxis.Value * 0x8); + } + + public void Reset() + { + + } + + public void GrabMouse() + { + + } + + public void ReleaseMouse() + { + + } + + public int MaxMouseSensitivity { get; } + public int MouseSensitivity { get; set; } +} \ No newline at end of file diff --git a/ManagedDoom.Maui/Game/MauiDoom.cs b/ManagedDoom.Maui/Game/MauiDoom.cs index 226996a..2c6abb7 100644 --- a/ManagedDoom.Maui/Game/MauiDoom.cs +++ b/ManagedDoom.Maui/Game/MauiDoom.cs @@ -12,6 +12,7 @@ public class MauiDoom : MauiGame private MauiSound _sound; private MauiVideo _video; private MauiUserInput _input; + private GameControllerUserInput _gameController; private CommandLineArgs args; private Config _config; @@ -89,8 +90,6 @@ bool OnUiCommand(UiCommand command) /// protected override void Paint(DrawingContext ctx) { - // base.Paint(ctx); - will not draw background color/gradient in this case - frameCount++; //we draw the game every frame but sending the frameFrac 0 or 1 to interpolate updates @@ -120,7 +119,6 @@ protected override void Paint(DrawingContext ctx) } - /// /// Setup everything /// @@ -157,8 +155,16 @@ void Init(DrawingContext context) } _input = new MauiUserInput(_config, !args.nomouse.Present, OnUiCommand); - - _doom = new Doom(args, _config, _content, _video, _sound, _music, _input); + _gameController = new GameControllerUserInput(); + + _doom = new Doom( + args, + _config, + _content, + _video, + _sound, + _music, + new AggregatedUserInput([_input, _gameController])); _input.Attach(_doom); diff --git a/ManagedDoom.Maui/Game/MauiGame.cs b/ManagedDoom.Maui/Game/MauiGame.cs index 522a98b..da42783 100644 --- a/ManagedDoom.Maui/Game/MauiGame.cs +++ b/ManagedDoom.Maui/Game/MauiGame.cs @@ -1,9 +1,6 @@ using DrawnUi.Maui.Draw; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Orbit.Input; +using KeyboardManager = Orbit.Input.KeyboardManager; namespace DrawnUi.Maui.Game { @@ -30,14 +27,14 @@ public class MauiGame : SkiaLayout, IMauiGame public MauiGame() { - KeyboardManager.KeyDown += OnKeyboardDownEvent; - KeyboardManager.KeyUp += OnKeyboardUpEvent; + KeyboardManager.Current.KeyDown += OnKeyboardDownEvent; + KeyboardManager.Current.KeyUp += OnKeyboardUpEvent; } public override void OnDisposing() { - KeyboardManager.KeyUp -= OnKeyboardUpEvent; - KeyboardManager.KeyDown -= OnKeyboardDownEvent; + KeyboardManager.Current.KeyDown -= OnKeyboardUpEvent; + KeyboardManager.Current.KeyUp -= OnKeyboardDownEvent; base.OnDisposing(); } @@ -149,20 +146,20 @@ public virtual void OnKeyUp(MauiKey key) /// Do not use directly. It's public to be able to send keys to game manually if needed. /// /// - /// - public void OnKeyboardDownEvent(object sender, MauiKey key) + /// + public void OnKeyboardDownEvent(object sender, KeyboardKeyChangeEventArgs eventArgs) { - OnKeyDown(key); + OnKeyDown((MauiKey)eventArgs.Key); // TODO: We don't need both? } /// /// Do not use directly. It's public to be able to send keys to game manually if needed. /// /// - /// - public void OnKeyboardUpEvent(object sender, MauiKey key) + /// + public void OnKeyboardUpEvent(object sender, KeyboardKeyChangeEventArgs eventArgs) { - OnKeyUp(key); + OnKeyUp((MauiKey)eventArgs.Key);// TODO: We don't need both? } diff --git a/ManagedDoom.Maui/Game/MauiUserInput.cs b/ManagedDoom.Maui/Game/MauiUserInput.cs index 141d1a3..875d0cb 100644 --- a/ManagedDoom.Maui/Game/MauiUserInput.cs +++ b/ManagedDoom.Maui/Game/MauiUserInput.cs @@ -265,8 +265,6 @@ public void BuildTicCmd(TicCmd cmd) weaponKeys[5] = IsPressed(DoomKey.Num6); weaponKeys[6] = IsPressed(DoomKey.Num7); - cmd.Clear(); - var strafe = keyStrafe; var speed = keyRun ? 1 : 0; var forward = 0; diff --git a/ManagedDoom.Maui/Game/MauiVideo.cs b/ManagedDoom.Maui/Game/MauiVideo.cs index 5bef14f..e277954 100644 --- a/ManagedDoom.Maui/Game/MauiVideo.cs +++ b/ManagedDoom.Maui/Game/MauiVideo.cs @@ -70,6 +70,7 @@ public MauiVideo( public void Render(SKCanvas canvas, SKRect destination, Doom doom, Fixed frameFrac) { + //if you have problems with System.Threadig.Tasks.Parellel if (DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.DeviceType == DeviceType.Physical) { DrawScreen.Optimize = false; diff --git a/ManagedDoom.Maui/MainPage.xaml.cs b/ManagedDoom.Maui/MainPage.xaml.cs index fd04d47..1947fb8 100644 --- a/ManagedDoom.Maui/MainPage.xaml.cs +++ b/ManagedDoom.Maui/MainPage.xaml.cs @@ -13,13 +13,12 @@ public MainPage() #if IOS Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetPrefersHomeIndicatorAutoHidden(this, true); #endif + } catch (Exception e) { Super.DisplayException(this, e); } } - - } } diff --git a/ManagedDoom.Maui/ManagedDoom.Maui.csproj b/ManagedDoom.Maui/ManagedDoom.Maui.csproj index 89bad80..257524a 100644 --- a/ManagedDoom.Maui/ManagedDoom.Maui.csproj +++ b/ManagedDoom.Maui/ManagedDoom.Maui.csproj @@ -24,7 +24,7 @@ DOOM - com.mauigame.doom + com.tinysoft.doom 1.0 @@ -65,7 +65,8 @@ - + + diff --git a/ManagedDoom.Maui/MauiProgram.cs b/ManagedDoom.Maui/MauiProgram.cs index d64aa1f..e62a1f8 100644 --- a/ManagedDoom.Maui/MauiProgram.cs +++ b/ManagedDoom.Maui/MauiProgram.cs @@ -1,6 +1,7 @@ //#define DEBUG_MOBILE using DrawnUi.Maui.Draw; using Microsoft.Extensions.Logging; +using Orbit.Input; using Plugin.Maui.Audio; namespace ManagedDoom.Maui @@ -31,10 +32,10 @@ public static MauiApp CreateMauiApp() builder .UseMauiApp() .AddAudio() + .UseOrbitInput() #if DEBUG_MOBILE //don't need this to compile, it's for development to simulate mobile screen on desktop .UseDrawnUi(new() { - UseDesktopKeyboard = true, DesktopWindow = new() { Width = 400, @@ -46,7 +47,6 @@ public static MauiApp CreateMauiApp() #else .UseDrawnUi(new() { - UseDesktopKeyboard = true, MobileIsFullscreen = true, DesktopWindow = new() { diff --git a/ManagedDoom.Maui/Platforms/MacCatalyst/AppDelegate.cs b/ManagedDoom.Maui/Platforms/MacCatalyst/AppDelegate.cs index 3ccd39b..6da59e9 100644 --- a/ManagedDoom.Maui/Platforms/MacCatalyst/AppDelegate.cs +++ b/ManagedDoom.Maui/Platforms/MacCatalyst/AppDelegate.cs @@ -1,4 +1,7 @@ -using Foundation; +using System.Diagnostics; +using Foundation; +using Orbit.Input; +using UIKit; namespace ManagedDoom.Maui { @@ -6,5 +9,30 @@ namespace ManagedDoom.Maui public class AppDelegate : MauiUIApplicationDelegate { protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); + + public override void PressesBegan(NSSet presses, UIPressesEvent evt) + { + KeyboardManager.Current.PressesBegan(presses, evt); + //base.PressesBegan(presses, evt); + } + + public override void PressesCancelled(NSSet presses, UIPressesEvent evt) + { + Trace.WriteLine(@"PressesCancelled"); + //KeyboardManager.Current.PressesCancelled(presses, evt); + //base.PressesCancelled(presses, evt); + } + + public override void PressesChanged(NSSet presses, UIPressesEvent evt) + { + Trace.WriteLine(@"PressesChanged"); + //base.PressesChanged(presses, evt); + } + + public override void PressesEnded(NSSet presses, UIPressesEvent evt) + { + KeyboardManager.Current.PressesEnded(presses, evt); + //base.PressesEnded(presses, evt); + } } } diff --git a/ManagedDoom.Shared/ManagedDoom.Shared.csproj b/ManagedDoom.Shared/ManagedDoom.Shared.csproj index 0b5648c..1b93b47 100644 --- a/ManagedDoom.Shared/ManagedDoom.Shared.csproj +++ b/ManagedDoom.Shared/ManagedDoom.Shared.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable True