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

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