From 80d29a71edd4506a626c5808d4b69b23e9f93231 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sat, 9 Aug 2025 21:50:42 +0300 Subject: [PATCH] feat: added android platform template --- Engine | 2 +- Platforms/Android/.config/dotnet-tools.json | 36 +++++++ Platforms/Android/Android.csproj | 42 ++++++++ Platforms/Android/AndroidManifest.xml | 10 ++ Platforms/Android/MobileInputs.cs | 90 ++++++++++++++++++ Platforms/Android/Program.cs | 60 ++++++++++++ Platforms/Android/Resources/Drawable/Icon.png | Bin 0 -> 10022 bytes .../Android/Resources/Values/Strings.xml | 4 + Project.sln | 15 +++ 9 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 Platforms/Android/.config/dotnet-tools.json create mode 100644 Platforms/Android/Android.csproj create mode 100644 Platforms/Android/AndroidManifest.xml create mode 100644 Platforms/Android/MobileInputs.cs create mode 100644 Platforms/Android/Program.cs create mode 100644 Platforms/Android/Resources/Drawable/Icon.png create mode 100644 Platforms/Android/Resources/Values/Strings.xml diff --git a/Engine b/Engine index efed24d..a4b8367 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit efed24de2011eb9aad6fbeac38697eb9a7c37e3f +Subproject commit a4b83679b1c45313b57a7a2581547aacf9f3064f diff --git a/Platforms/Android/.config/dotnet-tools.json b/Platforms/Android/.config/dotnet-tools.json new file mode 100644 index 0000000..efabe22 --- /dev/null +++ b/Platforms/Android/.config/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-mgcb": { + "version": "3.8.1.303", + "commands": [ + "mgcb" + ] + }, + "dotnet-mgcb-editor": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor" + ] + }, + "dotnet-mgcb-editor-linux": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-linux" + ] + }, + "dotnet-mgcb-editor-windows": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-windows" + ] + }, + "dotnet-mgcb-editor-mac": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-mac" + ] + } + } +} \ No newline at end of file diff --git a/Platforms/Android/Android.csproj b/Platforms/Android/Android.csproj new file mode 100644 index 0000000..845b1c5 --- /dev/null +++ b/Platforms/Android/Android.csproj @@ -0,0 +1,42 @@ + + + + net9.0-android + 23 + Exe + com.MyCompany.MyGame + 1 + 1.0 + true + true + + + + + + + + + + Content/Content.mgcb + + + + + + + + + + + + + + + + + + diff --git a/Platforms/Android/AndroidManifest.xml b/Platforms/Android/AndroidManifest.xml new file mode 100644 index 0000000..e22c6dc --- /dev/null +++ b/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/Platforms/Android/MobileInputs.cs b/Platforms/Android/MobileInputs.cs new file mode 100644 index 0000000..9055ffc --- /dev/null +++ b/Platforms/Android/MobileInputs.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; + +using Microsoft.Xna.Framework.Input.Touch; + +using Engine.Core; +using Engine.Systems.Input; + +using MyUniverse.Shared.Behaviours.Abstract; + +namespace MyUniverse.Platforms.Android; + +public class MobileInputs : Behaviour, IUpdate, IGameInputs +{ + public Event, IButtonInputs.ButtonCallbackArguments> OnAnyButtonPressed { get; } = new(); + public Event, IButtonInputs.ButtonCallbackArguments> OnAnyButtonReleased { get; } = new(); + + private readonly Dictionary, IButtonInputs.ButtonCallbackArguments>> OnPressed = new(256); + private readonly Dictionary, IButtonInputs.ButtonCallbackArguments>> OnReleased = new(256); + + private TouchCollection touchCollection = default; + + public void RegisterOnPress(IGameInputs.Button key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) + { + if (OnPressed.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments> @event)) + { + @event.AddListener(callback); + return; + } + + @event = new(); + @event.AddListener(callback); + OnPressed.Add(key, @event); + } + + public void UnregisterOnPress(IGameInputs.Button key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) + { + if (OnPressed.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments> @event)) + @event.RemoveListener(callback); + } + + public void RegisterOnRelease(IGameInputs.Button key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) + { + if (OnReleased.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments> @event)) + { + @event.AddListener(callback); + return; + } + + @event = new(); + @event.AddListener(callback); + OnReleased.Add(key, @event); + } + + public void UnregisterOnRelease(IGameInputs.Button key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) + { + if (OnReleased.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments> @event)) + @event.RemoveListener(callback); + } + + public void Update() + { + touchCollection = TouchPanel.GetState(); + + if (touchCollection.Count > 0) + { + TouchLocation touchLocation = touchCollection[(int)IGameInputs.Button.Interact]; + if (touchLocation.State == TouchLocationState.Pressed) + { + if (OnPressed.TryGetValue(IGameInputs.Button.Interact, out Event, IButtonInputs.ButtonCallbackArguments> @event)) + @event.Invoke(this, new(IGameInputs.Button.Interact)); + OnAnyButtonPressed?.Invoke(this, new(IGameInputs.Button.Interact)); + } + else if (touchLocation.State == TouchLocationState.Released) + { + if (OnReleased.TryGetValue(IGameInputs.Button.Interact, out Event, IButtonInputs.ButtonCallbackArguments> @event)) + @event.Invoke(this, new(IGameInputs.Button.Interact)); + OnAnyButtonReleased?.Invoke(this, new(IGameInputs.Button.Interact)); + } + } + } + + public bool IsPressed(IGameInputs.Button button) + { + if (touchCollection.Count > 0) + return false; + + TouchLocation touchLocation = touchCollection[(int)IGameInputs.Button.Interact]; + return touchLocation.State == TouchLocationState.Pressed || touchLocation.State == TouchLocationState.Moved; + } +} diff --git a/Platforms/Android/Program.cs b/Platforms/Android/Program.cs new file mode 100644 index 0000000..2fc0962 --- /dev/null +++ b/Platforms/Android/Program.cs @@ -0,0 +1,60 @@ +using Microsoft.Xna.Framework; + +using Android.App; +using Android.Content.PM; +using Android.OS; +using Android.Views; +using Engine.Integration.MonoGame; +using Engine.Core; +using Engine.Core.Debug; + +namespace MyUniverse.Platforms.Android +{ + [Activity( + Label = "@string/app_name", + MainLauncher = true, + Icon = "@drawable/icon", + AlwaysRetainTaskState = true, + LaunchMode = LaunchMode.SingleInstance, + ScreenOrientation = ScreenOrientation.Portrait, + ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.ScreenSize + )] + public class Program : AndroidGameActivity + { + private MonoGameWindow _game; + private View _view; + + protected override void OnCreate(Bundle bundle) + { + base.OnCreate(bundle); + + Universe universe = new(); + + ILogger logger = new RotatingFileLogger("Logs", "MyGame"); + + universe.InstantiateUniverseObject().SetUniverseObject("Logger") + .BehaviourController.AddBehaviour().Logger = ILogger.Shared = logger; + + universe.InstantiateUniverseObject().SetUniverseObject("Desktop Inputs") + .BehaviourController.AddBehaviour(); + + universe.InstantiateUniverseObject().SetUniverseObject("Visual Managers") + .BehaviourController.AddBehaviour() + .BehaviourController.AddBehaviour(); + + /* For Networking + LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour(); + client.BehaviourController.AddBehaviour(); + universe.OnPreUpdate.AddOneTimeListener((_, _) => client.Connect("localhost", 8888)); + */ + + Shared.UniverseSource.ApplyUniverse(universe); + + _game = new MonoGameWindow(universe); + _view = _game.Services.GetService(typeof(View)) as View; + + SetContentView(_view); + _game.Run(); + } + } +} diff --git a/Platforms/Android/Resources/Drawable/Icon.png b/Platforms/Android/Resources/Drawable/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0e4c41cffb57a41323ea248b93469385acdaf943 GIT binary patch literal 10022 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 + + MyGame + diff --git a/Project.sln b/Project.sln index ed57f5b..72a23b9 100644 --- a/Project.sln +++ b/Project.sln @@ -29,6 +29,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine.Integration.Yaml", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine.Integration.LiteNetLib", "Engine\Engine.Integration\Engine.Integration.LiteNetLib\Engine.Integration.LiteNetLib.csproj", "{7AA22306-772F-45F4-8F30-97EBD1FC124D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "Platforms\Android\Android.csproj", "{6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -159,6 +161,18 @@ Global {7AA22306-772F-45F4-8F30-97EBD1FC124D}.Release|x64.Build.0 = Release|Any CPU {7AA22306-772F-45F4-8F30-97EBD1FC124D}.Release|x86.ActiveCfg = Release|Any CPU {7AA22306-772F-45F4-8F30-97EBD1FC124D}.Release|x86.Build.0 = Release|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Debug|x64.ActiveCfg = Debug|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Debug|x64.Build.0 = Debug|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Debug|x86.ActiveCfg = Debug|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Debug|x86.Build.0 = Debug|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Release|Any CPU.Build.0 = Release|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Release|x64.ActiveCfg = Release|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Release|x64.Build.0 = Release|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Release|x86.ActiveCfg = Release|Any CPU + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -173,5 +187,6 @@ Global {7CC31BC4-38EE-40F4-BBBA-9FC2F4CF6283} = {9059393F-4073-9273-0EEC-2B1BA61B620B} {A15263DB-DF65-4A07-8CA1-33A2919501A0} = {FECFFD54-338F-4060-9161-1E5770D1DC33} {7AA22306-772F-45F4-8F30-97EBD1FC124D} = {9059393F-4073-9273-0EEC-2B1BA61B620B} + {6D4F3E3C-4E89-44A1-B6D3-03627AA8A8AF} = {FECFFD54-338F-4060-9161-1E5770D1DC33} EndGlobalSection EndGlobal