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

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