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

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