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

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