source: 2014/27/PekkaR/D2x_2d/D2x_2d/D2x_2d/D2x_2d.cs @ 5435

Revision 5435, 13.3 KB checked in by pealrist, 6 years ago (diff)
Line 
1#undef DEBUG
2
3using System;
4using System.Collections.Generic;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Controls;
8using Jypeli.Effects;
9using Jypeli.Widgets;
10
11public class D2x_2d : PhysicsGame
12{
13    public class Shieldable : PhysicsObject
14    {
15        public IntMeter shield = new IntMeter(0);
16
17        public Shieldable(int w, int h) : base(w, h)
18        {
19
20        }
21
22        public IntMeter getShieldMeter()
23        {
24            return shield;
25        }
26
27        public int getShield()
28        {
29            return shield.Value;
30        }
31
32        public
33#if DEBUG
34            virtual
35#endif
36            Explosion setShield(int t)
37        {
38            if (t > 0)
39            {
40                shield.Value = t;
41                return null;
42            }
43            else
44            {
45                shield.Value = 0;
46                Explosion r = new Explosion(50);
47                r.Position = Position;
48                r.Force = 500;
49                Destroy();
50                return r;
51            }
52        }
53    }
54
55    public class Pelaaja : Shieldable
56    {
57        private IntMeter energy = new IntMeter(200);
58
59        public Pelaaja(int w, int h) : base(w, h)
60        {
61            shield.Value = 100;
62            Tag = "pelaaja";
63            MomentOfInertia = Double.PositiveInfinity;
64            Restitution = 0;
65            KineticFriction = 1;
66        }
67
68#if DEBUG
69        public override Explosion setShield(int t)
70        {
71            return null;
72        }
73#endif
74
75        public IntMeter getEnergyMeter()
76        {
77            return energy;
78        }
79
80        public void AddEnergy(int inc)
81        {
82            energy.Value += inc;
83        }
84
85        public void Lataa()
86        {
87            if(energy.Value < 200) energy.Value = 200;
88        }
89
90        public Ammus Ammu()
91        {
92#if !DEBUG
93            if (energy.Value > 0)
94            {
95#endif
96            Ammus a = new Ammus(4, "ToV", Angle.GetVector(), 1);
97            a.Position = Position;
98            energy.Value--;
99            return a;
100#if !DEBUG
101            }
102            else return null;
103#endif
104        }
105    }
106
107    public class Vihollinen : Shieldable
108    {
109        private int deal, koko;
110
111        public Vihollinen(int d, int w, int h, int k) : base(w, h)
112        {
113            deal = d;
114            koko = k;
115            Tag = "vihollinen";
116            Color = Color.Green;
117        }
118
119        public Ammus Ammu(PhysicsObject kohde)
120        {
121            Vector s = (kohde.Position - Position).Normalize();
122            Ammus a = new Ammus(deal, "ToP", s, koko);
123            a.Position = Position;
124            return a;
125        }
126    }
127
128    public class Ammus : PhysicsObject
129    {
130        private int deal;
131
132        public Ammus(int d, string t, Vector suunta, int koko)
133            : base(3 * koko, 3 * koko)
134        {
135            deal = d;
136            Tag = "ammus" + t;
137            Shape = Shape.Circle;
138            Restitution = 0;
139            KineticFriction = 1;
140            MomentOfInertia = Double.PositiveInfinity;
141            Color = Color.YellowGreen;
142            Timer.SingleShot(5.0, Destroy);
143            Hit(suunta * 120);
144        }
145
146        public int getDeal()
147        {
148            return deal;
149        }
150    }
151
152    protected Pelaaja pelaaja;
153    protected PhysicsObject exit;
154    protected Vihollinen reaktori;
155    protected IntMeter pisteet;
156
157    private bool playeradded = false;
158
159    private bool altpressed;
160    private bool ctrlpressed;
161
162    public override void Begin()
163    {
164        LuoKuuntelijat();
165        NaytaValikko();
166    }
167
168    private void LuoKuuntelijat()
169    {
170        Keyboard.Listen(Key.A, ButtonState.Down, delegate { pelaaja.Velocity = pelaaja.Angle.GetVector() * 80; }, null);
171        Keyboard.Listen(Key.A, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
172        Keyboard.Listen(Key.Z, ButtonState.Down, delegate { pelaaja.Velocity = pelaaja.Angle.GetVector() * -80; }, null);
173        Keyboard.Listen(Key.Z, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
174        Keyboard.Listen(Key.Left, ButtonState.Down, delegate { if (altpressed) pelaaja.Velocity = (pelaaja.Angle + Angle.RightAngle).GetVector() * 80; else pelaaja.Angle = pelaaja.Angle + (Angle.RightAngle / 35
175            ); }, null);
176        Keyboard.Listen(Key.Left, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
177        Keyboard.Listen(Key.Right, ButtonState.Down, delegate { if (altpressed) pelaaja.Velocity = (pelaaja.Angle - Angle.RightAngle).GetVector() * 80; else pelaaja.Angle = pelaaja.Angle - (Angle.RightAngle / 35); }, null);
178        Keyboard.Listen(Key.Right, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
179        Keyboard.Listen(Key.LeftAlt, ButtonState.Pressed, delegate { altpressed = true; }, null);
180        Keyboard.Listen(Key.LeftAlt, ButtonState.Released, delegate { altpressed = false; }, null);
181
182        Keyboard.Listen(Key.LeftControl, ButtonState.Pressed, delegate { ctrlpressed = true; Timer j = new Timer(); j.Interval = 0.5; j.Timeout += delegate { if (ctrlpressed) { Ammus a = pelaaja.Ammu(); if (a != null) Add(a); } }; j.Start(); }, null);
183        Keyboard.Listen(Key.LeftControl, ButtonState.Released, delegate { ctrlpressed = false; }, null);
184
185        Keyboard.Listen(Key.Pause, ButtonState.Pressed, Pause, null);
186        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, null);
187        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Exit the game");
188    }
189
190    private void NaytaValikko()
191    {
192        MultiSelectWindow alkuValikko = new MultiSelectWindow("", "Start game", "Exit");
193        alkuValikko.AddItemHandler(0, AloitaPeli);
194        alkuValikko.AddItemHandler(1, Exit);
195        alkuValikko.DefaultCancel = 1;
196        Add(alkuValikko);
197    }
198
199    private void AloitaPeli()
200    {
201        InputWindow kysymysIkkuna = new InputWindow("Enter the level number");
202        kysymysIkkuna.TextEntered += LuoKentta;
203        Add(kysymysIkkuna);
204    }
205
206    private void LuoKentta(InputWindow ikkuna)
207    {
208        try
209        {
210            TileMap ruudut = TileMap.FromLevelAsset(ikkuna.InputBox.Text);
211            ruudut.SetTileMethod('P', LuoPelaaja);
212            ruudut.SetTileMethod('V', LuoVihollinen);
213            ruudut.SetTileMethod('-', LuoSeina);
214            ruudut.SetTileMethod('S', LuoShield);
215            ruudut.SetTileMethod('E', LuoEnergia);
216            ruudut.SetTileMethod('C', LuoLatauspaikka);
217            ruudut.SetTileMethod('X', LuoExit);
218            ruudut.SetTileMethod('R', LuoReaktori);
219            ruudut.SetTileMethod('@', LuoExitTak);
220            ruudut.Optimize('-');
221            ruudut.Execute(40, 40);
222
223            Level.Background.Color = Color.LightGray;
224            pisteet = new IntMeter(0);
225            Label pisteNaytto = new Label();
226            pisteNaytto.X = Screen.Left + 100;
227            pisteNaytto.Y = Screen.Bottom + 100;
228            pisteNaytto.TextColor = Color.Black;
229            pisteNaytto.Color = Color.White;
230            pisteNaytto.BindTo(pisteet);
231            Add(pisteNaytto);
232        }
233        catch (Exception)
234        {
235            MessageDisplay.Add("Level number out of range");
236            Begin();
237        }
238    }
239
240    private void LuoVihollinen(Vector paikka, double leveys, double korkeus)
241    {
242        Vihollinen vih = new Vihollinen(6, 10, 10, 1);
243        vih.Position = paikka;
244        vih.Tag = "vihollinen";
245        vih.setShield(20);
246        Timer ajastin = new Timer();
247        ajastin.Interval = 0.8;
248        ajastin.Timeout += delegate { if (!(pelaaja.IsDestroyed || vih.IsDestroyed) && RandomGen.NextBool()) Add(vih.Ammu(pelaaja)); vih.Move(RandomGen.NextVector(20, 20)); };
249        ajastin.Start();
250        AddCollisionHandler<Vihollinen, Ammus>(vih, "ammusToV", Osuma);
251        Add(vih);
252    }
253
254    private void LuoSeina(Vector paikka, double leveys, double korkeus)
255    {
256        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
257        seina.Position = paikka;
258        seina.Tag = "seina";
259        AddCollisionHandler<PhysicsObject, Ammus>(seina, KasitteleAmmus);
260        Add(seina);
261    }
262
263    private void KasitteleAmmus(PhysicsObject seina, Ammus kohde)
264    {
265        kohde.Destroy();
266    }
267
268    private void LuoPelaaja(Vector paikka, double leveys, double korkeus)
269    {
270        if (playeradded) throw new Exception("Too many players");
271        pelaaja = new Pelaaja(10, 10);
272        pelaaja.Position = paikka;
273        pelaaja.setShield(100);
274
275        Label shieldNaytto = new Label();
276        shieldNaytto.X = Screen.Left + 100;
277        shieldNaytto.Y = Screen.Top - 100;
278        shieldNaytto.TextColor = Color.Blue;
279        shieldNaytto.Color = Color.White;
280        shieldNaytto.Title = "Shield";
281        shieldNaytto.BindTo(pelaaja.shield);
282        Add(shieldNaytto);
283
284        Label eNaytto = new Label();
285        eNaytto.X = Screen.Left + 250;
286        eNaytto.Y = Screen.Top - 100;
287        eNaytto.TextColor = Color.Yellow;
288        eNaytto.Color = Color.Black;
289        eNaytto.Title = "Energy";
290        eNaytto.BindTo(pelaaja.getEnergyMeter());
291        Add(eNaytto);
292
293        AddCollisionHandler<Pelaaja, Ammus>(pelaaja, "ammusToP", Osuma);
294        Add(pelaaja);
295        Camera.Follow(pelaaja);
296        Camera.Zoom(1.8);
297        playeradded = true;
298
299    }
300
301    private void LuoShield(Vector paikka, double leveys, double korkeus)
302    {
303        PhysicsObject shield = new PhysicsObject(10, 10);
304        shield.Position = paikka;
305        shield.Shape = Shape.Circle;
306        shield.Color = Color.Blue;
307        AddCollisionHandler<PhysicsObject, Pelaaja>(shield, "pelaaja", delegate { pelaaja.setShield(pelaaja.getShield() + 20); shield.Destroy(); });
308        Add(shield);
309    }
310
311    private void LuoEnergia(Vector paikka, double leveys, double korkeus)
312    {
313        PhysicsObject energia = new PhysicsObject(10, 10);
314        energia.Position = paikka;
315        energia.Shape = Shape.Circle;
316        energia.Color = Color.Yellow;
317        AddCollisionHandler<PhysicsObject, Pelaaja>(energia, "pelaaja", LisaaEnergiaa);
318        Add(energia);
319    }
320
321    private void LuoLatauspaikka(Vector paikka, double leveys, double korkeus)
322    {
323        PhysicsObject lp = PhysicsObject.CreateStaticObject(leveys, korkeus);
324        lp.Position = paikka;
325        lp.Shape = Shape.Rectangle;
326        lp.Color = Color.Yellow;
327        AddCollisionHandler<PhysicsObject, Pelaaja>(lp, "pelaaja", delegate { pelaaja.Lataa(); });
328        Add(lp);
329    }
330
331    private void LuoReaktori(Vector paikka, double leveys, double korkeus)
332    {
333        reaktori = new Vihollinen(8, 30, 30, 2);
334        reaktori.Position = paikka;
335        reaktori.MakeStatic();
336        reaktori.Color = Color.OrangeRed;
337        reaktori.setShield(50);
338        AddCollisionHandler<Shieldable, Ammus>(reaktori, "ammusToV", Osuma);
339        Timer ajastin = new Timer();
340        ajastin.Interval = 0.6;
341        ajastin.Timeout += delegate { if (!(pelaaja.IsDestroyed || reaktori.IsDestroyed) && RandomGen.NextBool()) { Ammus am = reaktori.Ammu(pelaaja); am.Color = Color.Red; Add(am); } };
342        ajastin.Start();
343        Add(reaktori);
344    }
345
346    private void LuoExit(Vector paikka, double leveys, double korkeus)
347    {
348        exit = PhysicsObject.CreateStaticObject(leveys, korkeus);
349        exit.Position = paikka;
350        exit.Color = Color.Brown;
351        Add(exit);
352    }
353
354    private void LuoExitTak(Vector paikka, double leveys, double korkeus)
355    {
356        PhysicsObject et = PhysicsObject.CreateStaticObject(leveys, korkeus);
357        et.Position = paikka;
358        et.Color = Color.LightGray;
359        AddCollisionHandler<PhysicsObject, Pelaaja>(et, "pelaaja", delegate { ClearAll(); playeradded = false; MessageDisplay.Add("You won the game"); Begin(); });
360        Add(et);
361    }
362
363    private void Osuma(Shieldable p, Ammus kohde)
364    {
365        kohde.Destroy();
366        Explosion a = p.setShield(p.getShield() - kohde.getDeal());
367        if (a != null)
368        {
369            Add(a);
370            if(p == pelaaja)
371            {
372                ClearAll();
373                playeradded = false;
374                MessageDisplay.Add("Game over");
375                Begin();
376                return;
377            }
378            else pisteet.Value += 20;
379            if (p == reaktori)
380            {
381                pisteet.Value += 10;
382                int time = 30;
383                exit.Destroy();
384                IntMeter aika = new IntMeter(time);
385                Timer jak = new Timer();
386                jak.Interval = 1;
387                jak.Timeout += delegate { aika.Value--; if (aika.Value <= 0) { ClearAll(); MessageDisplay.Add("Game over"); playeradded = false; Begin(); } };
388                jak.Start();
389
390                Label aikaNaytto = new Label();
391                aikaNaytto.TextColor = Color.Green;
392                aikaNaytto.X = Screen.Right - 100;
393                aikaNaytto.Y = Screen.Top - 100;
394                aikaNaytto.Title = "Time";
395                aikaNaytto.BindTo(aika);
396                Add(aikaNaytto);
397            }
398        }
399    }
400
401    private void LisaaEnergiaa(PhysicsObject energ, Pelaaja kohde)
402    {
403        kohde.AddEnergy(30);
404        energ.Destroy();
405    }
406}
Note: See TracBrowser for help on using the repository browser.