Jypeli 10
The simple game programming library
LetterPicker.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using Microsoft.Xna.Framework;
3
4namespace Jypeli
5{
9 public class LetterPicker : Label
10 {
11 private int _selectedIndex;
12 private char _selectedCharacter;
14
15 private Touch _touch = null;
16 private double _touchStart = 0;
17 private double _indexDelta = 0;
18 private double _indexVelocity = 0;
19
23 public event Action<LetterPicker> LetterChanged;
24
28 public string Charset { get; set; }
29
31 public override Font Font
32 {
33 get { return base.Font; }
34 set { base.Font = value; UpdateSize(); }
35 }
36
40 public override Vector Size
41 {
42 get { return base.Size; }
43 set { base.Size = value; UpdateSize(); }
44 }
45
49 public int SelectedIndex
50 {
51 get { return _selectedIndex; }
52 set
53 {
54 _selectedIndex = AdvMod( value, Charset.Length );
56 Text = _selectedCharacter.ToString();
58 }
59 }
60
65 {
66 get { return _selectedCharacter; }
67 set
68 {
69 SelectedIndex = Charset.IndexOf( value );
70 _selectedCharacter = value;
71 Text = value.ToString();
73 }
74 }
75
79 public Widget UpArrow { get; set; }
80
84 public Widget DownArrow { get; set; }
85
93 public LetterPicker( double width, double height, string charset = "", char initialCharacter = 'a' )
94 : base( width, height )
95 {
96 Charset = ( charset.Length > 0 ) ? charset : Jypeli.Charset.Alphanumeric + " ";
97 base.Font = new Font(40);
98 SelectedCharacter = initialCharacter;
99 YMargin = 10;
100
101 UpArrow = new Widget( this.Width, 10, Shape.Triangle );
102 UpArrow.Top = this.Height / 2;
104 Add( UpArrow );
105
106 DownArrow = new Widget( this.Width, 10, Shape.Triangle );
107 DownArrow.Bottom = -this.Height / 2;
110 Add( DownArrow );
111
114 }
115
117 {
118 // TODO: make a better clone method, maybe using the DataStorage load / save system
119 var lpClone = new LetterPicker( this.Width, this.Height, this.Charset, this.SelectedCharacter );
120 lpClone.Font = this.Font;
121 lpClone.Color = this.Color;
122 lpClone.BorderColor = this.BorderColor;
123 lpClone.TextColor = this.TextColor;
124 lpClone.TextScale = this.TextScale;
125 lpClone.SizeMode = this.SizeMode;
126 lpClone.UpArrow.Color = this.UpArrow.Color;
127 lpClone.DownArrow.Color = this.DownArrow.Color;
128 lpClone.UpArrow.Animation = this.UpArrow.Animation;
129 lpClone.DownArrow.Animation = this.DownArrow.Animation;
130 lpClone.UpArrow.Angle = this.UpArrow.Angle;
131 lpClone.DownArrow.Angle = this.DownArrow.Angle;
132 return lpClone;
133 }
134
135 private void UpdateSize()
136 {
137 UpArrow.Width = this.Width;
138 DownArrow.Width = this.Width;
139
140 UpArrow.Top = this.Height / 2;
141 DownArrow.Bottom = -this.Height / 2;
142 }
143
144 private void OnLetterChanged()
145 {
146 if ( LetterChanged != null )
147 LetterChanged( this );
148 }
149
150 private void AddControls()
151 {
152 _controls.Add( Game.TouchPanel.ListenOn( this, ButtonState.Pressed, StartDrag, null ).InContext( this ) );
153 _controls.Add( Game.TouchPanel.Listen( ButtonState.Released, EndDrag, null ).InContext( this ) );
154 }
155
156 private void RemoveControls()
157 {
158 // SynchronousList removes every destroyed object automatically
159 _controls.ForEach( c => c.Destroy() );
160 }
161
162 private void StartDrag( Touch touch )
163 {
164 if ( _touch != null )
165 return;
166
167 _touch = touch;
169 }
170
171 private void EndDrag( Touch touch )
172 {
173 if ( _touch != touch )
174 return;
175
176 double delta = _touch != null ? ( _touch.PositionOnScreen.Y - _touchStart ) / TextSize.Y : 0;
177 _touch = null;
178
179 if ( touch.MovementOnScreen.Y < 1 )
180 {
181 // Set the index now
182 SelectedIndex += (int)Math.Round( delta );
183 _indexDelta = 0;
184 }
185 else
186 {
187 // Continue scrolling
188 _indexDelta = delta;
190 }
191 }
192
193 private int AdvMod( int x, int n )
194 {
195 if ( n <= 0 ) return -1;
196 while ( x < 0 ) x += n;
197 while ( x >= n ) x -= n;
198 return x;
199 }
200
202 public override void Update( Time time )
203 {
204 if ( _touch != null )
205 {
207 }
208
209 else if ( _indexVelocity > 0 )
210 {
211 _indexDelta += Math.Sign( _indexDelta ) * _indexVelocity * time.SinceLastUpdate.TotalSeconds;
212 _indexVelocity *= 0.95;
213
214 if ( _indexVelocity < 1.5 )
215 {
216 SelectedIndex += (int) Math.Round( _indexDelta );
217 _indexDelta = 0;
218 _indexVelocity = 0;
219 }
220 }
221
222 _controls.UpdateChanges();
223 base.Update( time );
224 }
225
227 public override void Draw( Matrix parentTransformation, Matrix transformation )
228 {
229 if ( _indexDelta == 0 )
230 {
231 base.Draw( parentTransformation, transformation );
232 return;
233 }
234
235 int indexDeltaInt = (int)Math.Round( _indexDelta );
236 double yDelta = _indexDelta - indexDeltaInt; // for smooth scrolling
237
238 for ( int i = -1; i <= 1; i++ )
239 {
240 Matrix m = Matrix.CreateScale( TextScale )
241 * Matrix.CreateRotationZ( (float)Angle.Radians )
242 * Matrix.CreateTranslation( (float)Position.X, (float)( Position.Y - ( i - yDelta ) * TextSize.Y ), 0 )
243 * parentTransformation;
244
245 int ci = AdvMod( this.SelectedIndex + indexDeltaInt + i, this.Charset.Length );
246 Renderer.DrawText( Charset[ci].ToString(), ref m, Font, TextColor );
247 }
248 }
249 }
250}
Animation(params Image[] frames)
Luo uuden animaation.
Definition: Animation.cs:187
Yleisesti käytettyjä merkkijoukkoja. Voit yhdistellä merkkijoukkoja +:lla.
Definition: Charset.cs:8
static string Alphanumeric
Aakkoset pienillä ja isoilla kirjaimilla a - ö, A - Ö + numerot
Definition: Charset.cs:62
Fontti.
Definition: Font.cs:24
Font(int fontSize=25)
Luo uuden oletusfontin halutulla koolla.
Definition: Font.cs:156
TouchPanel TouchPanel
Kosketusnäyttö
Definition: Controls.cs:62
override Vector?? Position
Definition: Dimensions.cs:72
override Angle?? Angle
Definition: Dimensions.cs:102
override Animation Animation
Animaatio. Voi olla null, jolloin piirretään vain väri.
Definition: Appearance.cs:48
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
virtual Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Definition: Appearance.cs:65
double Top
Olion yläreunan y-koordinaatti.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
double Bottom
Olion alareunan y-koordinaatti.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
Tekstikenttä.
Definition: Label.cs:70
Vector TextSize
Näytettävän tekstin koko. Ei välttämättä sama kuin Size.
Definition: Label.cs:199
virtual string Text
Teksti.
Definition: Label.cs:96
Color TextColor
Tekstin väri.
Definition: Label.cs:204
TextSizeMode SizeMode
Kuinka tekstikentän koko määräytyy.
Definition: Label.cs:190
double YMargin
Marginaali ylä-/alareunasta.
Definition: Label.cs:253
Vector TextScale
Tekstin skaalaus. Oletus (1,1) ; isompi suurempi.
Definition: Label.cs:121
Kirjaimen valitsin.
Definition: LetterPicker.cs:10
Widget UpArrow
Nuoli ylöspäin.
Definition: LetterPicker.cs:79
LetterPicker Clone()
Widget DownArrow
Nuoli alaspäin.
Definition: LetterPicker.cs:84
override Vector Size
Koko
Definition: LetterPicker.cs:41
LetterPicker(double width, double height, string charset="", char initialCharacter='a')
Alustaa uuden kirjainvalitsimen.
Definition: LetterPicker.cs:93
readonly SynchronousList< Listener > _controls
Definition: LetterPicker.cs:13
char SelectedCharacter
Valittu merkki.
Definition: LetterPicker.cs:65
override void Draw(Matrix parentTransformation, Matrix transformation)
Piirtää elementin ruudulle
void StartDrag(Touch touch)
Action< LetterPicker > LetterChanged
Tapahtuu kun kirjainta muutetaan.
Definition: LetterPicker.cs:23
int AdvMod(int x, int n)
int SelectedIndex
Valitun merkin indeksi.
Definition: LetterPicker.cs:50
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
void EndDrag(Touch touch)
override Font Font
Definition: LetterPicker.cs:32
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
static readonly Triangle Triangle
Tasasivuinen kolmio.
Definition: Shapes.cs:78
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan....
Kosketuspaneelin kosketus.
Definition: Touch.cs:39
Vector MovementOnScreen
Kosketuksen liike ruudulla.
Definition: Touch.cs:105
Vector PositionOnScreen
Kosketuksen paikka ruudulla.
Definition: Touch.cs:61
Listener ListenOn(GameObject obj, HoverState hoverstate, ButtonState buttonstate, TouchHandler handler, string helpText)
Kuuntelee kosketusnäyttöä olion päällä.
Definition: TouchPanel.cs:354
Listener Listen(ButtonState state, TouchHandler handler, string helpText)
Kuuntelee kosketusnäyttöä.
Definition: TouchPanel.cs:296
Käyttöliittymän komponentti.
Definition: Appearance.cs:6
Widget(Animation animation)
Alustaa widgetin.
Definition: Widget.cs:14
Color BorderColor
Reunojen väri.
Definition: Appearance.cs:10
Listener InContext(ListenContext context)
Kuuntelee tapahtumaa vain tietyssä kontekstissa.
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
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
static readonly Angle StraightAngle
Oikokulma (180 astetta).
Definition: Angle.cs:54
Angle(double radians)
Definition: Angle.cs:132
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:85
Väri.
Definition: Color.cs:13
Color(XnaColor c)
Definition: Color.cs:38
static readonly Color Red
Punainen.
Definition: Color.cs:866
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:27
2D-vektori.
Definition: Vector.cs:67
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
double X
Vektorin X-komponentti.
Definition: Vector.cs:334