Remove obsolete project files for MrGameEng.AI, MrGameEng.Assets, MrGameEng.Atlases, and MrGameEng.Collisions modules. Introduce new AssetManager and related classes for asset loading and management, including support for texture atlases and mod definitions. Enhance mod loading capabilities with DefDatabase and LanguageManager for JSON-based definitions and localization. Implement a shelf packing algorithm for efficient texture atlas creation.

This commit is contained in:
Leonid Pershin
2026-06-12 07:47:04 +03:00
parent 1f87fb0b74
commit c30e2ce764
70 changed files with 0 additions and 233 deletions
@@ -0,0 +1,106 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using MrGameEng.Input;
using Xunit;
namespace MrGameEng.Input.Tests;
public class InputManagerTests
{
private static MouseState Mouse(
int x = 0,
int y = 0,
int wheel = 0,
ButtonState left = ButtonState.Released
) =>
new(
x,
y,
wheel,
left,
ButtonState.Released,
ButtonState.Released,
ButtonState.Released,
ButtonState.Released
);
private static void Frame(
InputManager input,
KeyboardState keyboard = default,
MouseState mouse = default
) => input.Apply(keyboard, mouse, GamePadState.Default);
[Fact]
public void KeyPressed_OnlyOnTheFrameItGoesDown()
{
var input = new InputManager();
Frame(input, new KeyboardState(Keys.Space));
Assert.True(input.IsKeyPressed(Keys.Space));
Assert.True(input.IsKeyDown(Keys.Space));
Frame(input, new KeyboardState(Keys.Space));
Assert.False(input.IsKeyPressed(Keys.Space));
Assert.True(input.IsKeyDown(Keys.Space));
}
[Fact]
public void KeyReleased_OnlyOnTheFrameItGoesUp()
{
var input = new InputManager();
Frame(input, new KeyboardState(Keys.A));
Frame(input);
Assert.True(input.IsKeyReleased(Keys.A));
Frame(input);
Assert.False(input.IsKeyReleased(Keys.A));
}
[Fact]
public void Capture_SuppressesInput_KeepsMousePositionAndWheel()
{
var capture = new MrGameEng.Core.InputCapture();
var input = new InputManager(capture);
Frame(input, new KeyboardState(Keys.W), Mouse(x: 10, y: 20, wheel: 120));
Assert.True(input.IsKeyDown(Keys.W));
capture.Captured = true;
input.Update(); // ввод захвачен оверлеем — устройства не опрашиваются
Assert.False(input.IsKeyDown(Keys.W));
Assert.True(input.IsKeyReleased(Keys.W)); // одно корректное событие отпускания
Assert.Equal(new Point(10, 20), input.MousePosition);
Assert.Equal(0, input.WheelDelta);
Assert.Equal(Point.Zero, input.MouseDelta);
input.Update();
Assert.False(input.IsKeyReleased(Keys.W)); // и больше никаких фантомных событий
}
[Fact]
public void MouseDeltaAndWheelDelta_ComputedBetweenFrames()
{
var input = new InputManager();
Frame(input, mouse: Mouse(x: 10, y: 10, wheel: 0));
Frame(input, mouse: Mouse(x: 25, y: 5, wheel: 120));
Assert.Equal(new Point(15, -5), input.MouseDelta);
Assert.Equal(120, input.WheelDelta);
Assert.Equal(new Point(25, 5), input.MousePosition);
}
[Fact]
public void MousePressed_DetectsLeftButtonEdge()
{
var input = new InputManager();
Frame(input, mouse: Mouse());
Frame(input, mouse: Mouse(left: ButtonState.Pressed));
Assert.True(input.IsMousePressed(MouseButton.Left));
Assert.False(input.IsMousePressed(MouseButton.Right));
}
}