Jypeli 10
The simple game programming library
Label.cs
Siirry tämän tiedoston dokumentaatioon.
1#region MIT License
2/*
3 * Copyright (c) 2009-2011 University of Jyväskylä, Department of Mathematical
4 * Information Technology.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#endregion
25
26/*
27 * Authors: Tomi Karppinen, Tero Jäntti
28 */
29
30using System;
31using FontStashSharp;
32using Jypeli.Widgets;
33using Microsoft.Xna.Framework;
34using Microsoft.Xna.Framework.Graphics;
35
36namespace Jypeli
37{
41 public enum TextSizeMode
42 {
47 None,
48
53
58
62 Wrapped,
63 }
64
65
69 public class Label : BindableWidget
70 {
71 private Font font;
72 private string title = "";
73 private string originalText = "";
74 private string visibleText = "";
76 private int decimalPlaces = 2;
77 private string doubleFormatString = "{0:N2}";
78 private string intFormatString = "{0:D1}";
79 private double _xMargin;
80 private double _yMargin;
81 private bool useDefaultHeight = false;
82 private bool initialized = false;
83 private const double DefaultWidth = 100;
85
86 static double GetDefaultHeight()
87 {
88 Vector2 fontDims = Font.Default.XnaFont.MeasureString( "A" );
89 return fontDims.Y;
90 }
91
95 public virtual string Text
96 {
97 get { return originalText; }
98 set
99 {
100 if ( value == null )
101 throw new ArgumentException( "Text must not be null" );
102 originalText = value;
103 updateSize();
104 }
105 }
106
110 public bool IsTruncated
111 {
112 get { return visibleText.Length < ( originalText.Length ); }
113 }
114
115 Vector3 _textScale = new Vector3(1, 1, 1);
116
121 {
122 get { return new Vector(_textScale.X, _textScale.Y); }
123 set
124 {
125 _textScale = new Vector3((float)value.X, (float)value.Y, 1.0f);
126 updateSize();
127 }
128 }
129
130
135 public int DecimalPlaces
136 {
137 get { return decimalPlaces; }
138 set
139 {
140 decimalPlaces = value;
141 DoubleFormatString = "{0:N" + decimalPlaces + "}";
142 }
143 }
144
145
150 public string DoubleFormatString
151 {
152 get { return doubleFormatString; }
153 set
154 {
155 doubleFormatString = value;
156 UpdateValue();
157 }
158
159 }
160
161
170 public string IntFormatString
171 {
172 get { return intFormatString; }
173 set
174 {
175 intFormatString = value;
176 UpdateValue();
177 }
178
179 }
180
184 public string Title { get; set; }
185
190 {
191 get { return sizeMode; }
192 set { sizeMode = value; updateSize(); }
193 }
194
199 public Vector TextSize { get; private set; }
200
204 public Color TextColor { get; set; }
205
212 {
213 get { return characterColors; }
214 set { characterColors = value; }
215 }
216
220 public virtual Font Font
221 {
222 get { return font; }
223 set { font = value; updateSize(); }
224 }
225
232
239
243 public double XMargin
244 {
245 get { return _xMargin; }
246 set { _xMargin = value; updateSize(); }
247 }
248
252 public double YMargin
253 {
254 get { return _yMargin; }
255 set { _yMargin = value; updateSize(); }
256 }
257
263 public override Vector Size
264 {
265 get
266 {
267 return base.Size;
268 }
269 set
270 {
271 base.Size = value;
272 this.updateSize();
273 }
274 }
275
280 public Label()
281 : this( DefaultWidth, 10 )
282 {
283 sizeMode = TextSizeMode.AutoSize;
284
285 if ( Game.Instance != null )
286 {
287 this.Height = GetDefaultHeight();
288 updateSize();
289 }
290 else
292 }
293
298 public Label( string text )
299 : this( DefaultWidth, 10, text )
300 {
301 sizeMode = TextSizeMode.AutoSize;
302
303 if ( Game.Instance != null )
304 {
305 this.Height = GetDefaultHeight();
306 updateSize();
307 }
308 else
310 }
311
315 public Label( Animation animation )
316 : base( animation )
317 {
319 }
320
326 public Label( double width, double height )
327 : this( width, height, "" )
328 {
329 }
330
337 public Label( double width, double height, string text )
338 : base( width, height, Shape.Rectangle )
339 {
340 this.sizeMode = TextSizeMode.None;
341 this.originalText = text;
343 }
344
345 private void setDefaultHeight()
346 {
347 if ( !useDefaultHeight ) return;
348 this.Height = GetDefaultHeight();
349 }
350
351 private void Initialize()
352 {
353 font = Font.Default;
358 updateSize();
359 initialized = true;
360 UpdateValue();
361 }
362
364 protected override void UpdateValue()
365 {
366 if ( !initialized || !Bound ) return;
367
368 if ( Meter is IntMeter )
369 {
370 int newNumber = ( (IntMeter)Meter ).Value;
371 Text = Title + string.Format( intFormatString, newNumber );
372 }
373 else if ( Meter is DoubleMeter )
374 {
375 double newNumber = ( (DoubleMeter)Meter ).Value;
376 Text = Title + string.Format( doubleFormatString, newNumber );
377 }
378 }
379
383 private void updateSize()
384 {
385 DynamicSpriteFont xnaFont = this.Font.XnaFont;
386 visibleText = (title.Length > 0) ? (title + ": " + originalText) : originalText;
387
388 if ( visibleText.Length == 0 )
389 {
390 this.TextSize = Vector.Zero;
392 return;
393 }
394
395 Vector2 rawTextDims = xnaFont.MeasureString( visibleText );
396 Vector clientArea = new Vector( this.Width - 2 * XMargin, this.Height - 2 * YMargin );
397 Vector fullTextDims = new Vector( _textScale.X * rawTextDims.X, _textScale.Y * rawTextDims.Y );
398 TextSize = new Vector( fullTextDims.X, fullTextDims.Y );
399
400 switch ( SizeMode )
401 {
402 case TextSizeMode.None:
403 TruncateText();
404 break;
405
406 case TextSizeMode.StretchText:
407 _textScale = new Vector( clientArea.X / rawTextDims.X, clientArea.Y / rawTextDims.Y );
408 TextSize = clientArea;
409 break;
410
411 case TextSizeMode.AutoSize:
412 base.Size = PreferredSize = new Vector( fullTextDims.X + 2 * XMargin, fullTextDims.Y + 2 * YMargin );
413 break;
414
415 case TextSizeMode.Wrapped:
416 WrapText();
417 break;
418 }
419
421 }
422
423 private void TruncateText()
424 {
425 double textWidth = this.Width - 2 * XMargin;
426 if ( textWidth <= 0 )
427 {
428 textWidth = this.Width;
429 }
430
431 visibleText = font.TruncateText( Text, textWidth );
432
433 Vector2 textDims = Font.XnaFont.MeasureString( visibleText );
434 TextSize = new Vector( textDims.X, textDims.Y );
435 }
436
437 private void WrapText()
438 {
439 DynamicSpriteFont xnaFont = this.Font.XnaFont;
440 Vector2 rawTextDims = xnaFont.MeasureString( visibleText );
441 Vector2 fullTextDims = new Vector2( _textScale.X * rawTextDims.X, _textScale.Y * rawTextDims.Y );
442
443 if ( Width <= 0 || fullTextDims.X <= Width )
444 return;
445
446 double hardBreak = base.Size.X - 2 * XMargin;
447 double softBreak = Math.Max( hardBreak / 2, hardBreak - 5 * Font.CharacterWidth );
448
449 visibleText = Font.WrapText( visibleText, softBreak, hardBreak );
450 Vector2 textDims = xnaFont.MeasureString( visibleText );
451 base.Size = PreferredSize = new Vector( base.Size.X, textDims.Y + 2 * YMargin );
452 TextSize = new Vector( textDims.X, textDims.Y );
453 }
454
455 private double GetHorizontalAlignment()
456 {
457 switch ( HorizontalAlignment )
458 {
459 case HorizontalAlignment.Center:
460 return 0;
461 case HorizontalAlignment.Left:
462 return ( -Width + TextSize.X ) / 2 + XMargin;
463 case HorizontalAlignment.Right:
464 return ( Width - TextSize.X ) / 2 - XMargin;
465 default:
466 return XMargin;
467 }
468 }
469
470 private double GetVerticalAlignment()
471 {
472 switch ( VerticalAlignment )
473 {
474 case VerticalAlignment.Center:
475 return 0;
476 case VerticalAlignment.Top:
477 return ( Size.Y - TextSize.Y ) / 2 - YMargin;
478 case VerticalAlignment.Bottom:
479 return ( -Size.Y + TextSize.Y ) / 2 + YMargin;
480 default:
481 return YMargin;
482 }
483 }
484
486 public override void Draw( Matrix parentTransformation, Matrix transformation )
487 {
488 Draw( parentTransformation, transformation, visibleText );
489 }
490
492 protected void Draw( Matrix parentTransformation, Matrix transformation, string text )
493 {
494 Matrix m = Matrix.CreateScale( _textScale )
495 * Matrix.CreateTranslation( (float)GetHorizontalAlignment(), (float)GetVerticalAlignment(), 0 )
496 * Matrix.CreateRotationZ( (float)Angle.Radians )
497 * Matrix.CreateTranslation( (float)Position.X, (float)Position.Y, 0 )
498 * parentTransformation;
499
500 if(CharacterColors == null)
501 Renderer.DrawText( text, ref m, Font, TextColor );
502 else
503 Renderer.DrawText(text, ref m, Font, CharacterColors);
504 base.Draw( parentTransformation, transformation );
505 }
506 }
507}
System.Numerics.Vector2 Vector2
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:62
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGa...
Definition: DoubleMeter.cs:11
Fontti.
Definition: Font.cs:24
DynamicSpriteFont XnaFont
Definition: Font.cs:50
static readonly Font Default
Oletusfontti.
Definition: Font.cs:31
string WrapText(string text, double softLineWidth, double hardLineWidth)
Rivittää tekstin.
Definition: Font.cs:298
string TruncateText(string str, double maxLineWidth)
Katkaisee merkkijonon loppupäästä niin että se sopii annettuun pikselileveyteen fontilla kirjoitettun...
Definition: Font.cs:260
double CharacterWidth
Merkin leveys.
Definition: Font.cs:129
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
static void AssertInitialized(Action actionMethod)
Suorittaa aliohjelman kun peli on varmasti alustettu.
static Action InstanceInitialized
Tapahtuu kun Game.Instance on alustettu.
void NotifyParentAboutChangedSizingAttributes()
Should be called whenever properties that might affect layouts are changed.
Definition: Layout.cs:83
override Vector?? Position
Definition: Dimensions.cs:72
virtual Vector PreferredSize
Koko, jota oliolla tulisi olla asettelijan sisällä. Todellinen koko voi olla pienempi,...
Definition: Layout.cs:56
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Mittari, joka mittaa int-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: IntMeter.cs:11
Tekstikenttä.
Definition: Label.cs:70
double XMargin
Marginaali vasemmasta/oikeasta reunasta.
Definition: Label.cs:244
string originalText
Definition: Label.cs:73
TextSizeMode sizeMode
Definition: Label.cs:75
double GetVerticalAlignment()
Definition: Label.cs:470
string IntFormatString
Millä tavalla int numerot muotoillaan.
Definition: Label.cs:171
int DecimalPlaces
Kuinka monta desimaalia näytetään, kun tekstikenttä on sidottu näyttämään desimaalilukua.
Definition: Label.cs:136
Label(double width, double height, string text)
Luo uuden tekstikentän.
Definition: Label.cs:337
Vector TextSize
Näytettävän tekstin koko. Ei välttämättä sama kuin Size.
Definition: Label.cs:199
override Vector Size
Tekstikentän koko. Jos SizeMode on SizeMode.StretchText, teksti venytetään kentän koon mukaiseksi.
Definition: Label.cs:264
void WrapText()
Definition: Label.cs:437
Label()
Luo uuden tekstikentän. Asettaa koon tekstin mukaan.
Definition: Label.cs:280
Label(string text)
Luo uuden tekstikentän annetulla tekstillä. Asettaa koon tekstin mukaan.
Definition: Label.cs:298
double GetHorizontalAlignment()
Definition: Label.cs:455
virtual string Text
Teksti.
Definition: Label.cs:96
Label(double width, double height)
Luo uuden tekstikentän.
Definition: Label.cs:326
Color TextColor
Tekstin väri.
Definition: Label.cs:204
TextSizeMode SizeMode
Kuinka tekstikentän koko määräytyy.
Definition: Label.cs:190
Font font
Definition: Label.cs:71
double _yMargin
Definition: Label.cs:80
string Title
Asettaa tekstin, joka näkyy ennen kiinnitetyn mittarin arvoa.
Definition: Label.cs:184
void Draw(Matrix parentTransformation, Matrix transformation, string text)
Definition: Label.cs:492
string intFormatString
Definition: Label.cs:78
static double GetDefaultHeight()
Definition: Label.cs:86
bool useDefaultHeight
Definition: Label.cs:81
double _xMargin
Definition: Label.cs:79
double YMargin
Marginaali ylä-/alareunasta.
Definition: Label.cs:253
void Initialize()
Definition: Label.cs:351
Color[] characterColors
Definition: Label.cs:84
string visibleText
Definition: Label.cs:74
string title
Definition: Label.cs:72
void updateSize()
Päivittää tekstikentän/tekstin koon ja rivittää tekstin.
Definition: Label.cs:383
override void Draw(Matrix parentTransformation, Matrix transformation)
Piirtää elementin ruudulle
Definition: Label.cs:486
bool IsTruncated
Onko tekstiä katkaistu
Definition: Label.cs:111
Vector3 _textScale
Definition: Label.cs:115
Color[] CharacterColors
Tekstin yksittäisten kirjainten väri. Jos tämä on asetettu, jätetään TextColor-kentän arvo huomioimat...
Definition: Label.cs:212
string DoubleFormatString
Millä tavalla desimaalinumerot muotoillaan. Tämän asettaminen ylikirjoittaa DecimalPlaces asetuksen.
Definition: Label.cs:151
Label(Animation animation)
Luo uuden tekstikentän animaatiolla.
Definition: Label.cs:315
void setDefaultHeight()
Definition: Label.cs:345
override void UpdateValue()
Kutsutaan automaattisesti, kun mittarin arvo on muuttunut. Ylikirjoita tämä koodilla,...
Definition: Label.cs:364
string doubleFormatString
Definition: Label.cs:77
int decimalPlaces
Definition: Label.cs:76
Vector TextScale
Tekstin skaalaus. Oletus (1,1) ; isompi suurempi.
Definition: Label.cs:121
const double DefaultWidth
Definition: Label.cs:83
void TruncateText()
Definition: Label.cs:423
bool initialized
Definition: Label.cs:82
Mittari, joka mittaa erityyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge.
Definition: Meter.cs:100
Suorakulmio.
Definition: Shapes.cs:322
Luokka, joka sisältää metodeita kuvioiden ja tekstuurien piirtämiseen 2D-tasossa.
Definition: Renderer.cs:50
static void DrawText(string text, Vector position, Font font, Color color)
Piirtää tekstiä ruudulle
Definition: Renderer.cs:286
Kuvio.
Definition: Shapes.cs:47
Widget, joka voidaan asettaa näyttämään halutun mittarin arvoa.
bool Bound
Onko komponentti sidottu mittariin.
VerticalAlignment
Asemointi pystysuunnassa.
Definition: View.cs:487
TextSizeMode
Kuinka tekstikentän kokoa käsitellään.
Definition: Label.cs:42
@ AutoSize
Tekstikentän koko asetetaan tekstin koon mukaan.
@ Wrapped
Teksti rivitetään tekstikentän leveyden mukaan.
@ StretchText
Tekstin koko asetetaan tekstikentän koon mukaan.
HorizontalAlignment
Asemointi vaakasuunnassa.
Definition: View.cs:466
Microsoft.Xna.Framework.Matrix Matrix
Definition: Mouse.cs:36
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:85
Väri.
Definition: Color.cs:13
static readonly Color Transparent
Läpinäkyvä väri.
Definition: Color.cs:931
static readonly Color Black
Musta.
Definition: Color.cs:556
2D-vektori.
Definition: Vector.cs:67
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:71
double X
Vektorin X-komponentti.
Definition: Vector.cs:334