source: 2016/30/TimoH/JamaicanBoksi3000/JamaicanBoksi3000/JamaicanBoksi3000/JamaicanBoksi3000.cs @ 8244

Revision 8244, 12.5 KB checked in by tihaapas, 5 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
10
11public class Torni : GameObject
12{
13    public TorniPaivitys Paivitys { get; set; }
14
15    public Timer AmpumisAjastin { get; set; }
16
17    public Torni(double leveys, double korkeus, TorniPaivitys paivitys)
18        : base(leveys, korkeus)
19    {
20        Paivitys = paivitys;
21        Image = Paivitys.Kuva;
22    }
23
24    public void OsuuVihuun(PhysicsObject ammus, PhysicsObject vihu)
25    {
26        ammus.Destroy();
27        ((Vihollinen)vihu).ElamaLaskuri.Value -= Paivitys.Vahinko;
28    }
29
30
31
32}
33
34class Vihollinen : PhysicsObject
35{
36    public IntMeter ElamaLaskuri { get; private set; }
37
38    public Vihollinen(double leveys, double korkeus, int elamat)
39        : base(leveys, korkeus)
40    {
41        ElamaLaskuri = new IntMeter(elamat, 0, elamat);
42        ElamaLaskuri.LowerLimit += Destroy;
43        Tag = "vihu";
44        CanRotate = false;
45
46        ProgressBar elamaPalkki = new ProgressBar(leveys * 1.2, 10, ElamaLaskuri);
47        elamaPalkki.BarColor = Color.DarkRed;
48        elamaPalkki.Color = Color.Black;
49        elamaPalkki.Bottom = Top + 5;
50        this.Add(elamaPalkki);
51    }
52}
53
54public class TorniPaivitys
55{
56    public int Hinta { get; set; }
57    public int Vahinko { get; set; }
58    public Image Kuva { get; set; }
59    public TorniPaivitys Seuraava { get; set; }
60
61}
62
63
64public class JamaicanBoksi3000 : PhysicsGame
65{
66    SortedList<char, Vector> polku;
67    IntMeter raha;
68    bool viestiaEinaytetty = true;
69
70    TorniPaivitys alkuPaivitys;
71    Image linnakuva = LoadImage("linna");
72    Image polkukuva = LoadImage("polku");
73    Image nurmikkoKuva = LoadImage("nurmikko");
74    Image mutsiskuva = LoadImage("mutSIS");
75    Image teleporttiKuva = LoadImage("teleport");
76
77    SoundEffect kuolema = LoadSoundEffect("sfx");
78
79
80    EasyHighScore topLista = new EasyHighScore();
81
82    int vihunNumero;
83    int kenttanumero = 1;
84
85    DoubleMeter aikalaskuri = new DoubleMeter(0);
86
87    //Vector tp1;
88    Dictionary<string, Vector> tpPaikat = new Dictionary<string, Vector>();
89
90    public override void Begin()
91    {
92        topLista.HighScoreWindow.Closed += (w) => Exit();
93
94        AloitaPeli();
95    }
96
97    void AloitaPeli()
98    {
99        ClearAll();
100        LuoPaivitykset();
101        LuoKenttä();
102        LuoRahaLaskuri();
103        AsetaOhjaimet();
104        LuoAikaLaskuri();
105        LuoTeksti();
106
107        IsMouseVisible = true;
108
109        Timer vihuAjastin = new Timer();
110        vihuAjastin.Interval = 0.5;
111        vihuAjastin.Timeout += LuoVihollinen;
112        vihuAjastin.Start();
113
114
115
116    }
117
118    void LuoPaivitykset()
119    {
120        TorniPaivitys vihrea = new TorniPaivitys { Kuva = LoadImage("vihrea"), Hinta = 300, Vahinko = 1 * 4 };
121        TorniPaivitys sininen = new TorniPaivitys { Kuva = LoadImage("sininen"), Hinta = 500, Vahinko = 4 * 2 };
122        TorniPaivitys punainen = new TorniPaivitys { Kuva = LoadImage("punainen"), Hinta = 800, Vahinko = 5 * 2 };
123        TorniPaivitys kultainen = new TorniPaivitys { Kuva = LoadImage("kultainen"), Hinta = 1000, Vahinko = 7 * 3 };
124
125        vihrea.Seuraava = sininen;
126        sininen.Seuraava = punainen;
127        punainen.Seuraava = kultainen;
128
129        alkuPaivitys = vihrea;
130
131    }
132
133    void AsetaOhjaimet()
134    {
135        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, OstaTorni, "Rakenna uusi torni");
136        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
137
138
139
140    }
141
142    void AlkuValikko()
143    {
144
145
146        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
147        "Aloita peli", "Parhaat pisteet", "Lopeta");
148        Add(alkuValikko);
149
150    }
151
152
153    void OstaTorni()
154    {
155        if (raha.Value >= alkuPaivitys.Hinta)
156        {
157            raha.Value -= alkuPaivitys.Hinta;
158
159            Torni torni = new Torni(50, 100, alkuPaivitys);
160            torni.Color = Color.Green;
161            torni.Position = Mouse.PositionOnWorld;
162            torni.AmpumisAjastin = new Timer();
163            torni.AmpumisAjastin.Interval = 1;
164            torni.AmpumisAjastin.Timeout += delegate { TorniAmpuu(torni); };
165            torni.AmpumisAjastin.Start();
166            Add(torni);
167            Mouse.ListenOn(torni, MouseButton.Right, ButtonState.Pressed, delegate { PaivitaTorni(torni); }, null);
168        }
169    }
170
171    void PaivitaTorni(Torni torni)
172    {
173        TorniPaivitys uusiPaivitys = torni.Paivitys.Seuraava;
174
175        if (uusiPaivitys != null)
176        {
177            int paivityksenHinta = uusiPaivitys.Hinta - torni.Paivitys.Hinta;
178            if (raha.Value >= paivityksenHinta)
179            {
180                raha.Value -= paivityksenHinta;
181                torni.Paivitys = uusiPaivitys;
182                torni.Image = uusiPaivitys.Kuva;
183            }
184            else
185            {
186                MessageDisplay.Add("Jamaican Dollarit ei riitä. Päivitys maksaa " + paivityksenHinta);
187            }
188        }
189
190    }
191
192
193    void LuoKenttä()
194    {
195
196        tpPaikat.Clear();
197        polku = new SortedList<char, Vector>();
198
199        if (kenttanumero > 7)
200        {
201            Exit();
202        }
203        TileMap ruudut = TileMap.FromLevelAsset("Jamaicanboksi" + kenttanumero);
204        ruudut.SetTileMethod('!', LuoLinna);
205        ruudut.SetTileMethod('%', LuoPolku);
206
207        ruudut.SetTileMethod('1', LuoTeleporttiEka, "tp1");
208        ruudut.SetTileMethod('2', LuoTeleporttiToka, "tp1");
209
210        ruudut.SetTileMethod('3', LuoTeleporttiEka, "tp2");
211        ruudut.SetTileMethod('4', LuoTeleporttiToka, "tp2");
212
213        ruudut.SetTileMethod('5', LuoTeleporttiEka, "tp3");
214        ruudut.SetTileMethod('6', LuoTeleporttiToka, "tp3");
215
216        ruudut.SetTileMethod('7', LuoTeleporttiEka, "tp4");
217        ruudut.SetTileMethod('8', LuoTeleporttiToka, "tp4");
218
219        ruudut.SetTileMethod('9', LuoTeleporttiEka, "tp5");
220        ruudut.SetTileMethod('0', LuoTeleporttiToka, "tp5");
221
222
223        for (char merkki = 'A'; merkki <= 'Z'; merkki++)
224        {
225            ruudut.SetTileMethod(merkki, LuoKulma, merkki);
226        }
227        ruudut.Execute(30, 30);
228
229        Level.Background.Image = nurmikkoKuva;
230        Level.Background.TileToLevel();
231
232        //Camera.ZoomToAllObjects();
233        Camera.ZoomToLevel();
234
235        Timer.SingleShot(80, delegate
236        {
237            kenttanumero++;
238            AloitaPeli();
239        });
240
241    }
242
243
244
245    void LuoLinna(Vector paikka, double leveys, double korkeus)
246    {
247        PhysicsObject linna = PhysicsObject.CreateStaticObject(leveys * 6, korkeus * 4);
248        linna.Position = paikka;
249        linna.Image = linnakuva;
250        Add(linna);
251
252        AddCollisionHandler(linna, "vihu", PeliOhi);
253    }
254
255    void PeliOhi(PhysicsObject linna, PhysicsObject vihu)
256    {
257        ClearAll();
258        Label viesti = new Label("hävisit pelin");
259        Add(viesti);
260
261        topLista.EnterAndShow(aikalaskuri.Value);
262        aikalaskuri.Value = 0;
263
264        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
265    }
266
267
268
269    void LuoPolku(Vector paikka, double leveys, double korkeus)
270    {
271        GameObject polku = new GameObject(leveys, korkeus);
272        polku.Image = polkukuva;
273        polku.Position = paikka;
274        Add(polku, -1);
275    }
276
277    void LuoTeleporttiEka(Vector paikka, double leveys, double korkeus, string tag)
278    {
279        PhysicsObject tp = new PhysicsObject(leveys, korkeus);
280        //polku.Image = polkukuva;
281        tp.Position = paikka;
282        tp.Image = teleporttiKuva;
283        tp.Tag = tag;
284        Add(tp, -1);
285        tp.MakeStatic();
286    }
287
288    void LuoTeleporttiToka(Vector paikka, double leveys, double korkeus, string tag)
289    {
290        GameObject tp = new GameObject(leveys, korkeus);
291        //polku.Image = polkukuva;
292        tp.Position = paikka;
293        Add(tp, -1);
294        tp.Image = teleporttiKuva;
295        tpPaikat.Add(tag, paikka);
296    }
297
298    void LuoKulma(Vector paikka, double leveys, double korkeus, char merkki)
299    {
300        polku.Add(merkki, paikka);
301        LuoPolku(paikka, leveys, korkeus);
302    }
303
304    void TorniAmpuu(Torni torni)
305    {
306        // Etsitään aluksi lähin vihollinen.
307
308        GameObject kohde = null; // Potentiaalinen vaihtoehto lähimmäksi viholliseksi. Aluksi null, eli tyhjää.
309        double lyhin = double.MaxValue; // Etäisyys tornista toistaiseksi löydettyyn lähimpään viholliseen.
310        foreach (GameObject vihu in GetObjectsWithTag("vihu")) // Käydään silmukassa läpi kaikki pelin viholliset.
311        {
312            // Lasketaan etäisyys tornin ja vihollisen välillä.
313            double etaisyys = Vector.Distance(vihu.Position, torni.Position);
314
315            // Jos etäisyys on lyhyempi kuin tähän mennessä löydetty lyhin etäisyys, niin päivitetään
316            // lyhin muuttujaa ja valitaan kohdeeksi vihollinen, jolla tämä lyhin etäisyys oli.
317            if (etaisyys < lyhin)
318            {
319                lyhin = etaisyys;
320                kohde = vihu;
321            }
322        }
323
324        if (kohde != null) // Tarkistetaan löytyikö vihollista
325        {
326            // Jos vihollinen löytyi, niin luodaan ympyrän muotoinen musta ammus
327            // joka tuhoutuu kahdessa sekunnissa itsekseen.
328            PhysicsObject ammus = new PhysicsObject(10, 10, Shape.Circle);
329            ammus.Position = torni.Position;
330            ammus.Color = Color.Black;
331            ammus.LifetimeLeft = TimeSpan.FromSeconds(5);
332            Add(ammus);
333
334            double ammuksenNopeus = 1000;  // Ammuksen liikkumisnopeus. Voit säätää tätä halutessasi.
335            Vector suunta = (kohde.Position - torni.Position).Normalize(); // Lasketaan ammukselle suunta.
336            ammus.Hit(suunta * ammuksenNopeus); // Lyödään ammus liikkeelle.
337
338            // Lisätään törmäyskäsittelijä. Torni tekee vahinkoa osuneeseen viholliseen.
339            AddCollisionHandler(ammus, "vihu", torni.OsuuVihuun);
340        }
341    }
342
343    void LuoVihollinen()
344    {
345        vihunNumero++;
346
347
348        Vihollinen vihu = new Vihollinen(50, 50, elamat: vihunNumero * 3);
349        vihu.Color = Color.Red;
350        vihu.Tag = "vihu";
351        vihu.Shape = Shape.Circle;
352        vihu.Image = mutsiskuva;
353        vihu.Position = polku.Values[0];
354        Add(vihu);
355
356        AddCollisionHandler(vihu, "tp1", TormaaTeleporttiin);
357        AddCollisionHandler(vihu, "tp2", TormaaTeleporttiin);
358        AddCollisionHandler(vihu, "tp3", TormaaTeleporttiin);
359        AddCollisionHandler(vihu, "tp4", TormaaTeleporttiin);
360        AddCollisionHandler(vihu, "tp5", TormaaTeleporttiin);
361
362        vihu.ElamaLaskuri.LowerLimit += VihuKuolee;
363
364        PathFollowerBrain polkuAivot = new PathFollowerBrain(new List<Vector>(polku.Values));
365        polkuAivot.Speed = 400;
366        vihu.Brain = polkuAivot;
367    }
368
369    void TormaaTeleporttiin(PhysicsObject vihu, PhysicsObject tp)
370    {
371        vihu.Position = tpPaikat[tp.Tag.ToString()];
372    }
373
374    void VihuKuolee()
375    {
376        kuolema.Play();   
377
378    }
379
380    void LuoRahaLaskuri()
381    {
382        raha = new IntMeter(100);
383
384        Label rahaNautto = new Label(raha);
385        rahaNautto.Left = Screen.Left + 120;
386        rahaNautto.Top = Screen.Top - 100;
387        rahaNautto.IntFormatString = "Jamaican Dollars: {0}";
388        Add(rahaNautto);
389
390        Timer rahaAjastin = new Timer();
391        rahaAjastin.Interval = 0.25;
392        rahaAjastin.Timeout += delegate { raha.Value += 500; };
393        rahaAjastin.Start();
394
395    }
396
397    void LuoAikaLaskuri()
398    {
399       
400        Timer laskuri = new Timer();
401        laskuri.Interval = 0.1;
402        laskuri.Timeout += () => aikalaskuri.Value += 0.1;
403        laskuri.Start();
404
405        Label aikaNaytto = new Label();
406        aikaNaytto.TextColor = Color.Black;
407        aikaNaytto.X = Level.Right - 250;
408        aikaNaytto.Y = Level.Top - 220;
409
410        aikaNaytto.DecimalPlaces = 1;
411        aikaNaytto.Color = Color.White;
412        aikaNaytto.BindTo(aikalaskuri);
413        Add(aikaNaytto);
414    }
415
416    void LuoTeksti()
417    {
418        if (viestiaEinaytetty)
419        {
420            Label tekstikentta = new Label();
421            tekstikentta.Text = "Vihollisten hatussa lukee mutSIS Jos on kysyttävää :D";
422
423            tekstikentta.Y = Screen.Top - 115;
424            tekstikentta.X = 0;
425
426            Add(tekstikentta);
427            Timer.SingleShot(3.0, delegate { tekstikentta.Destroy(); });
428            viestiaEinaytetty = false;
429        }
430
431
432    }
433
434
435
436
437}
Note: See TracBrowser for help on using the repository browser.