Jypeli  5
The simple game programming library
CountDisplay.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Microsoft.Xna.Framework;
6 
7 namespace Jypeli.Widgets
8 {
9  public class CountDisplay : BindableWidget
10  {
11  int fulls = 0;
12  double part = 0;
13  int empties = 0;
14 
15  Matrix scale = Matrix.Identity;
16  Matrix rotate = Matrix.Identity;
17  Matrix rotateAndScale = Matrix.Identity;
18 
19  Animation _full = null;
20  Animation _empty = null;
21  Vector _imgSize = Vector.Zero;
22  double _spacing = 10;
23 
24  public Animation Full
25  {
26  get { return _full; }
27  set
28  {
29  _full = value;
30  if ( ImageSize == Vector.Zero )
31  ImageSize = value.Size;
32  else
33  UpdateSize();
34  }
35  }
36 
37  public Animation Empty
38  {
39  get { return _empty; }
40  set
41  {
42  _empty = value;
43  if ( ImageSize == Vector.Zero )
44  ImageSize = value.Size;
45  else
46  UpdateSize();
47  }
48  }
49 
50  public Vector ImageSize
51  {
52  get { return _imgSize; }
53  set
54  {
55  _imgSize = value;
56  scale = Matrix.CreateScale( (float)value.X, (float)value.Y, 1f );
57  rotateAndScale = scale * rotate;
58  UpdateSize();
59  }
60  }
61 
62  public override Angle Angle
63  {
64  get
65  {
66  return base.Angle;
67  }
68  set
69  {
70  base.Angle = value;
71  rotate = Matrix.CreateRotationZ( (float)( Angle ).Radians );
72  rotateAndScale = scale * rotate;
73  }
74  }
75 
76  public double Spacing
77  {
78  get { return _spacing; }
79  set
80  {
81  _spacing = value;
82  UpdateSize();
83  }
84  }
85 
86  public CountDisplay()
87  : base( 10, 10 )
88  {
89  this.Color = Color.Transparent;
90  }
91 
92  public CountDisplay(Meter meter)
93  : this()
94  {
95  BindTo(meter);
96  }
97 
98  private void UpdateSize()
99  {
100  double maxval = Bound ? Meter.GetMaxValue() : 10;
101  this.Width = ( ImageSize.X + Spacing ) * Meter.GetMaxValue() - Spacing;
102  this.Height = ImageSize.Y;
103 
104  if (this.Width > Game.Screen.Width)
105  this.Width = Game.Screen.Width;
106  }
107 
108  public override void BindTo( Meter meter )
109  {
110  base.BindTo( meter );
111  UpdateSize();
112  }
113 
114  protected override void UpdateValue()
115  {
116  if ( Meter is IntMeter )
117  {
118  var meter = (IntMeter)Meter;
119  fulls = meter.Value;
120  part = 0;
121  empties = meter.MaxValue - meter.Value;
122  }
123  else if ( Meter is DoubleMeter )
124  {
125  var meter = (DoubleMeter)Meter;
126  fulls = (int)Math.Floor( meter.Value );
127  part = meter.Value - fulls;
128  empties = (int)( meter.MaxValue - fulls );
129  }
130  }
131 
132  protected override void Draw( Matrix parentTransformation, Matrix transformation )
133  {
134  if ( Full == null )
135  {
136  base.Draw( parentTransformation, transformation );
137  return;
138  }
139 
140  float imgdist = (float)( ImageSize.X + Spacing );
141  Matrix toLeft = Matrix.CreateTranslation( (float)( -Width / 2 + Full.Width / 2 ), 0, 0 );
142  Matrix m;
143 
144  // TODO: Optimization?
145  UpdateValue();
146 
147  for ( int i = 0; i < fulls; i++ )
148  {
149  m = rotateAndScale
150  * Matrix.CreateTranslation( (float)Position.X + i * imgdist, (float)Position.Y, 0.0f )
151  * toLeft
152  * parentTransformation;
153 
154  Renderer.DrawImage( Full.CurrentFrame, ref m, Vector.Diagonal );
155  }
156 
157  if ( part > 0 )
158  {
159  double partWidth = ImageSize.X * part;
160 
161  Matrix translateAndRotate = rotate
162  * Matrix.CreateTranslation( (float)Position.X + fulls * imgdist, (float)Position.Y, 0.0f )
163  * toLeft
164  * parentTransformation;
165 
166  Matrix imp = Matrix.CreateScale( (float)partWidth, (float)ImageSize.Y, 1f )
167  * Matrix.CreateTranslation( (float)( partWidth / 2 ), 0, 0 )
168  * Matrix.CreateTranslation( (float)( -ImageSize.X / 2 ), 0, 0 )
169  * translateAndRotate;
170 
171  Matrix imf = scale * translateAndRotate;
172 
174  Renderer.DrawImage( Full.CurrentFrame, ref imf, Vector.Diagonal );
176  }
177 
178  if (Empty != null)
179  {
180  for (int i = fulls; i < fulls + empties; i++)
181  {
182  m = rotateAndScale
183  * Matrix.CreateTranslation((float)Position.X + i * imgdist, (float)Position.Y, 0.0f)
184  * toLeft
185  * parentTransformation;
186 
187  Renderer.DrawImage(Empty.CurrentFrame, ref m, Vector.Diagonal);
188  }
189  }
190 
191  base.Draw( parentTransformation, transformation );
192  }
193  }
194 }
Kuvio.
Definition: Shapes.cs:48
static void DrawImage(Image texture, ref Matrix matrix, Vector wrapSize)
Definition: Renderer.cs:126
Vector Size
Animaation koko. Vector.Zero, jos animaatiossa ei ole yhtään ruutua.
Definition: Animation.cs:167
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
static readonly Rectangle Rectangle
Suorakulmio.
Definition: Shapes.cs:72
override void BindTo(Meter meter)
Asettaa kontrollin seuraamaan mittarin arvoa.
Widget, joka voidaan asettaa näyttämään halutun mittarin arvoa.
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:61
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: Meter.cs:515
static void EndDrawingInsideShape()
Definition: Renderer.cs:257
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Definition: Game.cs:194
static readonly Color Transparent
Läpinäkyvä väri.
Definition: Color.cs:869
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
override void Draw(Matrix parentTransformation, Matrix transformation)
Mittari, joka mittaa int-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: Meter.cs:387
static readonly Vector Diagonal
Diagonaalivektori (1,1)
Definition: Vector.cs:76
Väri.
Definition: Color.cs:13
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:56
Luokka, joka sisältää metodeita kuvioiden ja tekstuurien piirtämiseen 2D-tasossa. ...
Definition: Renderer.cs:51
2D-vektori.
Definition: Vector.cs:56
override void UpdateValue()
Kutsutaan automaattisesti, kun mittarin arvo on muuttunut. Ylikirjoita tämä koodilla, joka muuttaa widgetin ulkonäköä asianmukaisesti.
double Width
Näytön leveys x-suunnassa.
Definition: View.cs:66
Mittari, joka mittaa erityyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: Meter.cs:60
static void BeginDrawingInsideShape(Shape shape, ref Matrix transformation)
Makes all the subsequent draw calls until EndDrawingInsideShape limit the drawing inside shape (trans...
Definition: Renderer.cs:239