source: 2015/koodauskerho/otjojunt/Turtle/Turtle/Turtle/Turtle.cs @ 7103

Revision 7103, 7.7 KB checked in by otjojunt, 5 years ago (diff)

Lisätty piirron asettaminen päälle ja pois, värin vaihtaminen ja viivan paksuuden vaihtaminen. Myös nimeämisiä muutettu selkeämmäksi käyttää.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Turtle : PhysicsGame
10{
11    // Kääntymiseen tarvittavat muuttujat
12    Timer turnTimer = null;
13    double turnSpeed = 250.0;
14    Angle? turnTarget = null;
15
16    // Liikkumiseen tarvittavat muuttujat
17    Timer moveTimer = null;
18    double moveSpeed = 250.0;
19    Vector? moveTarget = null;
20
21    GameObject currentObject = null;
22
23    Boolean drawingOn = true;
24    double drawingWidth = 2.0;
25    Color lineColor = Color.Black;
26
27    // Käskyt sisältävä jono
28    Queue<Action> actionQueue = new Queue<Action>();
29
30    PhysicsObject turtle;
31    Image turtleKuva = LoadImage("turtle");
32
33    /// <summary>
34    /// Laitetaan kilpikonna liikkeelle
35    /// </summary>
36    public override void Begin()
37    {
38        turtle = new PhysicsObject(99, 69);
39        turtle.Image = turtleKuva;
40        Add(turtle);
41
42        LisaaKaskyt();
43
44        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
45        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
46
47        Camera.ZoomFactor = 0.5;
48
49        SeuraavaKasky();
50    }
51
52    /// <summary>
53    /// Aliohjelma, jossa kilpikonnalle menevät käskyt lisätään
54    /// </summary>
55    public void LisaaKaskyt()
56    {
57        // TODO: Lisää tähän kilpikonnalle menevät käskyt.
58        // Esimerkiksi: Liiku(100.0);
59
60    }
61
62    /// <summary>
63    /// Liikutetaan kilpikonnaa pään osoittamaan suuntaan.
64    /// </summary>
65    /// <param name="pituus">Liikkeen pituus</param>
66    protected void MoveTo(double pituus)
67    {
68        if (moveTimer == null)
69        {
70            moveTimer = new Timer();
71            moveTimer.Timeout += MoveToTarget;
72            moveTimer.Interval = 0.01;
73        }
74        else if (moveTimer.Enabled)
75            moveTimer.Stop();
76
77        if (drawingOn)
78        {
79            currentObject = new GameObject(0, drawingWidth);
80            currentObject.AbsolutePosition = turtle.AbsolutePosition;
81            currentObject.AbsoluteAngle = turtle.AbsoluteAngle;
82            currentObject.Color = lineColor;
83            Add(currentObject);
84        }
85        moveTarget = turtle.AbsolutePosition + Vector.FromLengthAndAngle(pituus, turtle.AbsoluteAngle);
86        moveTimer.Start();
87    }
88
89    /// <summary>
90    /// Aliohjelma joka hoitaa kilpikonnan liikuttamisen.
91    /// </summary>
92    protected void MoveToTarget()
93    {
94        if (!moveTarget.HasValue)
95        {
96            moveTimer.Stop();
97            return;
98        }
99
100        Vector d = moveTarget.Value - turtle.AbsolutePosition;
101        double vt = moveSpeed * moveTimer.Interval;
102
103        if (d.Magnitude < vt)
104        {
105            moveTimer.Stop();
106            turtle.AbsolutePosition = moveTarget.Value;
107            moveTarget = null;
108            SeuraavaKasky();
109            if (drawingOn)
110            {
111                currentObject.Size += new Vector(d.Magnitude, 0);
112                currentObject.AbsolutePosition += Vector.FromLengthAndAngle(d.Magnitude / 2, d.Angle);
113            }
114        }
115        else
116        {
117            if (drawingOn)
118            {
119                currentObject.Size += new Vector(vt, 0);
120                currentObject.AbsolutePosition += Vector.FromLengthAndAngle(vt / 2, d.Angle);
121            }
122            turtle.AbsolutePosition += Vector.FromLengthAndAngle(vt, d.Angle);
123        }
124    }
125
126    /// <summary>
127    /// Käännetään kilpikonnaa. Kilpikonna kääntyy vastapäivään, eli jos haluat
128    /// kääntää kilpikonnaa myötäpäivään esim. 90 astetta, on se silloin 270
129    /// astetta. (360-90=270)
130    /// </summary>
131    /// <param name="asteet">Kulma asteina</param>
132    protected void TurnTo(double asteet)
133    {
134        if (turnTimer == null)
135        {
136            turnTimer = new Timer();
137            turnTimer.Timeout += TurnToTarget;
138            turnTimer.Interval = 0.01;
139        }
140        else if (turnTimer.Enabled)
141            turnTimer.Stop();
142
143        turnTarget = turtle.Angle + Angle.FromDegrees(asteet);
144        turnTimer.Start();
145    }
146
147    /// <summary>
148    /// Aliohjelma, joka hoitaa kilpikonnan kääntämisen
149    /// </summary>
150    protected void TurnToTarget()
151    {
152        if (!turnTarget.HasValue)
153        {
154            turnTimer.Stop();
155            return;
156        }
157
158        Angle angleLeft = turnTarget.Value - turtle.Angle;
159        Angle angleSingleInterval = Angle.FromDegrees(turnSpeed) * turnTimer.Interval;
160
161        if (angleLeft.GetPositiveDegrees() < angleSingleInterval.GetPositiveDegrees())
162        {
163            turnTimer.Stop();
164            turtle.Angle = turnTarget.Value;
165            turnTarget = null;
166            SeuraavaKasky();
167        }
168        else
169        {
170            turtle.AbsoluteAngle += angleSingleInterval;
171        }
172    }
173
174    /// <summary>
175    /// Laittaa piirtämisen päälle
176    /// </summary>
177    protected void DrawingOn()
178    {
179        drawingOn = true;
180        SeuraavaKasky();
181    }
182
183    /// <summary>
184    /// Ottaa piirtämisen pois päältä
185    /// </summary>
186    protected void DrawingOff()
187    {
188        drawingOn = false;
189        SeuraavaKasky();
190    }
191   
192    /// <summary>
193    /// Asettaa piirtojäljen paksuuden
194    /// </summary>
195    /// <param name="paksuus">Kuinka paksua jälkeä piirretään</param>
196    protected void DrawingWidth(double paksuus)
197    {
198        drawingWidth = paksuus;
199        SeuraavaKasky();
200    }
201
202    /// <summary>
203    /// Asettaa piirtojäljen värin
204    /// </summary>
205    /// <param name="color">Minkä väristä jälkeä piirretään</param>
206    protected void DrawingColor(Color color)
207    {
208        lineColor = color;
209        SeuraavaKasky();
210    }
211
212    /// <summary>
213    /// Aliohjelma seuraavan käskyn suorittamista varten. Kutsutaan aina kun
214    /// yksi käsky on saatu suoritettua loppuun.
215    /// </summary>
216    protected void SeuraavaKasky()
217    {
218        if (actionQueue.Count <= 0)
219            return;
220        Action seuraava = actionQueue.Dequeue();
221        seuraava();
222    }
223
224    /// <summary>
225    /// Liikuttaa kilpikonnaa suoraan
226    /// </summary>
227    /// <param name="pituus">Matka, jonka kilpikonna kulkee</param>
228    public void Liiku(double pituus)
229    {
230        actionQueue.Enqueue(delegate { MoveTo(pituus); });
231    }
232
233    /// <summary>
234    /// Kääntää kilpikonnaa. Kilpikonna kääntyy vastapäivään, eli jos haluat
235    /// kääntää kilpikonnaa myötäpäivään esim. 90 astetta, on se silloin 270
236    /// astetta. (360-90=270)
237    /// </summary>
238    /// <param name="kulma">Kulma asteina</param>
239    public void Kaanny(double kulma)
240    {
241        actionQueue.Enqueue(delegate { TurnTo(kulma); });
242    }
243
244    /// <summary>
245    /// Laittaa kilpikonnan piirtämään viivaa peräänsä
246    /// </summary>
247    public void PiirtoPaalle()
248    {
249        actionQueue.Enqueue(DrawingOn);
250    }
251
252    /// <summary>
253    /// Ottaa kilpikonnan piirtämän viivan pois päältä
254    /// </summary>
255    public void PiirtoPois()
256    {
257        actionQueue.Enqueue(DrawingOff);
258    }
259
260    /// <summary>
261    /// Asettaa kilpikonnan piirtämän viivan paksuuden.
262    /// </summary>
263    /// <param name="paksuus">Kunka paksua viivaa piirretään</param>
264    public void AsetaViivanPaksuus(double paksuus)
265    {
266        actionQueue.Enqueue(delegate { DrawingWidth(paksuus); });
267    }
268
269    /// <summary>
270    /// Asettaa kilpikonnan piirtämän viivan värin.
271    /// </summary>
272    /// <param name="vari">Piirrettävän viivan väri</param>
273    public void AsetaVari(Color vari)
274    {
275        actionQueue.Enqueue(delegate { DrawingColor(vari); });
276    }
277}
Note: See TracBrowser for help on using the repository browser.