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

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