source: 2015/koodauskerho/JesseS/Tornipuolustus/Tornipuolustus/Tornipuolustus/Tornipuolustus.cs @ 10337

Revision 7045, 10.8 KB checked in by sieerinn, 6 years ago (diff)

pööp

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9class TorniPaivitys
10{
11    public int Hinta { get; set; }
12    public int Vahinko { get; set; }
13    public Image Kuva { get; set; }
14    public TorniPaivitys Seuraava { get; set; }
15}
16
17class Torni : GameObject
18{
19    public TorniPaivitys Paivitys { get; set; }
20
21    public Timer AmpumisAjastin { get; set; }
22
23    public void OsuuVihuun(PhysicsObject ammus, PhysicsObject vihu)
24    {
25        ammus.Destroy();
26        ((Vihollinen)vihu).ElamaLaskuri.Value -= Paivitys.Vahinko;
27    }
28
29    public Torni(double leveys, double korkeus, TorniPaivitys paivitys)
30        : base(leveys, korkeus)
31    {
32        Paivitys = paivitys;
33        Image = Paivitys.Kuva;
34    }
35}
36
37class Vihollinen : PhysicsObject
38{
39    public IntMeter ElamaLaskuri { get; private set; }
40
41    public Vihollinen(double leveys, double korkeus, int elamat)
42        : base(leveys, korkeus)
43    {
44        ElamaLaskuri = new IntMeter(elamat, 0, elamat);
45        ElamaLaskuri.LowerLimit += Destroy;
46        Tag = "vihu";
47        CanRotate = false;
48
49        ProgressBar elamaPalkki = new ProgressBar(leveys * 1.2, 10, ElamaLaskuri);
50        elamaPalkki.BarColor = Color.DarkRed;
51        elamaPalkki.Color = Color.Black;
52        elamaPalkki.Bottom = Top + 5;
53        this.Add(elamaPalkki);
54    }
55}
56
57public class Tornipuolustus : PhysicsGame
58{
59    SortedList<char, Vector> polku;
60
61    IntMeter rahe;
62
63    TorniPaivitys alkuPaivitys;
64
65    GameObject kursori;
66
67    SoundEffect ammusaani = LoadSoundEffect("ampuminen");
68
69    Image linnaKuva = LoadImage("linna");
70    Image vihuKuva = LoadImage("vihu");
71    Image polkuKuva = LoadImage("polku");
72    Image nurmikkoKuva = LoadImage("nurmikko");
73    Image kursoriKuva = LoadImage("kursori");
74
75    int vihunNumero = 0;
76
77    Timer aikaLaskuri;
78
79    MultiSelectWindow alkuValikko;
80
81    EasyHighScore topLista = new EasyHighScore();
82
83    public override void Begin()
84    {
85        topLista.HighScoreWindow.Closed += (Window w) => LuoAlkuValikko();
86        LuoAlkuValikko();
87    }
88    void LuoAlkuValikko()
89    {
90        MediaPlayer.Play("Jazzy Elevator Music");
91        MediaPlayer.IsRepeating = true;
92
93        IsMouseVisible = true;
94        IsFullScreen = true;
95
96        alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
97        "Aloita peli", "Parhaat pisteet", "Lopeta");
98        Add(alkuValikko);
99
100        alkuValikko.AddItemHandler(0, AloitaPeli);
101        alkuValikko.AddItemHandler(1, ParhaatPisteet);
102        alkuValikko.AddItemHandler(2, Exit);
103    }
104
105    void ParhaatPisteet()
106    {
107        topLista.Show();
108    }
109
110    void AloitaPeli()
111    {
112        ClearAll();
113        alkuValikko.Destroy();
114        LuoKentta();
115        LuoRaheLaskuri();
116        LuoPaivitykset();
117        LuoAikaLaskuri();
118        AsetaOhjaimet();
119
120        Timer vihuAjastin = new Timer();
121        vihuAjastin.Interval = 3;
122        vihuAjastin.Timeout += LuoVihollinen;
123        vihuAjastin.Start();
124
125        IsMouseVisible = false;
126        LuoKursori();
127    }
128
129    void LuoKursori()
130    { 
131        kursori = new GameObject(30, 30);
132        kursori.Image = kursoriKuva;
133        Add(kursori, 3);
134        Mouse.ListenMovement(0.0, KuunteleLiiketta, null);
135    }
136
137    void KuunteleLiiketta(AnalogState hiirenTila)
138    {
139        kursori.Position = Mouse.PositionOnWorld;
140    }
141    void LuoKentta()
142    {
143        polku = new SortedList<char, Vector>();
144
145        Level.Height = 1200;
146        Level.Width = 10000;
147
148        Level.Background.Image = nurmikkoKuva;
149        Level.Background.TileToLevel();
150
151        TileMap ruudut = TileMap.FromLevelAsset("kentta1");
152        ruudut.SetTileMethod('!', LuoLinna);
153        ruudut.SetTileMethod('%', LuoPolku);
154
155        for (char merkki = 'A'; merkki < 'Z'; merkki++)
156        {
157            ruudut.SetTileMethod(merkki, LuoKulma, merkki);
158        }
159
160        ruudut.Execute(30, 30);
161
162       
163    }
164
165   
166
167    void LuoKulma(Vector paikka, double leveys, double korkeus, char merkki)
168    {
169        polku.Add(merkki, paikka);
170        LuoPolku(paikka, leveys, korkeus);
171    }
172
173    void LuoVihollinen()
174    {
175        vihunNumero++;
176
177        Vihollinen vihu = new Vihollinen(30, 30, elamat: vihunNumero * 3);
178        vihu.Color = Color.Red;
179        vihu.Image = vihuKuva;
180        vihu.Position = polku.Values[0];
181        Add(vihu);
182
183        PathFollowerBrain polkuAivot = new PathFollowerBrain(new List<Vector>(polku.Values));
184        polkuAivot.Speed = 100 + 5 * vihunNumero;
185        vihu.Brain = polkuAivot;
186    }
187
188    void LuoPaivitykset()
189    {
190        TorniPaivitys vihrea = new TorniPaivitys { Kuva = LoadImage("vihrea"), Hinta = 300, Vahinko = 1 };
191        TorniPaivitys sininen = new TorniPaivitys { Kuva = LoadImage("sininen"), Hinta = 500, Vahinko = 4 };
192        TorniPaivitys punainen = new TorniPaivitys { Kuva = LoadImage("punainen"), Hinta = 800, Vahinko = 5 };
193        TorniPaivitys kultainen = new TorniPaivitys { Kuva = LoadImage("kultainen"), Hinta = 1200, Vahinko = 7 };
194
195        vihrea.Seuraava = sininen;
196        sininen.Seuraava = punainen;
197        punainen.Seuraava = kultainen;
198
199        alkuPaivitys = vihrea;
200    }
201
202    void OstaTorni()
203    {
204        if (rahe.Value >= alkuPaivitys.Hinta)
205        {
206            rahe.Value -= alkuPaivitys.Hinta;
207
208            Torni torni = new Torni(50, 100, alkuPaivitys);
209            torni.Position = Mouse.PositionOnWorld;
210            torni.AmpumisAjastin = new Timer();
211            torni.AmpumisAjastin.Interval = 1;
212            torni.AmpumisAjastin.Timeout += delegate { TorniAmpuu(torni); };
213            torni.AmpumisAjastin.Start();
214            Add(torni);
215
216            Mouse.ListenOn(torni, MouseButton.Right, ButtonState.Pressed, delegate { PaivitaTorni(torni); }, null);
217        }
218    }
219
220    void LuoRaheLaskuri()
221    {
222        rahe = new IntMeter(0);
223
224        Label raheNaytto = new Label(rahe);
225        raheNaytto.Left = Screen.Left + 100;
226        raheNaytto.Top = Screen.Top - 100;
227        raheNaytto.IntFormatString = "Rahe: {0}";
228        Add(raheNaytto);
229
230        Timer raheAjastin = new Timer();
231        raheAjastin.Interval = 0.5;
232        raheAjastin.Timeout += delegate { rahe.Value += 50; };
233        raheAjastin.Start();
234    }
235
236    void LuoPolku(Vector paikka, double leveys, double korkeus)
237    {
238        GameObject polku = new GameObject(leveys, korkeus);
239        polku.Position = paikka;
240        Add(polku, -1);
241
242        polku.Image = polkuKuva;
243    }
244    void AsetaOhjaimet()
245    {
246        Keyboard.Listen(Key.F12, ButtonState.Pressed, delegate { PeliOhi(null,null); }, "Lopeta peli");
247
248        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
249        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, OstaTorni, "Rakenna uusi torni");
250    }
251    void PaivitaTorni(Torni torni)
252    {
253        TorniPaivitys uusiPaivitys = torni.Paivitys.Seuraava;
254
255        if (uusiPaivitys != null)
256        {
257            int paivityksenHinta = uusiPaivitys.Hinta - torni.Paivitys.Hinta;
258            if (rahe.Value >= paivityksenHinta)
259            {
260                rahe.Value -= paivityksenHinta;
261                torni.Paivitys = uusiPaivitys;
262                torni.Image = uusiPaivitys.Kuva;
263            }
264            else
265            {
266                MessageDisplay.Add("Rahet eivät riitä. Päivitys maksaa " + paivityksenHinta);
267            }
268        }
269    }
270    void TorniAmpuu(Torni torni)
271    {
272        // Etsitään aluksi lähin vihollinen.
273
274        GameObject kohde = null; // Potentiaalinen vaihtoehto lähimmäksi viholliseksi. Aluksi null, eli tyhjää.
275        double lyhin = double.MaxValue; // Etäisyys tornista toistaiseksi löydettyyn lähimpään viholliseen.
276        foreach (GameObject vihu in GetObjectsWithTag("vihu")) // Käydään silmukassa läpi kaikki pelin viholliset.
277        {
278            // Lasketaan etäisyys tornin ja vihollisen välillä.
279            double etaisyys = Vector.Distance(vihu.Position, torni.Position);
280
281            // Jos etäisyys on lyhyempi kuin tähän mennessä löydetty lyhin etäisyys, niin päivitetään
282            // lyhin muuttujaa ja valitaan kohdeeksi vihollinen, jolla tämä lyhin etäisyys oli.
283            if (etaisyys < lyhin)
284            {
285                lyhin = etaisyys;
286                kohde = vihu;
287            }
288        }
289
290        if (kohde != null) // Tarkistetaan löytyikö vihollista
291        {
292            // Jos vihollinen löytyi, niin luodaan ympyrän muotoinen musta ammus
293            // joka tuhoutuu kahdessa sekunnissa itsekseen.
294            PhysicsObject ammus = new PhysicsObject(10, 10, Shape.Circle);
295            ammus.Position = torni.Position;
296            ammus.Color = Color.Black;
297            ammus.LifetimeLeft = TimeSpan.FromSeconds(2);
298            Add(ammus);
299
300            //TODO: Voit poistaa/lisätä äänet laittamalla/poistamalla 2 X / ammusaani.Playn eteen.
301            //ammusaani.Play();
302
303            Vector nopeus = ((PhysicsObject)kohde).Velocity;
304            Vector paikka = kohde.Position + nopeus * 0.5;
305
306            double ammuksenNopeus = 500;  // Ammuksen liikkumisnopeus. Voit säätää tätä halutessasi.
307            Vector suunta = (paikka - torni.Position).Normalize(); // Lasketaan ammukselle suunta.
308            ammus.Hit(suunta * ammuksenNopeus); // Lyödään ammus liikkeelle.
309
310            // Lisätään törmäyskäsittelijä. Torni tekee vahinkoa osuneeseen viholliseen.
311            AddCollisionHandler(ammus, "vihu", torni.OsuuVihuun);
312        }
313    }
314
315    void LuoLinna(Vector paikka, double leveys, double korkeus)
316    {
317        PhysicsObject linna = PhysicsObject.CreateStaticObject(leveys * 6, korkeus * 4);
318        linna.Position = paikka;
319        linna.Image = linnaKuva;
320        Add(linna);
321
322        AddCollisionHandler(linna, "vihu", PeliOhi);
323    }
324
325    void PeliOhi(PhysicsObject linna, PhysicsObject vihu)
326    {
327        aikaLaskuri.Stop();
328        double aikaaKulunut = aikaLaskuri.SecondCounter.Value;
329
330        ClearAll();
331        topLista.EnterAndShow(aikaaKulunut);
332        //Label viesti = new Label(string.Format("Hävisit pelin.\n\nAikasi oli {0:0.0} sekuntia.", aikaaKulunut));
333        //Add(viesti);
334
335        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
336    }
337
338    void LuoAikaLaskuri()
339    {
340        aikaLaskuri = new Timer();
341        aikaLaskuri.Start();
342
343        Label aikaNaytto = new Label();
344        aikaNaytto.TextColor = Color.White;
345        aikaNaytto.DecimalPlaces = 1;
346        aikaNaytto.BindTo(aikaLaskuri.SecondCounter);
347        aikaNaytto.X = Screen.Right - 100;
348        aikaNaytto.Y = Screen.Top - 100;
349        Add(aikaNaytto);
350    }
351}
Note: See TracBrowser for help on using the repository browser.