source: esimerkit/2014k/live/live15/LahinPisteHiiresta/LahinPisteHiiresta/LahinPisteHiiresta.cs @ 1483

Revision 889, 5.6 KB checked in by anlakane, 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
9/// @author Antti-Jussi Lakanen
10/// @version 4.2.2014
11///
12/// <summary>
13/// Pieni peli missä etsitään lähintä pistettä hiirestä
14/// samalla kun hiirtä liikutellaan.
15/// </summary>
16public class LahinPisteHiiresta : PhysicsGame
17{
18    const double PIENEN_KOKO = 80;
19    private Image vihu = LoadImage("vihu");
20    private Image rage = LoadImage("rage");
21
22    /// <summary>
23    /// Alustukset ja kuuntelijat sekä
24    /// poistoajastimen käynnistys.
25    /// </summary>
26    public override void Begin()
27    {
28        List<PhysicsObject> pallot = new List<PhysicsObject>();
29
30        Level.Size = new Vector(1024, 768);
31        SetWindowSize(1024, 768);
32        Level.Background.Image = Image.FromGradient(1024, 768, new Color(40, 40, 90), new Color(90, 90, 120));
33        Camera.ZoomToLevel();
34
35        PhysicsObject pelaaja = LuoPelaaja();
36        Add(pelaaja);
37
38        PhysicsObject lahinPallo = LahinPallo(pallot, pelaaja.Position);
39
40        // Mouse.IsCursorVisible = true; // jos haluat kursorin näkyviin
41
42        Mouse.ListenMovement(0.1, delegate { lahinPallo = LiikutaPelaajaa(pelaaja, pallot, lahinPallo); }, "Liikuta pelaajaa");
43        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, LisaaPallo, "Lisää pallo", pallot);
44
45        Timer poistoAjastin = new Timer();
46        poistoAjastin.Interval = 0.5;
47        poistoAjastin.Timeout += delegate
48        {
49            PoistaEka(pallot);
50        };
51        poistoAjastin.Start();
52
53        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
54        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
55    }
56
57    /// <summary>
58    /// Poista eka alkio näytöltä ja listasta.
59    /// </summary>
60    /// <param name="pallot">Lista josta eka poistetaan.</param>
61    private void PoistaEka(List<PhysicsObject> pallot)
62    {
63        if (pallot.Count == 0) return;
64        PhysicsObject olio = pallot[0];
65        pallot.RemoveAt(0);
66        olio.Destroy();
67    }
68
69    /// <summary>
70    /// Lisää pallo listaan ja ruudulle.
71    /// </summary>
72    /// <param name="pallot">Pallot</param>
73    private void LisaaPallo(List<PhysicsObject> pallot)
74    {
75        PhysicsObject pallo = new PhysicsObject(PIENEN_KOKO, PIENEN_KOKO, Shape.Circle);
76        pallo.Image = vihu;
77        Add(pallo);
78        pallo.Position = Mouse.PositionOnWorld;
79        pallot.Add(pallo);
80    }
81
82    /// <summary>
83    /// Liikuta pelaajaa. Samalla päivitetään lähin pallo ja palautetaan "pääohjelmaan",
84    /// jotta taas seuraavalla liikutuskerralla voidaan sytyttää tarvittaessa uusi lähin
85    /// jne.
86    /// </summary>
87    /// <param name="liikutettava">Liikuteltava pelaaja</param>
88    /// <param name="pallot">Pallot</param>
89    /// <param name="nykyinenLahin">Nykyinen lähin</param>
90    /// <returns>Uusi lähin</returns>
91    private PhysicsObject LiikutaPelaajaa(PhysicsObject liikutettava, List<PhysicsObject> pallot, PhysicsObject nykyinenLahin)
92    {
93        // liikutettava.Position = Mouse.PositionOnWorld;
94        liikutettava.X = Mouse.PositionOnWorld.X;
95        liikutettava.Y = Mouse.PositionOnWorld.Y;
96        // PhysicsObject lahin = KorostaLahin(pallot, liikutettava.Position);
97        // return lahin;
98        return KorostaLahin(pallot, nykyinenLahin, liikutettava.Position);
99
100    }
101
102    /// <summary>
103    /// 1) Poistaa korostuksen vanhasta lähimmästä.
104    /// 2) Korostaa uuden lähimmän
105    /// 3) Palauttaa uuden lähimmän.
106    /// </summary>
107    /// <param name="pallot">Pallot josta lähintä etsitään</param>
108    /// <param name="nykyinenLahin">Nykyinen lähin</param>
109    /// <param name="havaintopiste">Piste, jota lähintä etsitään.</param>
110    /// <returns>Uusi lähin.</returns>
111    private PhysicsObject KorostaLahin(List<PhysicsObject> pallot, PhysicsObject nykyinenLahin, Vector havaintopiste)
112    {
113        if (pallot.Count == 0) return null;
114        if (nykyinenLahin != null)
115        {
116            nykyinenLahin.Image = vihu;
117        }
118        PhysicsObject lahinPallo = LahinPallo(pallot, havaintopiste); // etsi uusi lähin
119        lahinPallo.Image = rage;
120        nykyinenLahin = lahinPallo;
121        return lahinPallo;
122    }
123
124    /// <summary>
125    /// Etsii listan lähimmän alkion
126    /// </summary>
127    /// <param name="pallot">Fysiikkaoliot joista etsitään</param>
128    /// <param name="pelaajanPaikka">Havaintopiste, jota lähintä pistettä etsitään.</param>
129    /// <returns>Lähin olio</returns>
130    private PhysicsObject LahinPallo(List<PhysicsObject> pallot, Vector pelaajanPaikka)
131    {
132        if (pallot.Count == 0) return null;
133        PhysicsObject lahinPallo = pallot[0];
134
135        double lahimmanEtaisyys = Vector.Distance(pallot[0].Position, pelaajanPaikka);
136        foreach (PhysicsObject pallo in pallot)
137        {
138            double tamanPallonEtaisyys = Vector.Distance(pallo.Position, pelaajanPaikka);
139            if (tamanPallonEtaisyys < lahimmanEtaisyys)
140            {
141                lahinPallo = pallo;
142                lahimmanEtaisyys = tamanPallonEtaisyys;
143            }
144        }
145        return lahinPallo;
146    }
147
148    /// <summary>
149    /// Luodaan pelaaja.
150    /// </summary>
151    /// <returns>Pelaaja.</returns>
152    private PhysicsObject LuoPelaaja()
153    {
154        PhysicsObject pallo = PhysicsObject.CreateStaticObject(80, 80, Shape.Circle);
155        pallo.Image = LoadImage("pelaaja");
156        Add(pallo, 1);
157        return pallo;
158    }
159}
Note: See TracBrowser for help on using the repository browser.