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

Revision 6415, 7.9 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 ScrollingTextMenu
11{
12    public int MenuElementsToShow = 4;
13
14    public int showMin
15    {
16        get
17        {
18            if (MenuElementsToShow % 2 == 0)
19            {
20                return (int)MenuElementsToShow / 2 - 1;
21            }
22            else return (int)Math.Floor((double)MenuElementsToShow / 2);
23        }
24    }
25    public int showMax
26    {
27        get
28        {
29            if (MenuElementsToShow % 2 == 0)
30            {
31                return MenuElements.Count - showMin - 1;
32            }
33            else return MenuElements.Count - showMin;
34        }
35    }
36
37        public Vector Position { get; set; }
38
39    public BetterLabel TextLabelBase { get; set; }
40    public BetterLabel SelectedTextLabelBase { get; set; }
41
42    public List<BetterLabel> MenuElements { get; set; }
43    public double Offset { get; set; }
44
45    public int StartingItem = 0;
46    public BetterLabel _SelectedItem { get; set; }
47    public int SelectedItem { get; set; }
48    public List<Action> ActionWhenSelected { get; set; }
49    public Action ActionOnExit { get; set; }
50
51    public bool OnExit { get; set; }
52
53    public bool DrawMenuImage = false;
54    public Widget MenuBackground { get; set; }
55    public Image MenuImage { get; set; }
56    public Vector MenuOffset { get; set; }
57
58    public ScrollingTextMenu()
59    {
60        Offset = 30;
61        MenuOffset = new Vector(-2, 5);
62        MenuElements = new List<BetterLabel>();
63        ActionWhenSelected = new List<Action>();
64    }
65
66    public void LoadMenuElements()
67    {
68        JRPG.Game.ClearControls();
69
70        if (DrawMenuImage && MenuImage != null)
71        {
72            MenuBackground = new Widget(MenuImage.Width, MenuImage.Height);
73            MenuBackground.Image = MenuImage;
74            MenuBackground.Position = Position + MenuOffset;
75
76            JRPG.Game.Add(MenuBackground);
77        }
78
79        for (int i = 0; i < MenuElements.Count; i++)
80        {
81            JRPG.Game.Add(MenuElements[i]);
82        }
83
84        SelectedItem = StartingItem;
85
86        ChangeMenuItemColor();
87        SetMenuItemPositions();
88        SetMenuItemVisibility();
89
90        LoadMenuControlsKeyboard();
91        LoadMenuControlsXboxController();
92    }
93
94    public void SetTextBases(SpriteFont Font, TextAlignment Alignment)
95    {
96        TextLabelBase = new BetterLabel(Font, Vector2.Zero, "null", Alignment);
97        TextLabelBase.TextColor = new Microsoft.Xna.Framework.Color(158, 154, 182);
98        SelectedTextLabelBase = TextLabelBase;
99    }
100
101    public void AddMenuElement(BetterLabel betterLabel)
102    {
103        MenuElements.Add(betterLabel);
104    }
105    public void AddMenuElement(string text)
106    {
107        BetterLabel menuElement = new BetterLabel(TextLabelBase.CurrentFont, Vector2.Zero, text, TextLabelBase.Alignment);
108        menuElement.DrawTextBorders = TextLabelBase.DrawTextBorders;
109        menuElement.BorderType = TextLabelBase.BorderType;
110        menuElement.BorderSize = TextLabelBase.BorderSize;
111        menuElement.TextColor = TextLabelBase.TextColor;
112        menuElement.TextBorderColor = TextLabelBase.TextBorderColor;
113
114        MenuElements.Add(menuElement);
115    }
116
117    public void LoadMenuControlsKeyboard()
118    {
119        JRPG.Game.Keyboard.Listen(Key.Up, ButtonState.Pressed, MoveUp, null);
120        JRPG.Game.Keyboard.Listen(Key.Down, ButtonState.Pressed, MoveDown, null);
121        JRPG.Game.Keyboard.Listen(Key.Enter, ButtonState.Pressed, Selected, null);
122        JRPG.Game.Keyboard.Listen(Key.Z, ButtonState.Pressed, Selected, null);
123        JRPG.Game.Keyboard.Listen(Key.Space, ButtonState.Pressed, Selected, null);
124    }
125    public void LoadMenuControlsXboxController()
126    {
127        JRPG.Game.ControllerOne.Listen(Button.DPadUp, ButtonState.Pressed, MoveUp, null);
128        JRPG.Game.ControllerOne.Listen(Button.DPadDown, ButtonState.Pressed, MoveDown, null);
129        JRPG.Game.ControllerOne.Listen(Button.A, ButtonState.Pressed, Selected, null);
130        JRPG.Game.ControllerOne.Listen(Button.Start, ButtonState.Pressed, Selected, null);
131
132        JRPG.Game.ControllerOne.Listen(Button.Back, ButtonState.Pressed, delegate
133        {
134            OnExit = true;
135            Selected();
136        }, null);
137        JRPG.Game.ControllerOne.Listen(Button.B, ButtonState.Pressed, delegate
138        {
139            OnExit = true;
140            Selected();
141        }, null);
142    }
143
144    void MoveUp()
145    {
146        if (SelectedItem > 0)
147        {
148            SelectedItem--;
149            SetMenuItemPositions();
150            if (SoundEffects.Menu.Move.IsPlaying)
151            {
152                SoundEffects.Menu.Move.Stop();
153            }
154            SoundEffects.Menu.Move.Play();
155        }
156        ChangeMenuItemColor();
157    }
158    void MoveDown()
159    {
160        if (SelectedItem < MenuElements.Count - 1)
161        {
162            SelectedItem++;
163            SetMenuItemPositions();
164            if (SoundEffects.Menu.Move.IsPlaying)
165            {
166                SoundEffects.Menu.Move.Stop();
167            }
168            SoundEffects.Menu.Move.Play();
169        }
170        ChangeMenuItemColor();
171    }
172
173    void SetMenuItemPositions()
174    {
175        for (int i = 0; i < MenuElements.Count; i++)
176        {
177            if (SelectedItem > showMin && SelectedItem < showMax)
178            {
179                MenuElements[i].FontPosition = VectorConverter.JypeliVectorToXNA(Position + (new Vector(0, -Offset) * (i - SelectedItem)));
180            }
181            else if (SelectedItem <= showMin)
182            {
183                MenuElements[i].FontPosition = VectorConverter.JypeliVectorToXNA(Position + (new Vector(0, -Offset) * (i - showMin)));
184            }
185
186            SetMenuItemVisibility();
187        }
188    }
189
190    void SetMenuItemVisibility()
191    {
192        for (int i = 0; i < MenuElements.Count; i++)
193        {
194            if (SelectedItem == 0)
195            {
196                if (i <= MenuElementsToShow - 1)
197                {
198                    MenuElements[i].IsVisible = true;
199                }
200                else MenuElements[i].IsVisible = false;
201            }
202            else if (SelectedItem >= showMin && SelectedItem < showMax)
203            {
204                if (i >= SelectedItem - showMin && i <= SelectedItem + MenuElementsToShow - 1 - showMin)
205                {
206                    MenuElements[i].IsVisible = true;
207                }
208                else MenuElements[i].IsVisible = false;
209            }
210        }
211    }
212
213    void ChangeMenuItemColor()
214    {
215        for (int i = 0; i < MenuElements.Count; i++)
216        {
217            if (i != SelectedItem)
218            {
219                MenuElements[i].IsFlashing = false;
220                MenuElements[i].TextColor = TextLabelBase.TextColor;
221            }
222            else if (i == SelectedItem)
223            {
224                MenuElements[i].TextColor = Microsoft.Xna.Framework.Color.White;
225                MenuElements[i].IsFlashing = true;
226            }
227        }
228    }
229
230    void Selected()
231    {
232        JRPG.Game.ClearControls();
233
234        if (SoundEffects.Menu.Move.IsPlaying)
235        {
236            SoundEffects.Menu.Move.Stop();
237        }
238        SoundEffects.Menu.Move.Play();
239
240        if (!Flags.InBattle)
241        {
242            JRPG.Game.LoadOWControlsKeyboard();
243            JRPG.Game.LoadOWControlsXboxController();
244        }
245        else if (Flags.InBattle)
246        {
247
248        }
249
250        if (ActionOnExit != null) ActionOnExit.Invoke();
251
252        if (!OnExit) ActionWhenSelected[SelectedItem].Invoke();
253
254        if (MenuBackground != null) MenuBackground.Destroy();
255
256        Destroy();
257    }
258
259    public void Destroy()
260    {
261        for (int i = 0; i < MenuElements.Count; i++)
262        {
263            MenuElements[i].Destroy();
264        }
265    }
266}
Note: See TracBrowser for help on using the repository browser.