source: esimerkit/2015k/live/live13/PelottavaPeli/PelottavaPeli/PelottavaPeli.cs @ 1483

Revision 1087, 9.0 KB checked in by anlakane, 3 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
9/// @author Antti-Jussi Lakanen
10/// @version 25.2.2015
11///
12/// <summary>
13/// Esimerkki pelin tekemisestä ruutukentällä.
14/// Huomaa, että Vihu-luokka on omassa cs-tiedostossaan.
15/// </summary>
16public class PelottavaPeli : PhysicsGame
17{
18    /// <summary>
19    /// Millä voimalla pelaajaa liikutetaan sivuille
20    /// </summary>
21    const double LIIKUTUSVOIMA = 800;
22
23    /// <summary>Kentän leveys</summary>
24    const double KENTANLEVEYS = 800;
25
26    /// <summary>Kentän korkeus</summary>
27    const double KENTANKORKEUS = 600;
28
29    /// <summary>Pelikentän ruudun (eli "tiilen") leveys</summary>
30    const double RUUDUN_LEVEYS = KENTANLEVEYS / 15;
31    /// <summary>Pelikentän ruudun ("tiilen") korkeus</summary>
32    const double RUUDUN_KORKEUS = KENTANKORKEUS / 23;
33
34
35
36    /// <summary>
37    /// Alustukset.
38    /// </summary>
39    public override void Begin()
40    {
41        SetWindowSize(800, 600);
42
43        PhysicsObject pelaaja = new PhysicsObject(1, 1, Shape.Circle);
44        Gravity = new Vector(0, -800);
45
46        List<Vector> kerattavienPaikat = new List<Vector>();
47
48        AddCollisionHandler(pelaaja, "vihunammus", CollisionHandler.DestroyObject);
49        AddCollisionHandler(pelaaja, "vihunammus", PeliPaattyi);
50
51
52        TileMap ruudut = TileMap.FromLevelAsset("kentta1");
53        ruudut.SetTileMethod('x', LuoLattia);
54        ruudut.SetTileMethod('t', LuoTaso);
55        ruudut.SetTileMethod('p', LuoPelaaja, pelaaja);
56        ruudut.SetTileMethod('2', LuoVihu, 2);
57        ruudut.SetTileMethod('3', LuoVihu, 3);
58        ruudut.SetTileMethod('5', LuoVihu, 5);
59        ruudut.SetTileMethod('*', LuoKerattavanPaikka, kerattavienPaikat);
60        ruudut.Execute(RUUDUN_LEVEYS, RUUDUN_KORKEUS);
61
62        DoNextUpdate(Camera.ZoomToLevel);
63        Level.Background.Image = LoadImage("tausta");
64        Level.CreateBorders();
65
66        Timer kerattavienLisays = new Timer();
67        kerattavienLisays.Interval = 3.0;
68        kerattavienLisays.Timeout += delegate()
69        {
70            TeeKerattavaSatunnaiseenPaikkaan(kerattavienPaikat);
71        };
72        kerattavienLisays.Start();
73
74        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja);
75        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikuta vasemmalle", pelaaja, new Vector(-LIIKUTUSVOIMA, 0));
76        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikuta vasemmalle", pelaaja, new Vector(LIIKUTUSVOIMA, 0));
77        Keyboard.Listen(Key.Space, ButtonState.Pressed, Heita, "Heita ammus", pelaaja, "pelaajanAmmus");
78        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
79        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
80    }
81
82    /// <summary>
83    /// Pelin päättymiseen liittyvät toimenpiteet. HUOM!
84    /// Tämä jäi kesken luennolla, eikä vielä toimi.
85    /// </summary>
86    /// <param name="pelaaja">Pelaaja (joka on poistettu ruudulta aikaisemmin)</param>
87    /// <param name="kohde"></param>
88    public void PeliPaattyi(PhysicsObject pelaaja, PhysicsObject kohde)
89    {
90        Keyboard.Listen(Key.Enter, ButtonState.Pressed, delegate
91        {
92            Keyboard.Disable(Key.Enter);
93        }, null);
94    }
95
96    /// <summary>
97    /// Lisätään kerättävä satunnaiseen paikkaan
98    /// kerättävien paikkalistasta.
99    /// </summary>
100    /// <param name="paikat">Lista kerättävien paikoista</param>
101    public void TeeKerattavaSatunnaiseenPaikkaan(List<Vector> paikat)
102    {
103        PhysicsObject kerattava = new PhysicsObject(RUUDUN_LEVEYS, RUUDUN_KORKEUS, Shape.Star);
104        kerattava.Position = paikat[RandomGen.NextInt(paikat.Count)];
105        kerattava.Tag = "kerattava";
106        kerattava.MaximumLifetime = TimeSpan.FromSeconds(4.0);
107        Add(kerattava);
108    }
109
110    /// <summary>
111    /// Lisätään kerättävän olion paikka
112    /// listaan, josta sitten voidaan myöhemmin
113    /// esim. arpoa paikka kerättävälle oliolle
114    /// </summary>
115    /// <param name="paikka">Paikka</param>
116    /// <param name="leveys">Leveys</param>
117    /// <param name="korkeus">Korkeus</param>
118    /// <param name="paikat">Lista, johon lisätään</param>
119    public void LuoKerattavanPaikka(Vector paikka, double leveys, double korkeus, List<Vector> kerattavienPaikat)
120    {
121        kerattavienPaikat.Add(paikka);
122    }
123
124    /// <summary>
125    /// Luodaan liikkuva vihu joka kiertää samaa rataa:
126    /// x pykälää oikealle (liikemaara-parametri)
127    /// ja takaisin.
128    /// </summary>
129    /// <param name="paikka">Paikka</param>
130    /// <param name="leveys">Leveys</param>
131    /// <param name="korkeus">Korkeus</param>
132    /// <param name="liikemaara">Kuinka monta pykälää _oikealle_ vihu liikkuu</param>
133    public void LuoVihu(Vector paikka, double leveys, double korkeus, int liikemaara)
134    {
135        Vihu vihu = new Vihu(leveys, korkeus, Shape.Circle, 3);
136        // Tässä HP laitetaan "manuaalisesti" 3:ksi, parempi olisi laittaa LuoVihu-aliohjelmalle parametrina
137        // jotta voitaisiin tehdä jonkin muunkinlaisia vihuja kuin vain sellaisia joilla on HP 3.
138
139        vihu.Position = paikka;
140        vihu.Image = LoadImage("vihu2");
141        Add(vihu);
142
143        PathFollowerBrain pfb = new PathFollowerBrain();
144        List<Vector> reitti = new List<Vector>();
145        reitti.Add(paikka);
146        reitti.Add(new Vector(paikka.X + RUUDUN_LEVEYS * liikemaara, paikka.Y));
147        pfb.Path = reitti;
148        pfb.Loop = true;
149        vihu.Brain = pfb;
150
151        Timer heittoAjastin = new Timer();
152        heittoAjastin.Interval = 5.0;
153        heittoAjastin.Timeout += delegate() { Heita(vihu, "vihunammus"); };
154        heittoAjastin.Start();
155
156        AddCollisionHandler(vihu, "pelaajanAmmus", CollisionHandler.DestroyTarget);
157        AddCollisionHandler(vihu, "pelaajanAmmus", CollisionHandler.AddMeterValue(vihu.HP, -1));
158        AddCollisionHandler(vihu, "pelaajanAmmus", delegate(PhysicsObject tormaaja, PhysicsObject kohde) { heittoAjastin.Stop(); });
159    }
160
161    /// <summary>
162    /// Heittäjä heittää sydämen.
163    /// </summary>
164    /// <param name="heittavaOlio">Kuka heittää</param>
165    /// <param name="tag">Heitettävän olion tagi</param>
166    public void Heita(PhysicsObject heittavaOlio, String tag)
167    {
168        PhysicsObject ammus = new PhysicsObject(RUUDUN_LEVEYS / 2, RUUDUN_KORKEUS / 2, Shape.Heart);
169        ammus.Position = heittavaOlio.Position;
170
171        double xSuunta = 800;
172
173        if (heittavaOlio.Velocity.X < 0) // heittävä olio on menossa vasemmalle päin
174        {
175            xSuunta *= -1;
176        }
177
178        ammus.Hit(new Vector(xSuunta, 200));
179        ammus.Tag = tag;
180        ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
181        Add(ammus);
182    }
183
184    /// <summary>
185    /// Liikuta pelioliota Push-metodilla.
186    /// </summary>
187    /// <param name="liikutettava">Ketä liikutetaan</param>
188    /// <param name="suunta">Suunta</param>
189    public void Liikuta(PhysicsObject liikutettava, Vector suunta)
190    {
191        liikutettava.Push(suunta);
192    }
193
194    /// <summary>
195    /// Liikuta pelioliota Hit-metodilla.
196    /// </summary>
197    /// <param name="liikuteltava">Ketä liikutetaan</param>
198    /// <param name="suunta">Suunta</param>
199    public void Hyppaa(PhysicsObject liikutettava)
200    {
201        liikutettava.Hit(new Vector(0, 1000));
202    }
203
204    /// <summary>
205    /// Annetaan parametrina annetulle pelaaja-oliolle
206    /// sopivat ominaisuudet ja lisätään se ruudulle.
207    /// </summary>
208    /// <param name="paikka">Paikka</param>
209    /// <param name="leveys">Leveys</param>
210    /// <param name="korkeus">Korkeus</param>
211    /// <param name="pelaaja">Pelaaja</param>
212    public void LuoPelaaja(Vector paikka, double leveys, double korkeus, PhysicsObject pelaaja)
213    {
214        pelaaja.Size = new Vector(leveys, korkeus);
215        pelaaja.CanRotate = false;
216        pelaaja.Position = paikka;
217        pelaaja.Image = LoadImage("ukkeli");
218        Add(pelaaja);
219    }
220
221    /// <summary>
222    /// Luodaan taso.
223    /// </summary>
224    /// <param name="paikka">Paikka</param>
225    /// <param name="leveys">Leveys</param>
226    /// <param name="korkeus">Korkeus</param>
227    public void LuoTaso(Vector paikka, double leveys, double korkeus)
228    {
229        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
230        taso.Position = paikka;
231        taso.Image = LoadImage("taso");
232        Add(taso);
233    }
234
235    /// <summary>
236    /// Luodaan lattia.
237    /// </summary>
238    /// <param name="paikka">Paikka</param>
239    /// <param name="leveys">Leveys</param>
240    /// <param name="korkeus">Korkeus</param>
241    public void LuoLattia(Vector paikka, double leveys, double korkeus)
242    {
243        PhysicsObject lattia = PhysicsObject.CreateStaticObject(leveys, korkeus);
244        lattia.Position = paikka;
245        Add(lattia);
246    }
247}
Note: See TracBrowser for help on using the repository browser.