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

Revision 6281, 9.5 KB checked in by mijoliim, 5 years ago (diff)

Wooo versionhallinta

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
184        public void Hitsplat(float Speed, float _Drag, float _MinSpeed, Action _OnStop)
185        {
186            Direction = Vector2.UnitY * -Speed;
187            Drag = 1 - Math.Max(Math.Min(_Drag, 1.0f), 0f);
188            OnStop = _OnStop;
189            MovingUp = true;
190            MinSpeed = _MinSpeed;
191        }
192
193        public override void Update(Time time)
194        {
195            if (SynchronizePositionWithWidget)
196            {
197                FontPosition = VectorConverter.JypeliVectorToXNA(Position);
198            }
199
200            if (MovingUp)
201            {
202                FontPosition += Direction * (float)time.SinceLastUpdate.TotalSeconds;
203                FontPosition = new Vector2(FontPosition.X, (float)Math.Floor(FontPosition.Y));
204                Direction *= Drag;
205
206                if (Direction.Y >= -MinSpeed)
207                {
208                    MovingUp = false;
209                    if (OnStop != null) OnStop.Invoke();
210                }
211            }
212
213            base.Update(time);
214        }
215
216        protected override void Draw(Matrix parentTransformation, Matrix transformation)
217        {
218            spriteBatch.Begin();
219
220            if (DrawTextBorders && (BorderType == TextBorderType.Thin || BorderType == TextBorderType.Thick))
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(-BorderSize,0) + 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                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(0, -BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
232                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
233            }
234
235            if (DrawTextBorders && BorderType == TextBorderType.Thick)
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                spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(BorderSize, -BorderSize) + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextBorderColor,
247                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
248            }
249
250
251            spriteBatch.DrawString(CurrentFont, Text, FontPosition + new Vector2(Game.GraphicsDevice.Viewport.TitleSafeArea.Width / 2, Game.GraphicsDevice.Viewport.TitleSafeArea.Height / 2), TextColor,
252                0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
253
254            spriteBatch.End();
255
256            base.Draw(parentTransformation, transformation);
257        }
258    }
259}
Note: See TracBrowser for help on using the repository browser.