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

Revision 5297, 7.9 KB checked in by pealrist, 5 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 void setShield(int t)
33        {
34            if (t > 0) shield.Value = t;
35            else
36            {
37                shield.Value = 0;
38                Destroy();
39            }
40        }
41    }
42
43    public class Pelaaja : Shieldable
44    {
45        private IntMeter energy = new IntMeter(100);
46
47        public Pelaaja(int w, int h) : base(w, h)
48        {
49            shield.Value = 100;
50            Tag = "pelaaja";
51            MomentOfInertia = Double.PositiveInfinity;
52            Restitution = 0;
53            KineticFriction = 1;
54        }
55
56        public IntMeter getEnergyMeter()
57        {
58            return energy;
59        }
60
61        public Ammus Ammu()
62        {
63#if DEBUG
64            if (energy.Value > 0)
65            {
66#endif
67                Ammus a = new Ammus(1, "ToV", Angle.GetVector());
68                a.Position = Position;
69                energy.Value--;
70                return a;
71#if DEBUG
72            }
73            else return null;
74#endif
75        }
76    }
77
78    public class Vihollinen : Shieldable
79    {
80        private int deal;
81
82        public Vihollinen(int d, int w, int h) : base(w, h)
83        {
84            deal = d;
85            Tag = "vihollinen";
86        }
87
88        public Ammus Ammu(PhysicsObject kohde)
89        {
90            Vector s = (kohde.Position - Position).Normalize();
91            Ammus a = new Ammus(deal, "ToP", s);
92            a.Position = Position;
93            return a;
94        }
95    }
96
97    public class Ammus : PhysicsObject
98    {
99        private int deal;
100
101        public Ammus(int d, string t, Vector suunta) : base(3, 3)
102        {
103            deal = d;
104            Tag = "ammus" + t;
105            Shape = Shape.Circle;
106            Restitution = 0;
107            KineticFriction = 1;
108            MomentOfInertia = Double.PositiveInfinity;
109            Timer.SingleShot(2.0, Destroy);
110            Hit(suunta * 100);
111        }
112
113        public int getDeal()
114        {
115            return deal;
116        }
117    }
118
119    protected Pelaaja pelaaja;
120
121    private bool playeradded = false;
122
123    private bool altpressed;
124    private bool ctrlpressed;
125
126    public override void Begin()
127    {
128        LuoKuuntelijat();
129        NaytaValikko();
130
131        Camera.ZoomToLevel();
132    }
133
134    private void LuoKuuntelijat()
135    {
136        Keyboard.Listen(Key.A, ButtonState.Down, delegate { pelaaja.Velocity = pelaaja.Angle.GetVector() * 50; }, null);
137        Keyboard.Listen(Key.A, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
138        Keyboard.Listen(Key.Z, ButtonState.Down, delegate { pelaaja.Velocity = pelaaja.Angle.GetVector() * -50; }, null);
139        Keyboard.Listen(Key.Z, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
140        Keyboard.Listen(Key.Left, ButtonState.Down, delegate { if (altpressed) pelaaja.Velocity = (pelaaja.Angle + Angle.RightAngle).GetVector() * 50; else pelaaja.Angle = pelaaja.Angle + (Angle.RightAngle / 50); }, null);
141        Keyboard.Listen(Key.Left, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
142        Keyboard.Listen(Key.Right, ButtonState.Down, delegate { if (altpressed) pelaaja.Velocity = (pelaaja.Angle - Angle.RightAngle).GetVector() * 50; else pelaaja.Angle = pelaaja.Angle - (Angle.RightAngle / 50); }, null);
143        Keyboard.Listen(Key.Right, ButtonState.Released, delegate { pelaaja.Velocity = Vector.Zero; }, null);
144        Keyboard.Listen(Key.LeftAlt, ButtonState.Pressed, delegate { altpressed = true; }, null);
145        Keyboard.Listen(Key.LeftAlt, ButtonState.Released, delegate { altpressed = false; }, null);
146
147        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);
148        Keyboard.Listen(Key.LeftControl, ButtonState.Released, delegate { ctrlpressed = false; }, null);
149
150        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Exit the game");
151    }
152
153    private void NaytaValikko()
154    {
155        MultiSelectWindow alkuValikko = new MultiSelectWindow("", "Start game", "Exit");
156        alkuValikko.AddItemHandler(0, AloitaPeli);
157        alkuValikko.AddItemHandler(1, ConfirmExit);
158        alkuValikko.DefaultCancel = 1;
159        Add(alkuValikko);
160    }
161
162    private void AloitaPeli()
163    {
164        InputWindow kysymysIkkuna = new InputWindow("Enter the level number");
165        kysymysIkkuna.TextEntered += ProcessInput;
166        Add(kysymysIkkuna);
167    }
168
169    private void ProcessInput(InputWindow ikkuna)
170    {
171        try
172        {
173            TileMap ruudut = TileMap.FromLevelAsset(ikkuna.InputBox.Text);
174            ruudut.SetTileMethod('P', LuoPelaaja);
175            ruudut.SetTileMethod('V', LuoVihollinen);
176            ruudut.SetTileMethod('|', LuoPystySeina);
177            ruudut.SetTileMethod('-', LuoVaakaSeina);
178            ruudut.Execute(40, 40);
179        }
180        catch (Exception)
181        {
182            MessageDisplay.Add("Level number out of range");
183        }
184    }
185
186    private void LuoVihollinen(Vector paikka, double leveys, double korkeus)
187    {
188        Vihollinen vih = new Vihollinen(1, 10, 10);
189        vih.Position = paikka;
190        vih.Tag = "vihollinen";
191        vih.setShield(10);
192        Timer ajastin = new Timer();
193        ajastin.Interval = 1.5;
194        ajastin.Timeout += delegate { if(!(pelaaja.IsDestroyed || vih.IsDestroyed)) Add(vih.Ammu(pelaaja)); };
195        ajastin.Start();
196        AddCollisionHandler<Vihollinen, Ammus>(vih, "ammusToV", Osuma);
197        Add(vih);
198    }
199
200    private void LuoPystySeina(Vector paikka, double leveys, double korkeus)
201    {
202        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
203        seina.Position = paikka;
204        Add(seina);
205    }
206
207    private void LuoVaakaSeina(Vector paikka, double leveys, double korkeus)
208    {
209        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
210        seina.Position = paikka;
211        Add(seina);
212    }
213
214    private void LuoPelaaja(Vector paikka, double leveys, double korkeus)
215    {
216        if (playeradded) throw new Exception("Too many players");
217        pelaaja = new Pelaaja(10, 10);
218        pelaaja.Position = paikka;
219        pelaaja.setShield(100);
220
221        Label shieldNaytto = new Label();
222        shieldNaytto.X = Screen.Left + 100;
223        shieldNaytto.Y = Screen.Top - 100;
224        shieldNaytto.TextColor = Color.Black;
225        shieldNaytto.Color = Color.White;
226        shieldNaytto.BindTo(pelaaja.shield);
227        Add(shieldNaytto);
228
229        Label eNaytto = new Label();
230        eNaytto.X = Screen.Left + 200;
231        eNaytto.Y = Screen.Top - 100;
232        eNaytto.TextColor = Color.Black;
233        eNaytto.Color = Color.White;
234        eNaytto.BindTo(pelaaja.getEnergyMeter());
235        Add(eNaytto);
236        AddCollisionHandler<Pelaaja, Ammus>(pelaaja, "ammusToP", Osuma);
237        Add(pelaaja);
238        playeradded = true;
239
240    }
241
242    private void Osuma(Pelaaja pelaaja, Ammus kohde)
243    {
244        pelaaja.setShield(pelaaja.getShield() - kohde.getDeal());
245        kohde.Destroy();
246    }
247    private void Osuma(Vihollinen vih, Ammus kohde)
248    {
249        vih.setShield(vih.getShield() - kohde.getDeal());
250        kohde.Destroy();
251    }
252}
Note: See TracBrowser for help on using the repository browser.