source: 2014/23/JouniP/Kauppareissu/Kauppareissu/Kauppareissu/Kauppareissu.cs @ 4903

Revision 4903, 9.2 KB checked in by jotapoti, 7 years ago (diff)

Alkuvalikko toimii kuolemisen jälkeen.
Realistinen nopeus hahmolle.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9/// <summary>
10/// Peli, jossa ollaan Suolahdessa peliohjelmointileirillä
11/// ja käydään kaupassa. Pelin voittaa, jos on ennen autolla
12/// ajavaa A-J:tä perillä.
13/// </summary>
14public class Kauppareissu : PhysicsGame
15{
16    // TODO siisti koodia yleisesti...
17
18    #region attribuutit
19
20    public bool DEBUGMODE = false;
21
22    // TODO korjaa levelin koko suuremmaksi
23    private const double AUTON_LEVEYS = 50.0;
24    private const double AUTON_KORKEUS = 50.0;
25
26    private const double AUTON_NOPEUS = 50.0;
27
28    private const double MAALIN_LEVEYS = 100.0;
29    private const double MAALIN_KORKEUS = 100.0;
30
31    private const double PELAAJAN_LEVEYS = 20.0;
32    private const double PELAAJAN_KORKEUS = 40.0;
33
34    public int REITTIPISTEIDEN_VALIETAPPIEN_MAARA = 100;
35
36    public string MAALITAG = "maali";
37    public string HAVIOTEKSTI = "Liian hidasta! A-J ehti\n eS-markettiin ensin!";
38    public string VOITTOTEKSTI = "Onneksi olkoon, voitit pelin!";
39    public string TAUSTATARINA = "Olet leiriläinen, jonka tehtävänä on ehtiä ennen A-J:tä kauppaan.\nNäpytä vuorotellen vasemmalle ja oikealle liikkuaksesi eteenpäin.";
40    public string VOITTOVAIHTOEHTOJATKAMISELLE = "jes jes jes jes jES!";
41
42    public Image alkuruudunTaustakuva = LoadImage("ruohotausta");
43    public Image autokuva = LoadImage("auto");
44    public Image maalikuva = LoadImage("esmarket");
45    public Image taustakuva = LoadImage("tausta");
46
47    public Key edellinen = Key.Right;
48    public PhysicsObject maali;
49
50    private PhysicsObject auto;
51    private Pelihahmo pelaaja;
52
53    #endregion
54
55    public override void Begin()
56    {
57        Alkuvalikko(null);
58    }
59
60    #region alkujutut
61
62    /// <summary>
63    /// Näyttää pelin alkuvalikon.
64    /// </summary>
65    private void Alkuvalikko(Window sender)
66    {
67        ClearAll();
68        Label alkuteksti = new Label(TAUSTATARINA);
69        alkuteksti.Position = new Vector(Level.Center.X, Level.Center.Y - 20);
70        alkuteksti.Color = Color.White;
71
72        Add(alkuteksti);
73        Level.Background.Color = Color.Green;
74        Level.Background.Image = alkuruudunTaustakuva;
75        Level.Background.FitToLevel();
76        Camera.ZoomToLevel();
77        MultiSelectWindow alkuvalikko = new MultiSelectWindow("Kauppareissu",
78"Aloita peli", "Lopeta");
79        alkuvalikko.AddItemHandler(0, UusiPeli);
80        alkuvalikko.AddItemHandler(1, Exit);
81        alkuvalikko.DefaultCancel = 1;
82        alkuvalikko.Position = new Vector(Level.Center.X, Level.Bottom + alkuvalikko.Height);
83        Add(alkuvalikko);
84    }
85
86    /// <summary>
87    /// Luo pelikentän ja lisää tarvittavat oliot.
88    /// </summary>
89    private void LuoKenttaJaPelinOliot()
90    {
91        Level.Background.Color = Color.FromHexCode("3F7F47");
92        Level.Background.Image = taustakuva;
93        Level.Background.FitToLevel();
94
95        List<Vector> polku = new List<Vector> { new Vector(Level.Left + AUTON_LEVEYS, Level.Top - AUTON_KORKEUS), 
96                                                new Vector(Level.Right - AUTON_LEVEYS, Level.Top - AUTON_KORKEUS), 
97                                                new Vector(Level.Right - AUTON_LEVEYS*3.8, Level.Bottom + AUTON_KORKEUS), 
98                                                new Vector(2* Level.Right + AUTON_LEVEYS, Level.Bottom + AUTON_KORKEUS)};
99        LuoKentta(polku);
100
101        auto = LuoAuto(polku);
102        auto.CollisionIgnoreGroup = 1;
103        Add(auto, 0);
104        pelaaja = LuoPelaaja(polku);
105        pelaaja.CollisionIgnoreGroup = 1;
106        Add(pelaaja, 3);
107    }
108
109    /// <summary>
110    /// Lisää pelaajalle käyttöön kontrollit pelin ohjaamiseen.
111    /// </summary>
112    private void LisaaNappaimet()
113    {
114        Keyboard.Listen(Key.Left, ButtonState.Pressed, Painettu, "juokse", Key.Left);
115        Keyboard.Listen(Key.Right, ButtonState.Pressed, Painettu, "juokse", Key.Right);
116        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "näytä näppäinohjeet");
117
118        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
119        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
120    }
121
122    /// <summary>
123    /// Aloittaa uuden pelin
124    /// </summary>
125    private void UusiPeli()
126    {
127        ClearAll();
128        LuoKenttaJaPelinOliot();
129
130        //Camera.Zoom(1.8);
131        Camera.ZoomToLevel(); // TODO kun level-koordinaatit ovat kunnossa, vaihda tämä pois
132        Camera.Follow(pelaaja);
133        LisaaNappaimet();
134    }
135    #endregion
136
137
138    #region luontijutut
139
140    /// <summary>
141    /// Luo ja lisää pelikentän elementit
142    /// </summary>
143    /// <param name="polku">Tien reittipisteet</param>
144    private void LuoKentta(List<Vector> polku)
145    {
146        // Reunat
147        // Level.CreateBorders();
148
149        // Tie
150        RoadMap tiekartta = new RoadMap(polku);
151        tiekartta.DefaultWidth = 50.0;
152        tiekartta.CreateSegmentFunction = LuoTienPatka;
153        tiekartta.Insert();
154
155        // Maali
156        PhysicsObject kauppa = new PhysicsObject(MAALIN_LEVEYS, MAALIN_KORKEUS);
157        kauppa.Position = new Vector(polku[polku.Count - 1].X, polku[polku.Count - 1].Y);
158        kauppa.MakeStatic();
159        kauppa.Tag = MAALITAG;
160        kauppa.Image = maalikuva;
161        Add(kauppa);
162
163        this.maali = kauppa;
164
165    }
166
167    private PhysicsObject LuoAuto(List<Vector> polku)
168    {
169        PhysicsObject auto = new PhysicsObject(AUTON_LEVEYS, AUTON_KORKEUS);
170        if (polku != null)
171        {
172            auto.Position = polku[0];
173        }
174        auto.Color = Color.Gray;
175
176        PathFollowerBrain autoaivot = new PathFollowerBrain(polku);
177        autoaivot.Speed = AUTON_NOPEUS;
178        auto.Brain = autoaivot;
179        autoaivot.TurnWhileMoving = true;
180        auto.Image = autokuva;
181
182        AddCollisionHandler(auto, MAALITAG, AutoVoitti);
183        return auto;
184    }
185
186    private PhysicsObject LuoTienPatka(double leveys, double korkeus, Shape muoto)
187    {
188        PhysicsObject patka = new PhysicsObject(leveys, korkeus, muoto);
189        patka.Color = Color.Brown;
190        patka.IgnoresCollisionResponse = true;
191        patka.IgnoresExplosions = true;
192        patka.IgnoresGravity = true;
193        patka.IgnoresPhysicsLogics = true;
194
195        Add(patka, -1);
196        return patka;
197    }
198    private Pelihahmo LuoPelaaja(List<Vector> polku)
199    {
200        Pelihahmo pelaaja = new Pelihahmo(PELAAJAN_LEVEYS, PELAAJAN_KORKEUS);
201        if (polku != null && polku.Count > 0)
202        {
203            pelaaja.Position = polku[0];
204            List<Vector> kulkureitti = new List<Vector>();
205            for (int i = 0; i < polku.Count - 1; i++)
206            {
207
208                for (int j = 0; j < REITTIPISTEIDEN_VALIETAPPIEN_MAARA; j++)
209                {
210                    double prosentti = (j / (1.0 * REITTIPISTEIDEN_VALIETAPPIEN_MAARA));
211                    Vector interpoloituValipiste = (polku[i] * (1 - prosentti)) + (polku[i + 1] * prosentti);
212
213                    kulkureitti.Add(interpoloituValipiste);
214                }
215            }
216            pelaaja.Kulkureitti = kulkureitti;
217        }
218
219
220        pelaaja.Shape = Shape.Circle;
221        pelaaja.Color = Color.Green;
222
223        AddCollisionHandler(pelaaja, MAALITAG, PelaajaVoitti);
224
225        return pelaaja;
226    }
227
228    #endregion
229
230    /// <summary>
231    /// Jos on painettu vasemmalle ja sen jälkeen oikealle, käskee pelaajaa liikkumaan yhden pykälän.
232    /// </summary>
233    /// <param name="nappain">Painettu näppäin</param>
234    public void Painettu(Key nappain)
235    {
236        if (DEBUGMODE)
237        {
238            MessageDisplay.Add("" + pelaaja.Position.ToString());
239        }
240
241        if (nappain == Key.Left && edellinen == Key.Right)
242        {
243            edellinen = Key.Left;
244            pelaaja.LiikuAskel();
245            // FIXME position vaihtaminen ei lauo törmäyksiä, joten tällainen kikkailu:
246            if (Vector.Distance(pelaaja.Position, maali.Position) < 100) // FIXME taikavakio pois
247            {
248                PelaajaVoitti(pelaaja, maali);
249            }
250            return;
251        }
252        if (nappain == Key.Right && edellinen == Key.Left)
253        {
254            edellinen = Key.Right;
255            return;
256        }
257    }
258
259    #region loppujutut
260
261    private void AutoVoitti(PhysicsObject auto, PhysicsObject kohde)
262    {
263        MessageWindow ikkuna = new MessageWindow(HAVIOTEKSTI);
264        ikkuna.Closed += Alkuvalikko;
265        Add(ikkuna);
266
267    }
268
269    /// <summary>
270    /// Pysäyttää muun pelin ja näyttää loppuvalikon.
271    /// </summary>
272    /// <param name="pelaaja">pelaajaolio</param>
273    /// <param name="maali">maaliolio, johon pelaaja törmäsi</param>
274    private void PelaajaVoitti(PhysicsObject pelaaja, PhysicsObject maali)
275    {
276        auto.Brain.Active = false;
277        StopAll();
278
279        MultiSelectWindow valikko = new MultiSelectWindow(VOITTOTEKSTI,
280VOITTOVAIHTOEHTOJATKAMISELLE, "Lopeta");
281        valikko.AddItemHandler(0, Begin);
282        valikko.AddItemHandler(1, Exit);
283        valikko.DefaultCancel = 1;
284        Add(valikko);
285
286    }
287
288    #endregion
289}
290
291
Note: See TracBrowser for help on using the repository browser.