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

Revision 7102, 6.2 KB checked in by otjojunt, 6 years ago (diff)

Turtle -harjoituksen ensimmäinen versio

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    Vector lastPos;
23
24    // Käskyt sisältävä jono
25    Queue<Action> actionQueue = new Queue<Action>();
26
27    PhysicsObject turtle;
28    Image turtleKuva = LoadImage("turtle");
29
30    /// <summary>
31    /// Laitetaan kilpikonna liikkeelle
32    /// </summary>
33    public override void Begin()
34    {
35        turtle = new PhysicsObject(99, 69);
36        turtle.Image = turtleKuva;
37        Add(turtle);
38
39        LisaaKaskyt();
40
41        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
42        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
43
44        SeuraavaKasky();
45    }
46
47    /// <summary>
48    /// Aliohjelma, jossa kilpikonnalle menevät käskyt lisätään
49    /// </summary>
50    public void LisaaKaskyt()
51    {
52        // TODO: Lisää tähän kilpikonnalle menevät käskyt.
53        // Esimerkiksi: LisaaKasky(Liiku, 100.0);
54
55    }
56
57    /// <summary>
58    /// Liikutetaan kilpikonnaa pään osoittamaan suuntaan.
59    /// </summary>
60    /// <param name="pituus">Liikkeen pituus</param>
61    public void Liiku(double pituus)
62    {
63        if (moveTimer == null)
64        {
65            moveTimer = new Timer();
66            moveTimer.Timeout += MoveToTarget;
67            moveTimer.Interval = 0.01;
68        }
69        else if (moveTimer.Enabled)
70            moveTimer.Stop();
71
72        currentObject = new GameObject(0, 1);
73        currentObject.AbsolutePosition = turtle.AbsolutePosition;
74        currentObject.AbsoluteAngle = turtle.AbsoluteAngle;
75        Add(currentObject);
76        moveTarget = turtle.AbsolutePosition + Vector.FromLengthAndAngle(pituus, turtle.AbsoluteAngle);
77        moveTimer.Start();
78    }
79
80    /// <summary>
81    /// Aliohjelma joka hoitaa kilpikonnan liikuttamisen.
82    /// </summary>
83    protected void MoveToTarget()
84    {
85        if (!moveTarget.HasValue)
86        {
87            moveTimer.Stop();
88            return;
89        }
90
91        Vector d = moveTarget.Value - turtle.AbsolutePosition;
92        double vt = moveSpeed * moveTimer.Interval;
93
94        if (d.Magnitude < vt)
95        {
96            moveTimer.Stop();
97            turtle.AbsolutePosition = moveTarget.Value;
98            moveTarget = null;
99            SeuraavaKasky();
100            currentObject.Size += new Vector(d.Magnitude, 0);
101            currentObject.AbsolutePosition += Vector.FromLengthAndAngle(d.Magnitude / 2, d.Angle);
102        }
103        else
104        {
105            currentObject.Size += new Vector(vt, 0);
106            currentObject.AbsolutePosition += Vector.FromLengthAndAngle(vt / 2, d.Angle);
107            /*GameObject go = new GameObject(1, 1);
108            go.AbsolutePosition = turtle.AbsolutePosition;
109            go.Color = Color.Black;
110            Add(go);
111            lastPos = turtle.AbsolutePosition;*/
112            turtle.AbsolutePosition += Vector.FromLengthAndAngle(vt, d.Angle);
113        }
114    }
115
116    /// <summary>
117    /// Käännetään kilpikonnaa. Kilpikonna kääntyy vastapäivään, eli jos haluat
118    /// kääntää kilpikonnaa myötäpäivään esim. 90 astetta, on se silloin 270
119    /// astetta. (360-90=270)
120    /// </summary>
121    /// <param name="asteet">Kulma asteina</param>
122    public void Kaanny(double asteet)
123    {
124        if (turnTimer == null)
125        {
126            turnTimer = new Timer();
127            turnTimer.Timeout += TurnToTarget;
128            turnTimer.Interval = 0.01;
129        }
130        else if (turnTimer.Enabled)
131            turnTimer.Stop();
132
133        turnTarget = turtle.Angle + Angle.FromDegrees(asteet);
134        turnTimer.Start();
135    }
136
137    /// <summary>
138    /// Aliohjelma, joka hoitaa kilpikonnan kääntämisen
139    /// </summary>
140    protected void TurnToTarget()
141    {
142        if (!turnTarget.HasValue)
143        {
144            turnTimer.Stop();
145            return;
146        }
147
148        Angle angleLeft = turnTarget.Value - turtle.Angle;
149        Angle angleSingleInterval = Angle.FromDegrees(turnSpeed) * turnTimer.Interval;
150
151        if (angleLeft.GetPositiveDegrees() < angleSingleInterval.GetPositiveDegrees())
152        {
153            turnTimer.Stop();
154            turtle.Angle = turnTarget.Value;
155            turnTarget = null;
156            SeuraavaKasky();
157        }
158        else
159        {
160            turtle.AbsoluteAngle += angleSingleInterval;
161        }
162    }
163
164    /// <summary>
165    /// Aliohjelma seuraavan käskyn suorittamista varten. Kutsutaan aina kun
166    /// yksi käsky on saatu suoritettua loppuun.
167    /// </summary>
168    protected void SeuraavaKasky()
169    {
170        if (actionQueue.Count <= 0)
171            return;
172        Action seuraava = actionQueue.Dequeue();
173        seuraava();
174    }
175
176    /// <summary>
177    /// Aliohjelma käskyn lisäämiseksi käskyjonoon.
178    /// </summary>
179    /// <param name="a">Käsky, joka lisätään.</param>
180    public void LisaaKasky(Action a)
181    {
182        actionQueue.Enqueue(a);
183    }
184
185    /// <summary>
186    /// Aliohjelma käskyn lisäämiseksi käskyjonoon.
187    /// </summary>
188    /// <typeparam name="T1">Parametrin tyyppi</typeparam>
189    /// <param name="a">Lisättävä käsky</param>
190    /// <param name="p">Käskyn parametri</param>
191    public void LisaaKasky<T1>(Action<T1> a, T1 p)
192    {
193        actionQueue.Enqueue(delegate { a(p); });
194    }
195
196    /// <summary>
197    /// Aliohjelma käskyn lisäämiseksi käskyjonoon.
198    /// </summary>
199    /// <typeparam name="T1">Ensimmäisen parametrin tyyppi</typeparam>
200    /// <typeparam name="T2">Toisen parametrin tyyppi</typeparam>
201    /// <param name="a">Lisättävä käsky</param>
202    /// <param name="p1">Ensimmäinen parametri</param>
203    /// <param name="p2">Toinen parametri</param>
204    public void LisaaKasky<T1, T2>(Action<T1, T2> a, T1 p1, T2 p2)
205    {
206        actionQueue.Enqueue(delegate { a(p1, p2); });
207    }
208}
Note: See TracBrowser for help on using the repository browser.