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

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