31 using System.ComponentModel;
32 using System.Collections.Generic;
33 using Microsoft.Xna.Framework.Graphics;
34 using Microsoft.Xna.Framework;
36 using XnaRect = Microsoft.Xna.Framework.Rectangle;
37 using XnaColor = Microsoft.Xna.Framework.Color;
43 private struct Message
47 public TimeSpan Expires;
54 public TimeSpan TimeLeft
59 public Message(
string text, Color color, TimeSpan lifetime )
70 public int MaxMessageCount {
get;
set; }
75 public TimeSpan MessageTime {
get;
set; }
86 fontHeight = value.XnaFont.MeasureString(
"A" ).Y;
94 public Color TextColor {
get;
set; }
99 public Color BackgroundColor
101 get {
return bgColor; }
115 public bool RealTime {
get;
set; }
118 private Image bgImage = null;
120 private float fontHeight;
121 private List<Message> messages =
new List<Message>();
122 private Queue<String> unseen =
new Queue<string>();
124 private Timer removeTimer;
131 : base(
Game.Screen.WidthSafe,
Game.Screen.HeightSafe )
133 removeTimer =
new Timer();
134 removeTimer.Timeout += removeMessages;
139 MaxMessageCount = 20;
140 MessageTime = TimeSpan.FromSeconds( 5 );
148 private void removeMessages()
152 while ( messages.Count > 0 && messages[0].Expired )
154 messages.RemoveAt( 0 );
155 if ( unseen.Count > 0 )
Add( unseen.Dequeue() );
158 if ( messages.Count > 0 )
160 removeTimer.Interval = messages[0].TimeLeft.TotalSeconds;
167 protected override void Draw( Matrix parentTransformation, Matrix transformation )
169 SpriteBatch spriteBatch = Graphics.SpriteBatch;
171 Matrix.CreateTranslation( (
float)Position.X, (
float)Position.Y, 0 )
172 * parentTransformation;
174 spriteBatch.Begin( SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, m );
176 if ( bgImage != null )
177 spriteBatch.Draw( bgImage.XNATexture, Vector2.Zero,
XnaColor.White );
179 for (
int i = 0; i < messages.Count; i++ )
181 spriteBatch.DrawString( this.
Font.XnaFont, messages[i].Text,
new Vector2( 0, i * fontHeight ), messages[i].
Color.AsXnaColor() );
186 base.Draw( parentTransformation, transformation );
189 private void UpdateTexture()
199 for (
int i = 0; i < messages.Count; i++ )
201 Vector2 dims =
Font.XnaFont.MeasureString( messages[i].Text );
202 if ( dims.X > maxW ) maxW = dims.X;
205 bgImage =
new Image( maxW, messages.Count * fontHeight, bgColor );
211 public void Add(
string message )
213 if ( messages.Count > MaxMessageCount )
217 messages.RemoveRange( 0, messages.Count - MaxMessageCount + 1 );
221 unseen.Enqueue( message );
226 messages.Add(
new Message( message, TextColor, MessageTime ) );
229 if ( !removeTimer.Enabled )
231 removeTimer.Interval = MessageTime.TotalSeconds;
241 if ( messages.Count > MaxMessageCount )
245 messages.RemoveRange( 0, messages.Count - MaxMessageCount + 1 );
249 unseen.Enqueue( message );
254 messages.Add(
new Message( message, color, MessageTime ) );
257 if ( !removeTimer.Enabled )
259 removeTimer.Interval = MessageTime.TotalSeconds;
double WidthSafe
Näytön "turvallinen" ts. laiteriippumaton leveys x-suunnassa.
static readonly Color Black
Musta.
double TopSafe
Näytön yläreunan "turvallinen" ts. laiteriippumaton y-koordinaatti.
double LeftSafe
Näytön vasemman reunan "turvallinen" ts. laiteriippumaton x-koordinaatti.
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
static readonly Color Transparent
Läpinäkyvä väri.
Peliluokka reaaliaikaisille peleille.
static readonly Font Default
OletusFontti.
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
double HeightSafe
Näytön "turvallinen" ts. laiteriippumaton korkeus y-suunnassa.