Jypeli 10
The simple game programming library
MessageDisplay.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: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28 */
29
30using System;
31using System.Collections.Generic;
32using Microsoft.Xna.Framework.Graphics;
33using Microsoft.Xna.Framework;
34using XnaColor = Microsoft.Xna.Framework.Color;
35using FontStashSharp;
36
37namespace Jypeli
38{
43 public class MessageDisplay : Widget
44 {
45 private struct Message
46 {
47 public String Text;
48 public Color Color;
49 public TimeSpan Expires;
50
51 public bool Expired
52 {
53 get { return Expires < Game.Time.SinceStartOfGame; }
54 }
55
56 public TimeSpan TimeLeft
57 {
58 get { return Expired ? TimeSpan.Zero : Expires - Game.Time.SinceStartOfGame; }
59 }
60
61 public Message( string text, Color color, TimeSpan lifetime )
62 {
63 Text = text;
64 Color = color;
65 Expires = Game.Time.SinceStartOfGame + lifetime;
66 }
67 }
68
72 public int MaxMessageCount { get; set; }
73
77 public TimeSpan MessageTime { get; set; }
78
82 public Font Font
83 {
84 get { return _font; }
85 set
86 {
87 _font = value;
88 fontHeight = value.XnaFont.MeasureString( "A" ).Y;
90 }
91 }
92
96 public Color TextColor { get; set; }
97
102 {
103 get { return bgColor; }
104 set
105 {
106 bgColor = value;
108 }
109 }
110
117 public bool RealTime { get; set; }
118
120 private Image bgImage = null;
121 private Font _font;
122 private float fontHeight;
123 private List<Message> messages = new List<Message>();
124 private Queue<String> unseen = new Queue<string>();
125
127
132 : base( Game.Screen.WidthSafe, Game.Screen.HeightSafe )
133 {
134 removeTimer = new Timer();
136
139
140 MaxMessageCount = 20;
141 MessageTime = TimeSpan.FromSeconds( 5 );
142 Font = Font.Default;
143
144 // default position to top-left-corner
147 }
148
149 private void RemoveMessages()
150 {
152
153 while ( messages.Count > 0 && messages[0].Expired )
154 {
155 messages.RemoveAt( 0 );
156 if ( unseen.Count > 0 ) Add( unseen.Dequeue() );
157 }
158
159 if ( messages.Count > 0 )
160 {
161 removeTimer.Interval = messages[0].TimeLeft.TotalSeconds;
163 }
164
166 }
167
169 public override void Draw( Matrix parentTransformation, Matrix transformation )
170 {
171 SpriteBatch spriteBatch = Graphics.SpriteBatch;
172 Matrix m =
173 Matrix.CreateTranslation( (float)Position.X, (float)Position.Y, 0 )
174 * parentTransformation;
175
176 spriteBatch.Begin( SpriteSortMode.Immediate, BlendState.AlphaBlend, Graphics.GetDefaultSamplerState(), DepthStencilState.None, RasterizerState.CullCounterClockwise, null, m );
177
178 if ( bgImage != null )
179 spriteBatch.Draw( bgImage.XNATexture, Vector2.Zero, XnaColor.White );
180
181 for ( int i = 0; i < messages.Count; i++ )
182 {
183 Font.XnaFont.DrawText(Graphics.FontRenderer, messages[i].Text, (new Vector2(0, i * fontHeight)).ToSystemNumerics(), messages[i].Color.AsXnaColor().ToSystemDrawing());
184 }
185
186 spriteBatch.End();
187
188 base.Draw( parentTransformation, transformation );
189 }
190
191 private void UpdateTexture()
192 {
193 if ( messages.Count == 0 || bgColor == Color.Transparent )
194 {
195 bgImage = null;
196 return;
197 }
198
199 double maxW = 0;
200
201 for ( int i = 0; i < messages.Count; i++ )
202 {
203 Vector2 dims = Font.XnaFont.MeasureString( messages[i].Text );
204 if ( dims.X > maxW ) maxW = dims.X;
205 }
206
207 if ( maxW > 0 )
208 bgImage = new Image( maxW, messages.Count * fontHeight, bgColor );
209 }
210
214 public void Add( string message )
215 {
216 if ( messages.Count > MaxMessageCount )
217 {
218 if ( RealTime )
219 {
220 messages.RemoveRange( 0, messages.Count - MaxMessageCount + 1 );
221 }
222 else
223 {
224 unseen.Enqueue( message );
225 return;
226 }
227 }
228
229 messages.Add( new Message( message, TextColor, MessageTime ) );
231
232 if ( !removeTimer.Enabled )
233 {
234 removeTimer.Interval = MessageTime.TotalSeconds;
236 }
237 }
238
243 public void Add( IEnumerable<string> strings )
244 {
245 // TODO: optimization?
246 foreach ( string s in strings )
247 Add( s );
248 }
249
253 public void Add( string message, Color color )
254 {
255 if ( messages.Count > MaxMessageCount )
256 {
257 if ( RealTime )
258 {
259 messages.RemoveRange( 0, messages.Count - MaxMessageCount + 1 );
260 }
261 else
262 {
263 unseen.Enqueue( message );
264 return;
265 }
266 }
267
268 messages.Add( new Message( message, color, MessageTime ) );
270
271 if ( !removeTimer.Enabled )
272 {
273 removeTimer.Interval = MessageTime.TotalSeconds;
275 }
276 }
277
281 public override void Clear()
282 {
283 messages.Clear();
285 }
286 }
287}
System.Numerics.Vector2 Vector2
Microsoft.Xna.Framework.Color XnaColor
Fontti.
Definition: Font.cs:24
DynamicSpriteFont XnaFont
Definition: Font.cs:50
static readonly Font Default
Oletusfontti.
Definition: Font.cs:31
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Time.cs:25
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Definition: Graphics.cs:90
override Vector?? Position
Definition: Dimensions.cs:72
Image Image
Olion kuva. Voi olla null, jolloin piirretään vain väri.
Contains graphics resources.
Definition: Graphics.cs:36
static SpriteBatch SpriteBatch
Definition: Graphics.cs:40
static SamplerState GetDefaultSamplerState()
Definition: Graphics.cs:77
static FontStashSharp.Renderer FontRenderer
Definition: Graphics.cs:42
Kuva.
Definition: Image.cs:30
Texture2D XNATexture
Definition: Image.cs:72
Viestikenttä, jolla voi laittaa tekstiä ruudulle. Tätä sinun tuskin tarvitsee itse muodostaa.
List< Message > messages
int MaxMessageCount
Kuinka monta viestiä kerrallaan näytetään.
Queue< String > unseen
MessageDisplay()
Luo uuden viestinäytön.
override void Draw(Matrix parentTransformation, Matrix transformation)
Piirtää elementin ruudulle
TimeSpan MessageTime
Kuinka pitkään yksi viesti näkyy.
void Add(string message, Color color)
Lisää uuden viestin näkymään.
void Add(string message)
Lisää uuden viestin näkymään.
Color BackgroundColor
Tekstin taustaväri.
bool RealTime
Onko näyttö reaaliaikainen (oletuksena ei) Jos on, vanhin viesti poistetaan heti jos viestien maksi...
override void Clear()
Poistaa kaikki lisätyt viestit.
void Add(IEnumerable< string > strings)
Lisää useita tekstirivejä viestinäkymään
Color TextColor
Tekstin väri.
double LeftSafe
Vasemman reunan sijainti johon lisätty pieni marginaali
Definition: View.cs:323
double TopSafe
Yläreunan sijainti johon lisätty pieni marginaali
Definition: View.cs:338
double WidthSafe
Leveys johon lisätty pieni marginaali
Definition: View.cs:343
double HeightSafe
Korkeus johon lisätty pieni marginaali
Definition: View.cs:348
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
Definition: Timer.cs:38
bool Enabled
Ajastin päällä/pois päältä.
Definition: Timer.cs:66
double Interval
Aika sekunneissa, jonka välein TimeOut tapahtuu.
Definition: Timer.cs:87
void Stop()
Pysäyttää ajastimen ja nollaa sen tilan.
Definition: Timer.cs:292
Action Timeout
Tapahtuu väliajoin.
Definition: Timer.cs:44
void Start()
Käynnistää ajastimen.
Definition: Timer.cs:257
Käyttöliittymän komponentti.
Definition: Appearance.cs:6
Microsoft.Xna.Framework.Matrix Matrix
Definition: Mouse.cs:36
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
XnaColor AsXnaColor()
Definition: Color.cs:46
Message(string text, Color color, TimeSpan lifetime)
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:35
2D-vektori.
Definition: Vector.cs:67
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
double X
Vektorin X-komponentti.
Definition: Vector.cs:334