source: 2015/26/MikkoL/JRPG/JRPG/JRPG/HUD/TextMenu.cs @ 6415

Revision 6415, 6.2 KB checked in by mijoliim, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6
7using Microsoft.Xna.Framework;
8using Microsoft.Xna.Framework.Graphics;
9
10public class TextMenu
11{
12    public Vector Position { get; set; }
13
14    public BetterLabel TextLabelBase { get; set; }
15    public BetterLabel SelectedTextLabelBase { get; set; }
16
17    public List<BetterLabel> MenuElements { get; set; }
18    public double Offset { get; set; }
19
20    public int StartingItem = 0;
21    public BetterLabel _SelectedItem { get; set; }
22    public int SelectedItem { get; set; }
23    public event Action<int> ActionWhenSelected;
24
25    public bool OnExit { get; set; }
26
27    public bool DrawMenuImage = false;
28    public Widget MenuBackground { get; set; }
29    public Image MenuImage { get; set; }
30    public Vector MenuOffset { get; set; }
31
32    public TextMenu()
33    {
34        Offset = 30;
35        MenuOffset = new Vector(-2, 5);
36        MenuElements = new List<BetterLabel>();
37    }
38
39    public void LoadMenuElements()
40    {
41        JRPG.Game.ClearControls();
42
43        if (DrawMenuImage && MenuImage != null)
44        {
45            MenuBackground = new Widget(MenuImage.Width, MenuImage.Height);
46            MenuBackground.Image = MenuImage;
47            MenuBackground.Position = Position + MenuOffset;
48
49            JRPG.Game.Add(MenuBackground);
50        }
51
52        for (int i = 0; i < MenuElements.Count; i++)
53        {
54            MenuElements[i].FontPosition = VectorConverter.JypeliVectorToXNA(CalculateMenuCenter() + Position + (new Vector(0, -Offset) * i));
55            JRPG.Game.Add(MenuElements[i]);
56        }
57
58        SelectedItem = StartingItem;
59        ChangeMenuItemColor();
60
61        LoadMenuControlsKeyboard();
62        LoadMenuControlsXboxController();
63    }
64
65    public void SetTextBases(SpriteFont Font, TextAlignment Alignment)
66    {
67        TextLabelBase = new BetterLabel(Font, Vector2.Zero, "null", Alignment);
68        TextLabelBase.TextColor = new Microsoft.Xna.Framework.Color(158, 154, 182);
69        SelectedTextLabelBase = TextLabelBase;
70    }
71
72    public void AddMenuElement(BetterLabel betterLabel)
73    {
74        MenuElements.Add(betterLabel);
75    }
76    public void AddMenuElement(string text)
77    {
78        BetterLabel menuElement = new BetterLabel(TextLabelBase.CurrentFont, Vector2.Zero, text, TextLabelBase.Alignment);
79        menuElement.DrawTextBorders = TextLabelBase.DrawTextBorders;
80        menuElement.BorderType = TextLabelBase.BorderType;
81        menuElement.BorderSize = TextLabelBase.BorderSize;
82        menuElement.TextColor = TextLabelBase.TextColor;
83        menuElement.TextBorderColor = TextLabelBase.TextBorderColor;
84
85        MenuElements.Add(menuElement);
86    }
87
88    public void LoadMenuControlsKeyboard()
89    {
90        JRPG.Game.Keyboard.Listen(Key.Up, ButtonState.Pressed, MoveUp, null);
91        JRPG.Game.Keyboard.Listen(Key.Down, ButtonState.Pressed, MoveDown, null);
92        JRPG.Game.Keyboard.Listen(Key.Enter, ButtonState.Pressed, Selected, null);
93        JRPG.Game.Keyboard.Listen(Key.Z, ButtonState.Pressed, Selected, null);
94        JRPG.Game.Keyboard.Listen(Key.Space, ButtonState.Pressed, Selected, null);
95
96        JRPG.Game.Keyboard.Listen(Key.Escape, ButtonState.Pressed, delegate{
97            OnExit = true;
98            Selected();
99        }, null);
100        JRPG.Game.Keyboard.Listen(Key.X, ButtonState.Pressed, delegate
101        {
102            OnExit = true;
103            Selected();
104        }, null);
105    }
106    public void LoadMenuControlsXboxController()
107    {
108        JRPG.Game.ControllerOne.Listen(Button.DPadUp, ButtonState.Pressed, MoveUp, null);
109        JRPG.Game.ControllerOne.Listen(Button.DPadDown, ButtonState.Pressed, MoveDown, null);
110        JRPG.Game.ControllerOne.Listen(Button.A, ButtonState.Pressed, Selected, null);
111        JRPG.Game.ControllerOne.Listen(Button.Start, ButtonState.Pressed, Selected, null);
112
113        JRPG.Game.ControllerOne.Listen(Button.Back, ButtonState.Pressed, delegate
114        {
115            OnExit = true;
116            Selected();
117        }, null);
118        JRPG.Game.ControllerOne.Listen(Button.B, ButtonState.Pressed, delegate
119        {
120            OnExit = true;
121            Selected();
122        }, null);
123    }
124
125    void MoveUp()
126    {
127        if (SelectedItem > 0)
128        {
129            SelectedItem--;
130
131            if (SoundEffects.Menu.Move.IsPlaying)
132            {
133                SoundEffects.Menu.Move.Stop();
134            }
135            SoundEffects.Menu.Move.Play();
136        }
137        ChangeMenuItemColor();
138    }
139    void MoveDown()
140    {
141        if (SelectedItem < MenuElements.Count - 1)
142        {
143            SelectedItem++;
144
145            if (SoundEffects.Menu.Move.IsPlaying)
146            {
147                SoundEffects.Menu.Move.Stop();
148            }
149            SoundEffects.Menu.Move.Play();
150        }
151        ChangeMenuItemColor();
152    }
153    public void ChangeMenuItemColor()
154    {
155        for (int i = 0; i < MenuElements.Count; i++)
156        {
157            if (i != SelectedItem)
158            {
159                MenuElements[i].IsFlashing = false;
160                MenuElements[i].TextColor = TextLabelBase.TextColor;
161            }
162            else if (i == SelectedItem)
163            {
164                MenuElements[i].TextColor = Microsoft.Xna.Framework.Color.White;
165                MenuElements[i].IsFlashing = true;
166            }
167        }
168    }
169
170    void Selected()
171    {
172        JRPG.Game.ClearControls();
173
174        if (SoundEffects.Menu.Move.IsPlaying)
175        {
176            SoundEffects.Menu.Move.Stop();
177        }
178        SoundEffects.Menu.Move.Play();
179
180        if (!Flags.InBattle)
181        {
182            JRPG.Game.LoadOWControlsKeyboard();
183            JRPG.Game.LoadOWControlsXboxController();
184        }
185        else if (Flags.InBattle)
186        {
187
188        }
189
190        if(!OnExit) ActionWhenSelected(SelectedItem);
191
192        if (MenuBackground != null) MenuBackground.Destroy();
193
194        for (int i = 0; i < MenuElements.Count; i++)
195        {
196            MenuElements[i].Destroy();
197        }
198    }
199
200    public Vector CalculateMenuCenter()
201    {
202        return new Vector(0, (MenuElements.Count - 1) * Offset / 2);
203    }
204}
Note: See TracBrowser for help on using the repository browser.