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

Revision 5381, 11.9 KB checked in by pealrist, 7 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.Red;
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
156    private bool playeradded = false;
157
158    private bool altpressed;
159    private bool ctrlpressed;
160
161    public override void Begin()
162    {
163        LuoKuuntelijat();
164        NaytaValikko();
165    }
166
167    private void LuoKuuntelijat()
168    {
169        Keyboard.Listen(Key.A, ButtonState.Down, delegate { pelaaja.Velocity = pelaaja.Angle.GetVector() * 70; }, null);
170        Keyboard.Listen(Key.A, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
171        Keyboard.Listen(Key.Z, ButtonState.Down, delegate { pelaaja.Velocity = pelaaja.Angle.GetVector() * -70; }, null);
172        Keyboard.Listen(Key.Z, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
173        Keyboard.Listen(Key.Left, ButtonState.Down, delegate { if (altpressed) pelaaja.Velocity = (pelaaja.Angle + Angle.RightAngle).GetVector() * 70; else pelaaja.Angle = pelaaja.Angle + (Angle.RightAngle / 40); }, null);
174        Keyboard.Listen(Key.Left, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
175        Keyboard.Listen(Key.Right, ButtonState.Down, delegate { if (altpressed) pelaaja.Velocity = (pelaaja.Angle - Angle.RightAngle).GetVector() * 70; else pelaaja.Angle = pelaaja.Angle - (Angle.RightAngle / 40); }, null);
176        Keyboard.Listen(Key.Right, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
177        Keyboard.Listen(Key.LeftAlt, ButtonState.Pressed, delegate { altpressed = true; }, null);
178        Keyboard.Listen(Key.LeftAlt, ButtonState.Released, delegate { altpressed = false; }, null);
179
180        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);
181        Keyboard.Listen(Key.LeftControl, ButtonState.Released, delegate { ctrlpressed = false; }, null);
182
183        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Exit the game");
184    }
185
186    private void NaytaValikko()
187    {
188        MultiSelectWindow alkuValikko = new MultiSelectWindow("", "Start game", "Exit");
189        alkuValikko.AddItemHandler(0, AloitaPeli);
190        alkuValikko.AddItemHandler(1, ConfirmExit);
191        alkuValikko.DefaultCancel = 1;
192        Add(alkuValikko);
193    }
194
195    private void AloitaPeli()
196    {
197        InputWindow kysymysIkkuna = new InputWindow("Enter the level number");
198        kysymysIkkuna.TextEntered += LuoKentta;
199        Add(kysymysIkkuna);
200    }
201
202    private void LuoKentta(InputWindow ikkuna)
203    {
204        try
205        {
206            TileMap ruudut = TileMap.FromLevelAsset(ikkuna.InputBox.Text);
207            ruudut.SetTileMethod('P', LuoPelaaja);
208            ruudut.SetTileMethod('V', LuoVihollinen);
209            ruudut.SetTileMethod('-', LuoSeina);
210            ruudut.SetTileMethod('S', LuoShield);
211            ruudut.SetTileMethod('E', LuoEnergia);
212            ruudut.SetTileMethod('C', LuoLatauspaikka);
213            ruudut.SetTileMethod('X', LuoExit);
214            ruudut.SetTileMethod('R', LuoReaktori);
215            ruudut.SetTileMethod('@', LuoExitTak);
216            ruudut.Optimize('-');
217            ruudut.Execute(40, 40);
218        }
219        catch (Exception)
220        {
221            MessageDisplay.Add("Level number out of range");
222        }
223    }
224
225    private void LuoVihollinen(Vector paikka, double leveys, double korkeus)
226    {
227        Vihollinen vih = new Vihollinen(1, 10, 10, 1);
228        vih.Position = paikka;
229        vih.Tag = "vihollinen";
230        vih.setShield(10);
231        Timer ajastin = new Timer();
232        ajastin.Interval = 0.8;
233        ajastin.Timeout += delegate { if (!(pelaaja.IsDestroyed || vih.IsDestroyed) && RandomGen.NextBool()) Add(vih.Ammu(pelaaja)); vih.Move(RandomGen.NextVector(20, 20)); };
234        ajastin.Start();
235        AddCollisionHandler<Vihollinen, Ammus>(vih, "ammusToV", Osuma);
236        Add(vih);
237    }
238
239    private void LuoSeina(Vector paikka, double leveys, double korkeus)
240    {
241        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
242        seina.Position = paikka;
243        seina.Tag = "seina";
244        AddCollisionHandler<PhysicsObject, Ammus>(seina, KasitteleAmmus);
245        Add(seina);
246    }
247
248    private void KasitteleAmmus(PhysicsObject seina, Ammus kohde)
249    {
250        kohde.Destroy();
251    }
252
253    private void LuoPelaaja(Vector paikka, double leveys, double korkeus)
254    {
255        if (playeradded) throw new Exception("Too many players");
256        pelaaja = new Pelaaja(10, 10);
257        pelaaja.Position = paikka;
258        pelaaja.setShield(100);
259
260        Label shieldNaytto = new Label();
261        shieldNaytto.X = Screen.Left + 100;
262        shieldNaytto.Y = Screen.Top - 100;
263        shieldNaytto.TextColor = Color.Black;
264        shieldNaytto.Color = Color.White;
265        shieldNaytto.BindTo(pelaaja.shield);
266        Add(shieldNaytto);
267
268        Label eNaytto = new Label();
269        eNaytto.X = Screen.Left + 200;
270        eNaytto.Y = Screen.Top - 100;
271        eNaytto.TextColor = Color.Black;
272        eNaytto.Color = Color.White;
273        eNaytto.BindTo(pelaaja.getEnergyMeter());
274        Add(eNaytto);
275        AddCollisionHandler<Pelaaja, Ammus>(pelaaja, "ammusToP", Osuma);
276        Add(pelaaja);
277        Camera.Follow(pelaaja);
278        Camera.Zoom(1.6);
279        playeradded = true;
280
281    }
282
283    private void LuoShield(Vector paikka, double leveys, double korkeus)
284    {
285        PhysicsObject shield = new PhysicsObject(10, 10);
286        shield.Position = paikka;
287        shield.Shape = Shape.Circle;
288        shield.Color = Color.Blue;
289        AddCollisionHandler<PhysicsObject, Pelaaja>(shield, "pelaaja", delegate { pelaaja.setShield(pelaaja.getShield() + 20); shield.Destroy(); });
290        Add(shield);
291    }
292
293    private void LuoEnergia(Vector paikka, double leveys, double korkeus)
294    {
295        PhysicsObject energia = new PhysicsObject(10, 10);
296        energia.Position = paikka;
297        energia.Shape = Shape.Circle;
298        energia.Color = Color.Yellow;
299        AddCollisionHandler<PhysicsObject, Pelaaja>(energia, "pelaaja", LisaaEnergiaa);
300        Add(energia);
301    }
302
303    private void LuoLatauspaikka(Vector paikka, double leveys, double korkeus)
304    {
305        PhysicsObject lp = PhysicsObject.CreateStaticObject(leveys, korkeus);
306        lp.Position = paikka;
307        lp.Shape = Shape.Rectangle;
308        lp.Color = Color.Yellow;
309        AddCollisionHandler<PhysicsObject, Pelaaja>(lp, "pelaaja", delegate { pelaaja.Lataa(); });
310        Add(lp);
311    }
312
313    private void LuoReaktori(Vector paikka, double leveys, double korkeus)
314    {
315        reaktori = new Vihollinen(5, 30, 30, 2);
316        reaktori.Position = paikka;
317        reaktori.MakeStatic();
318        reaktori.Color = Color.OrangeRed;
319        reaktori.setShield(50);
320        AddCollisionHandler<Shieldable, Ammus>(reaktori, "ammusToV", Osuma);
321        Timer ajastin = new Timer();
322        ajastin.Interval = 0.6;
323        ajastin.Timeout += delegate { if (!(pelaaja.IsDestroyed || reaktori.IsDestroyed) && RandomGen.NextBool()) Add(reaktori.Ammu(pelaaja)); };
324        ajastin.Start();
325        Add(reaktori);
326    }
327
328    private void LuoExit(Vector paikka, double leveys, double korkeus)
329    {
330        exit = PhysicsObject.CreateStaticObject(leveys, korkeus);
331        exit.Position = paikka;
332        exit.Color = Color.Brown;
333        Add(exit);
334    }
335
336    private void LuoExitTak(Vector paikka, double leveys, double korkeus)
337    {
338        PhysicsObject et = PhysicsObject.CreateStaticObject(leveys, korkeus);
339        et.Position = paikka;
340        et.Color = new Color(255, 255, 255, 0);
341        AddCollisionHandler<PhysicsObject, Pelaaja>(et, "pelaaja", delegate { ClearAll(); playeradded = false; MessageDisplay.Add("You won the game"); Begin(); });
342        Add(et);
343    }
344
345    private void Osuma(Shieldable p, Ammus kohde)
346    {
347        Explosion a = p.setShield(p.getShield() - kohde.getDeal());
348        if (a != null)
349        {
350            Add(a);
351            if (p == reaktori)
352            {
353                exit.Destroy();
354                IntMeter jaika = new IntMeter(0);
355                jaika.Value = 50;
356                Timer jak = new Timer();
357                Timer.SingleShot(50, delegate { });
358                jak.Interval = 1;
359                jak.Timeout += delegate { jaika.Value--; };
360            }
361        }
362        kohde.Destroy();
363    }
364
365    private void LisaaEnergiaa(PhysicsObject energ, Pelaaja kohde)
366    {
367        kohde.AddEnergy(300);
368        energ.Destroy();
369    }
370}
Note: See TracBrowser for help on using the repository browser.