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

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