source: 2015/24/EemeliK/2015/koodauskerho/otjojunt/Turtle/Turtle/Turtle/Turtle.cs @ 7114

Revision 7114, 7.9 KB checked in by otjojunt, 4 years ago (diff)
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 = 5.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        IsMouseVisible = true;
43        Level.Background.Color = Color.HotPink;
44
45        Liiku(100.0);
46
47        LisaaKaskyt();
48
49        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
50        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
51
52        Camera.ZoomFactor = 0.5;
53
54        SeuraavaKasky();
55
56        Timer Joo = new Timer();
57        Joo.Interval = 1;
58        Joo.Start();
59    }
60    void Joo_Tick(object sender, EventArgs e)
61    {
62        Liiku(100.0);
63        //Liiku(-100.0);
64    }
65
66    /// <summary>
67    /// Aliohjelma, jossa kilpikonnalle menevät käskyt lisätään.
68    /// </summary>
69    protected virtual void LisaaKaskyt()
70    {
71    }
72
73    /// <summary>
74    /// Liikutetaan kilpikonnaa pään osoittamaan suuntaan.
75    /// </summary>
76    /// <param name="pituus">Liikkeen pituus</param>
77    private void MoveTo(double pituus)
78    {
79        if (moveTimer == null)
80        {
81            moveTimer = new Timer();
82            moveTimer.Timeout += MoveToTarget;
83            moveTimer.Interval = 1.001;
84        }
85        else if (moveTimer.Enabled)
86            moveTimer.Stop();
87
88        if (drawingOn)
89        {
90            currentObject = new GameObject(0, drawingWidth);
91            currentObject.AbsolutePosition = turtle.AbsolutePosition;
92            currentObject.AbsoluteAngle = turtle.AbsoluteAngle;
93            currentObject.Color = lineColor;
94            Add(currentObject);
95        }
96        moveTarget = turtle.AbsolutePosition + Vector.FromLengthAndAngle(pituus, turtle.AbsoluteAngle);
97        moveTimer.Start();
98    }
99
100    /// <summary>
101    /// Aliohjelma joka hoitaa kilpikonnan liikuttamisen.
102    /// </summary>
103    private void MoveToTarget()
104    {
105        if (!moveTarget.HasValue)
106        {
107            moveTimer.Stop();
108            return;
109        }
110
111        Vector d = moveTarget.Value - turtle.AbsolutePosition;
112        double vt = moveSpeed * moveTimer.Interval;
113
114        if (d.Magnitude < vt)
115        {
116            moveTimer.Stop();
117            turtle.AbsolutePosition = moveTarget.Value;
118            moveTarget = null;
119            SeuraavaKasky();
120            if (drawingOn)
121            {
122                currentObject.Size += new Vector(d.Magnitude, 0);
123                currentObject.AbsolutePosition += Vector.FromLengthAndAngle(d.Magnitude / 2, d.Angle);
124            }
125        }
126        else
127        {
128            if (drawingOn)
129            {
130                currentObject.Size += new Vector(vt, 0);
131                currentObject.AbsolutePosition += Vector.FromLengthAndAngle(vt / 2, d.Angle);
132            }
133            turtle.AbsolutePosition += Vector.FromLengthAndAngle(vt, d.Angle);
134        }
135    }
136
137    /// <summary>
138    /// Käännetään kilpikonnaa. Kilpikonna kääntyy vastapäivään, eli jos haluat
139    /// kääntää kilpikonnaa myötäpäivään esim. 90 astetta, on se silloin 270
140    /// astetta. (360-90=270)
141    /// </summary>
142    /// <param name="asteet">Kulma asteina</param>
143    private void TurnTo(double asteet)
144    {
145        if (turnTimer == null)
146        {
147            turnTimer = new Timer();
148            turnTimer.Timeout += TurnToTarget;
149            turnTimer.Interval = 0.001;
150        }
151        else if (turnTimer.Enabled)
152            turnTimer.Stop();
153
154        turnTarget = turtle.Angle + Angle.FromDegrees(asteet);
155        turnTimer.Start();
156    }
157
158    /// <summary>
159    /// Aliohjelma, joka hoitaa kilpikonnan kääntämisen.
160    /// </summary>
161    private void TurnToTarget()
162    {
163        if (!turnTarget.HasValue)
164        {
165            turnTimer.Stop();
166            return;
167        }
168
169        Angle angleLeft = turnTarget.Value - turtle.Angle;
170        Angle angleSingleInterval = Angle.FromDegrees(turnSpeed) * turnTimer.Interval;
171
172        if (angleLeft.GetPositiveDegrees() < angleSingleInterval.GetPositiveDegrees())
173        {
174            turnTimer.Stop();
175            turtle.Angle = turnTarget.Value;
176            turnTarget = null;
177            SeuraavaKasky();
178        }
179        else
180        {
181            turtle.AbsoluteAngle += angleSingleInterval;
182        }
183    }
184
185    /// <summary>
186    /// Laittaa piirtämisen päälle.
187    /// </summary>
188    private void DrawingOn()
189    {
190        drawingOn = true;
191        SeuraavaKasky();
192    }
193
194    /// <summary>
195    /// Ottaa piirtämisen pois päältä.
196    /// </summary>
197    private void DrawingOff()
198    {
199        drawingOn = false;
200        SeuraavaKasky();
201    }
202   
203    /// <summary>
204    /// Asettaa piirtojäljen paksuuden.
205    /// </summary>
206    /// <param name="paksuus">Kuinka paksua jälkeä piirretään</param>
207    private void DrawingWidth(double paksuus)
208    {
209        drawingWidth = paksuus;
210        SeuraavaKasky();
211    }
212
213    /// <summary>
214    /// Asettaa piirtojäljen värin.
215    /// </summary>
216    /// <param name="color">Minkä väristä jälkeä piirretään</param>
217    private void DrawingColor(Color color)
218    {
219        lineColor = color;
220        SeuraavaKasky();
221    }
222
223    /// <summary>
224    /// Aliohjelma seuraavan käskyn suorittamista varten. Kutsutaan aina kun
225    /// yksi käsky on saatu suoritettua loppuun.
226    /// </summary>
227    private void SeuraavaKasky()
228    {
229        if (actionQueue.Count <= 0)
230            return;
231        Action seuraava = actionQueue.Dequeue();
232        seuraava();
233    }
234
235    /// <summary>
236    /// Liikuttaa kilpikonnaa suoraan.
237    /// </summary>
238    /// <param name="pituus">Matka, jonka kilpikonna kulkee</param>
239    public void Liiku(double pituus)
240    {
241        actionQueue.Enqueue(delegate { MoveTo(pituus); });
242    }
243
244    /// <summary>
245    /// Kääntää kilpikonnaa. Kilpikonna kääntyy vastapäivään, eli jos haluat
246    /// kääntää kilpikonnaa myötäpäivään esim. 90 astetta, on se silloin 270
247    /// astetta. (360-90=270)
248    /// </summary>
249    /// <param name="kulma">Kulma asteina</param>
250    public void Kaanny(double kulma)
251    {
252        actionQueue.Enqueue(delegate { TurnTo(kulma); });
253    }
254
255    /// <summary>
256    /// Laittaa kilpikonnan piirtämään viivaa peräänsä.
257    /// </summary>
258    public void PiirtoPaalle()
259    {
260        actionQueue.Enqueue(DrawingOn);
261    }
262
263    /// <summary>
264    /// Ottaa kilpikonnan piirtämän viivan pois päältä.
265    /// </summary>
266    public void PiirtoPois()
267    {
268        actionQueue.Enqueue(DrawingOff);
269    }
270
271    /// <summary>
272    /// Asettaa kilpikonnan piirtämän viivan paksuuden.
273    /// </summary>
274    /// <param name="paksuus">Kunka paksua viivaa piirretään</param>
275    public void AsetaViivanPaksuus(double paksuus)
276    {
277        actionQueue.Enqueue(delegate { DrawingWidth(paksuus); });
278    }
279
280    /// <summary>
281    /// Asettaa kilpikonnan piirtämän viivan värin.
282    /// </summary>
283    /// <param name="vari">Piirrettävän viivan väri</param>
284    public void AsetaVari(Color vari)
285    {
286        actionQueue.Enqueue(delegate { DrawingColor(vari); });
287    }
288}
Note: See TracBrowser for help on using the repository browser.