using System; using System.Collections.Generic; using System.Linq; using Duality; using Duality.Components; using Duality.Drawing; using Duality.Components.Renderers; namespace BasicMenu { /// /// This Component implements an OnUpdate-based MenuController. /// Pros: Easier to set up, requires only to implement OnUpdate. /// Cons: The controller logic is called on every frame, even when nothing is happening. /// [RequiredComponent(typeof(Camera))] public class UpdateMenuController : MenuController, ICmpUpdatable { [DontSerialize] private Vector2 mousePosition; [DontSerialize] private MenuComponent currentComponent; void ICmpUpdatable.OnUpdate() { // No menus currently active? Switch to StartingMenu - this is checked everytime if (this.currentMenu == null) { this.SwitchToMenu(this.StartingMenu); } mousePosition.X = DualityApp.Mouse.X; mousePosition.Y = DualityApp.Mouse.Y; // check all MenuComponents under the mouse and sort them by Z, // to find the one nearest to the Camera MenuComponent hoveredComponent = this.GameObj.ParentScene.FindComponents() .Where(mc => mc.GameObj.Active && mc.GetAreaOnScreen().Contains(mousePosition)) .OrderBy(mc => mc.GameObj.Transform.Pos.Z) .FirstOrDefault(); // I found my hovered menu component.. is it different from the current one? if (hoveredComponent != currentComponent) { // if the old one is not null, leave it. if (currentComponent != null) { currentComponent.MouseLeave(); } // if the new one is not null, enter it. if (hoveredComponent != null) { hoveredComponent.MouseEnter(); } } // set the current component to the hovered one. currentComponent = hoveredComponent; // did I click the left button and am I hovering a component? do something! if (DualityApp.Mouse.ButtonHit(Duality.Input.MouseButton.Left) && currentComponent != null) { currentComponent.DoAction(); } } } }