-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMouseClickSystem.cs
More file actions
80 lines (71 loc) · 3.49 KB
/
MouseClickSystem.cs
File metadata and controls
80 lines (71 loc) · 3.49 KB
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
using System;
using Leopotam.EcsLite;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using RTS;
public class MouseClickSystem : IEcsRunSystem
{
private EcsWorld _world;
private EcsFilter _clickableFilter;
private EcsPool<Bounds> _boundsPool;
private EcsPool<Selected> _selectedPool;
private Vector2 _clickStartPosition; // Для отличия клика от выделения
private const float ClickThreshold = 5f; // Минимальное перемещение для выделения (в пикселях)
public MouseClickSystem(EcsWorld world)
{
_world = world;
_clickableFilter = _world.Filter<GameObject>().Inc<Bounds>().Inc<Clickable>().End();
_boundsPool = _world.GetPool<Bounds>();
_selectedPool = _world.GetPool<Selected>();
}
public void Run(IEcsSystems systems)
{
Vector2 mousePosition = Game1.MouseGlobalPosition;
// Если левая кнопка только что нажата
if (Game1.CurrentMouseState.LeftButton == ButtonState.Pressed && Game1.PreviousMouseState.LeftButton == ButtonState.Released)
{
_clickStartPosition = mousePosition;
}
// Если левая кнопка отпущена
else if (Game1.CurrentMouseState.LeftButton == ButtonState.Released && Game1.PreviousMouseState.LeftButton == ButtonState.Pressed)
{
// Проверяем, было ли это кликом (маленькое перемещение) или выделением
float distance = Vector2.Distance(_clickStartPosition, mousePosition);
if (distance < ClickThreshold)
{
// Это клик — проверяем пересечение с объектами
HandleClick(mousePosition);
}
// Иначе — это было выделение (обработано в SelectionInputSystem)
}
// Game1.PreviousMouseState = Game1.CurrentMouseState;
}
private void HandleClick(Vector2 mousePosition)
{
// Сначала снимаем выделение со всех объектов (если нужно одиночное выделение)
foreach (int entity in _clickableFilter)
{
if (_selectedPool.Has(entity))
{
_selectedPool.Del(entity);
}
}
// Проверяем, на какой объект кликнули
foreach (int entity in _clickableFilter)
{
ref GameObject gameObject = ref _world.GetPool<GameObject>().Get(entity);
ref Bounds bounds = ref _boundsPool.Get(entity);
bounds.Rectangle.X = (int)gameObject.Position.X - bounds.Width/2;
bounds.Rectangle.Y = (int)gameObject.Position.Y - bounds.Height/2;
if (bounds.Rectangle.Contains(mousePosition))
{
// Реакция: выделяем объект
_selectedPool.Add(entity);
// Здесь можно добавить другие действия, например:
// - Открыть меню: systems.Get<MenuSystem>().OpenMenu(entity);
// - Выполнить действие: добавить компонент Action (например, MoveTo)
break; // Выделяем только первый попавший объект
}
}
}
}