source: 2015/26/MikkoL/JRPG/JRPG/Jypeli/BetterLabel.cs @ 6401

Revision 6401, 9.4 KB checked in by mijoliim, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6using Microsoft.Xna.Framework;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.Graphics;
9
10namespace Jypeli
11{
12    public enum TextAlignment
13    {
14        Left,
15        Right,
16        Center
17    }
18
19    public enum TextBorderType
20    {
21        Thin,
22        Thick
23    }
24
25    public class BetterLabel : Widget
26    {
27        SpriteBatch spriteBatch { get; set; }
28
29        private TextAlignment _Alignment;
30        public TextAlignment Alignment
31        {
32            get
33            {
34                return _Alignment;
35            }
36            set
37            {
38                _Alignment = value;
39                SetFontOrigin();
40            }
41        }
42        public SpriteFont CurrentFont { get; set; }
43        /*
44        public new Vector Position
45        {
46            get
47            {
48                return VectorConverter.XNAVectorToJypeli(FontPosition);
49            }
50            set
51            {
52                FontPosition = VectorConverter.JypeliVectorToXNA(value);
53            }
54        }
55          */
56        public Vector2 FontPosition { get; set; }
57
58        public Vector2 FontPositionSafe
59        {
60            get
61            {
62                return FontPosition + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2);
63            }
64        }
65
66
67        public string Text { get; set; }
68
69        public Vector2 FontOrigin { get; set; }
70
71        public TextBorderType BorderType = TextBorderType.Thick;
72        public bool DrawTextBorders = true;
73
74        public Microsoft.Xna.Framework.Color TextColor { get; set; }
75        public Microsoft.Xna.Framework.Color TextBorderColor { get; set; }
76       
77        public float BorderSize = 2.0f;
78
79        private Timer FlashTimer;
80        private bool _IsFlashing = false;
81        public float FlashSpeed = 0.002f;
82        public bool IsFlashing
83        {
84            get
85            {
86                return _IsFlashing;
87            }
88            set
89            {
90                _IsFlashing = value;
91                if (value)
92                {
93                    FlashTimer.Start();
94                }
95                else if (!value)
96                {
97                    FlashTimer.Stop();
98                }
99            }
100        }
101
102        public bool SynchronizePositionWithWidget = false;
103
104        public BetterLabel(SpriteFont Font, Vector2 Position, string text)
105            : base(0, 0)
106        {
107            Initialize(Font, Position, text);
108        }
109        public BetterLabel(SpriteFont Font, Vector Position, string text)
110            : base(0, 0)
111        {
112            Initialize(Font, VectorConverter.JypeliVectorToXNA(Position), text);
113        }
114        public BetterLabel(SpriteFont Font, Vector2 Position, string text, TextAlignment textAlignment)
115            : base(0, 0)
116        {
117            Initialize(Font, Position, text);
118            Alignment = textAlignment;
119        }
120        public BetterLabel(SpriteFont Font, Vector Position, string text, TextAlignment textAlignment)
121            : base(0, 0)
122        {
123            Initialize(Font, VectorConverter.JypeliVectorToXNA(Position), text);
124            Alignment = textAlignment;
125        }
126
127        private void Initialize(SpriteFont Font, Vector2 Position, string text)
128        {
129            spriteBatch = Jypeli.Graphics.SpriteBatch;
130            CurrentFont = Font;
131            FontPosition = Position;
132            Text = text;
133            TextColor = Microsoft.Xna.Framework.Color.White;
134            TextBorderColor = Microsoft.Xna.Framework.Color.Black;
135
136            SetFontOrigin();
137
138            float LerpAmount = 0;
139            bool Increase = true;
140
141            FlashTimer = new Timer();
142            FlashTimer.Interval = 0.001;
143            FlashTimer.Timeout += delegate
144            {
145                    if (LerpAmount > 1.0f) Increase = false;
146                    else if (LerpAmount < 0.0f) Increase = true;
147
148                    if (Increase)
149                    {
150                        LerpAmount = LerpAmount + FlashSpeed;
151                    }
152                    else if (!Increase)
153                    {
154                        LerpAmount = LerpAmount - FlashSpeed;
155                    }
156
157                    TextColor = Microsoft.Xna.Framework.Color.Lerp(Microsoft.Xna.Framework.Color.White, Microsoft.Xna.Framework.Color.Gold, LerpAmount);
158            };
159        }
160
161        private void SetFontOrigin()
162        {
163            if (_Alignment == TextAlignment.Center)
164            {
165                FontOrigin = CurrentFont.MeasureString(Text) / 2;
166            }
167            else if (_Alignment == TextAlignment.Left)
168            {
169                FontOrigin = new Vector2(0, CurrentFont.MeasureString(Text).Y / 2);
170            }
171            else if (_Alignment == TextAlignment.Right)
172            {
173                FontOrigin = new Vector2(CurrentFont.MeasureString(Text).X, CurrentFont.MeasureString(Text).Y / 2);
174            }
175        }
176
177        private bool MovingUp;
178        private Vector2 Direction;
179        private float Drag;
180        private float MinSpeed;
181        private Action OnStop;
182
183        public void Hitsplat(float Speed, float _Drag, float _MinSpeed, Action _OnStop)
184        {
185            Direction = Vector2.UnitY * -Speed;
186            Drag = Math.Max(Math.Min(_Drag, 1.0f), 0f);
187            OnStop = _OnStop;
188            MovingUp = true;
189            MinSpeed = _MinSpeed;
190        }
191
192        public override void Update(Time time)
193        {
194            if (MovingUp)
195            {
196                float deltaTime = (float)time.SinceLastUpdate.TotalSeconds;
197                FontPosition += Direction * deltaTime;
198                FontPosition = new Vector2(FontPosition.X, (float)Math.Floor(FontPosition.Y));
199
200                Direction *= Drag;
201
202               
203                if (Direction.Y >= -MinSpeed)
204                {
205                    MovingUp = false;
206                    if (OnStop != null) OnStop.Invoke();
207                }
208            }
209
210            base.Update(time);
211        }
212
213        protected override void Draw(Matrix parentTransformation, Matrix transformation)
214        {
215            spriteBatch.Begin();
216
217            if (DrawTextBorders && (BorderType == TextBorderType.Thin || BorderType == TextBorderType.Thick))
218            {
219                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(BorderSize,0) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
220                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
221
222                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(-BorderSize,0) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
223                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
224
225                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(0, BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
226                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
227
228                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(0, -BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
229                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
230            }
231
232            if (DrawTextBorders && BorderType == TextBorderType.Thick)
233            {
234                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(BorderSize, BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
235                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
236
237                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(-BorderSize, -BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
238                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
239
240                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(-BorderSize, BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
241                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
242
243                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(BorderSize, -BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
244                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
245            }
246
247
248            spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextColor,
249                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
250
251            spriteBatch.End();
252
253            base.Draw(parentTransformation, transformation);
254        }
255    }
256}
Note: See TracBrowser for help on using the repository browser.