source: 2014/koodauskerho/38/PietuR/Weaporage/Weaporage/Weaporage/Weaporage.cs @ 5755

Revision 5755, 18.5 KB checked in by hesahave, 9 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
9class Pommi : PhysicsObject
10{
11    public Pommi(double leveys, double korkeus)
12        : base(leveys, korkeus)
13    {
14    }
15}
16
17
18
19public class Weaporage : PhysicsGame
20{
21
22    Pelaaja pelaaja1;
23    Pelaaja pelaaja2;
24    Pelaaja pelaaja3;
25    Pelaaja pelaaja4;
26
27    Image Miekankuva = LoadImage("Miekka");
28    Image Nuijankuva = LoadImage("Nuija");
29    Image Tikarinkuva = LoadImage("Tikari");
30    Image Vasarankuva = LoadImage("Vasara");
31    Image Sauvankuva = LoadImage("Sauva");
32    Image Pistoolinkuva = LoadImage("Pistooli");
33    Image Luodinkuva = LoadImage("Luoti");
34    Image Pomminkuva = LoadImage("Pommi1");
35    private Image[] Pomminposaus = LoadImages("Pommi2", "Pommi3", "Pommi4", "Pommi5", "Pommi6");
36    Image Rajahdyskuva = LoadImage("Rajahdys");
37    Image Pallonkuva = LoadImage("Pallo");
38
39    public override void Begin()
40    {
41        Level.Width = 2400;
42        Level.Height = 1800;
43        LisaaAseetPeliin(new Vector(700, 700));
44        LisaaAseetPeliin(new Vector(700, -700));
45        LisaaAseetPeliin(new Vector(-700, -700));
46        LisaaAseetPeliin(new Vector(-700, 700));
47
48        Level.Background.CreateGradient(RandomGen.NextColor(), RandomGen.NextColor());
49        IsFullScreen = true;
50       
51        pelaaja1 = new Pelaaja(5);
52        pelaaja2 = new Pelaaja(5);
53        pelaaja3 = new Pelaaja(5);
54        pelaaja4 = new Pelaaja(5);
55
56        IsMouseVisible = true;
57
58        PhysicsObject pallo = new PhysicsObject(20, 20, Shape.Circle);
59        Add(pallo);
60
61
62
63       
64        Level.CreateBorders();
65        Camera.ZoomToLevel();
66        Gravity = new Vector(0, -100);
67
68        Luopelaaja(pelaaja1, 2, new Vector(200, 200), Color.Red);
69        Luopelaaja(pelaaja2, 12, new Vector(200, -200), Color.Pink);
70        Luopelaaja(pelaaja3, 20, new Vector(-200, -200), Color.SpringGreen);
71        Luopelaaja(pelaaja4, 30, new Vector(-200, 200), Color.Blue);
72
73        Keyboard.Listen(Key.Left, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(-100, 0));
74        Keyboard.Listen(Key.Right, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(100, 0));
75        Keyboard.Listen(Key.Down, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(0, -100));
76        Keyboard.Listen(Key.Up, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(0, 100));
77        Keyboard.Listen(Key.RightControl, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja1);
78        Keyboard.Listen(Key.RightAlt, ButtonState.Pressed, IrrotaAseet, null, pelaaja1);
79
80        Keyboard.Listen(Key.Space, ButtonState.Pressed, AloitaAlustaPeli, null);
81
82        Keyboard.Listen(Key.A, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(-100, 0));
83        Keyboard.Listen(Key.D, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(100, 0));
84        Keyboard.Listen(Key.S, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(0, -100));
85        Keyboard.Listen(Key.W, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(0, 100));
86        Keyboard.Listen(Key.Q, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja2);
87        Keyboard.Listen(Key.E, ButtonState.Pressed, IrrotaAseet, null, pelaaja2);
88
89        Keyboard.Listen(Key.J, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(-100, 0));
90        Keyboard.Listen(Key.L, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(100, 0));
91        Keyboard.Listen(Key.K, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(0, -100));
92        Keyboard.Listen(Key.I, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(0, 100));
93        Keyboard.Listen(Key.U, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja3);
94        Keyboard.Listen(Key.O, ButtonState.Pressed, IrrotaAseet, null, pelaaja3);
95
96        Keyboard.Listen(Key.NumPad4, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(-100, 0));
97        Keyboard.Listen(Key.NumPad6, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(100, 0));
98        Keyboard.Listen(Key.NumPad5, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(0, -100));
99        Keyboard.Listen(Key.NumPad8, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(0, 100));
100        Keyboard.Listen(Key.Divide, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja4);
101        Keyboard.Listen(Key.Multiply, ButtonState.Pressed, IrrotaAseet, null, pelaaja4);
102
103        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja1);
104        ControllerTwo.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja2);
105        ControllerThree.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja3);
106        ControllerFour.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja4);
107
108
109        ControllerOne.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja1);
110        ControllerOne.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja1);
111        ControllerTwo.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja2);
112        ControllerTwo.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja2);
113        ControllerThree.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja3);
114        ControllerThree.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja3);
115        ControllerFour.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja4);
116        ControllerFour.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja4);
117
118        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
119        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
120    }
121
122    void AloitaAlustaPeli()
123    {
124        ClearAll();
125        Begin();
126    }
127
128
129    void IrrotaAseet(Pelaaja pelaaja)
130    {
131        if (pelaaja.oikeaKasi != null)
132        {
133            pelaaja.oikeaKasi.Destroy();
134            pelaaja.oikeaKasi = null;
135        }
136        if (pelaaja.vasenKasi != null)
137        {
138            pelaaja.vasenKasi.Destroy();
139            pelaaja.vasenKasi = null;
140        }
141        pelaaja.OtetaankoKiinni = false;
142    }
143
144
145    void ValmiinaOttamaanAseen(Pelaaja pelaaja)
146    {
147        if (pelaaja.OtetaankoKiinni)
148            pelaaja.OtetaankoKiinni = false;
149        else pelaaja.OtetaankoKiinni = true;
150    }
151
152
153    void LisaaAseetPeliin(Vector asepaikka)
154    {
155        int asenumero = RandomGen.NextInt(1, 8);
156        if (asenumero == 1)
157        {
158            PhysicsObject ase = new PhysicsObject(50, 100);
159            ase.Position = asepaikka;
160            ase.Image = Vasarankuva;
161            ase.Shape = Shape.FromImage(Vasarankuva);
162            ase.Tag = "ase";
163            Add(ase);
164        }
165        else if (asenumero == 2)
166        {
167            PhysicsObject ase2 = new PhysicsObject(30, 70);
168            ase2.Position = asepaikka;
169            ase2.Image = Tikarinkuva;
170            ase2.Shape = Shape.FromImage(Tikarinkuva);
171            ase2.Tag = "ase";
172            Add(ase2);
173        }
174        else if (asenumero == 3)
175        {
176            PhysicsObject ase3 = new PhysicsObject(50, 150);
177            ase3.Position = asepaikka;
178            ase3.Image = Miekankuva;
179            ase3.CollisionIgnoreGroup = 20000;
180            ase3.Shape = Shape.FromImage(Miekankuva);
181            ase3.Tag = "ase";
182            AddCollisionHandler(ase3, "irtoava", CollisionHandler.DestroyTarget);
183            Add(ase3);
184        }
185        else if (asenumero == 4)
186        {
187            PhysicsObject ase4 = new PhysicsObject(50, 120);
188            ase4.Position = asepaikka;
189            ase4.Image = Nuijankuva;
190            ase4.Shape = Shape.FromImage(Nuijankuva);
191            ase4.Tag = "ase";
192            Add(ase4);
193        }
194        else if (asenumero == 5)
195        {
196            PhysicsObject ase5 = new PhysicsObject(6, 220);
197            ase5.Position = asepaikka;
198            ase5.Image = Sauvankuva;
199            ase5.Shape = Shape.FromImage(Sauvankuva);
200            ase5.Tag = "ase";
201            Add(ase5);
202        }
203        else if (asenumero == 6)
204        {
205            PhysicsObject ase6 = new PhysicsObject(60, 30);
206            ase6.Position = asepaikka;
207            ase6.Image = Pistoolinkuva;
208            ase6.Shape = Shape.FromImage(Pistoolinkuva);
209            ase6.Tag = "ase";
210            Timer laukausaika = new Timer();
211            laukausaika.Interval = 3;
212            laukausaika.Timeout += delegate
213            {
214
215                PhysicsObject Luoti = new PhysicsObject(15, 7);
216                Luoti.Position = ase6.Position;
217                Luoti.Image = Luodinkuva;
218                Luoti.Hit(ase6.Angle.GetVector() * 5000);
219                Luoti.LifetimeLeft = TimeSpan.FromSeconds(5);
220                Luoti.Tag = "ase";
221                Add(Luoti);
222            };
223            laukausaika.Start();
224            Add(ase6);
225        }
226        else if (asenumero == 7)
227        {
228            Pommi ase7 = new Pommi(50, 50);
229            ase7.Position = asepaikka;
230            ase7.Image = Pomminkuva;
231            ase7.Shape = Shape.FromImage(Pomminkuva);
232            ase7.Tag = "ase";
233            Add(ase7);
234        }
235    }
236
237    void LiikutaTatilla(AnalogState tatti, Pelaaja pelaaja)
238    {
239        LiikutaPelaajaa(pelaaja, tatti.StateVector * 100);
240    }
241
242    void LiikutaPelaajaa(Pelaaja pelaaja, Vector suunta)
243    {
244        if (pelaaja.RuumiinOsat.Count == 0) return;
245        pelaaja.RuumiinOsat[0].Hit(suunta);
246
247    }
248
249
250    void Luopelaaja(Pelaaja pelaaja,int collisionIgnoreGroup, Vector pos, Color vari)
251    {
252        const double perusKoko = 30;
253        //int collisionIgnoreGroup = 2;
254
255
256
257        PhysicsObject paa = LuoRuumiinOsa(perusKoko, perusKoko, Shape.Circle,collisionIgnoreGroup, pos, vari);
258        PhysicsObject keskiVartalo = LuoRuumiinOsa(perusKoko, perusKoko * 3, Shape.Ellipse, collisionIgnoreGroup, paa.Position + new Vector(0, -2 * perusKoko), vari);
259        PhysicsObject vasenKasi = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(-35, 40), vari);
260        PhysicsObject vasenKasi2 = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(-85, 40), vari);
261        PhysicsObject oikeaKasi = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(35, 40), vari);
262        PhysicsObject oikeaKasi2 = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(85, 40), vari);
263        PhysicsObject vasenJalka = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(-10, -70), vari);
264        PhysicsObject oikeaJalka = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(10, -70), vari);
265        PhysicsObject vasenJalka2 = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(-10, -120), vari);
266        //vasenJalka2.Tag = "irtoava";
267        PhysicsObject oikeaJalka2 = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(10, -120), vari);
268        PhysicsObject vasenKammen = LuoRuumiinOsa(perusKoko / 2, perusKoko / 2, Shape.Circle, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(-115, 40), vari);
269        vasenKammen.Tag = "vasenKammen";
270        PhysicsObject oikeaKammen = LuoRuumiinOsa(perusKoko / 2, perusKoko / 2, Shape.Circle, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(115, 40), vari);
271        oikeaKammen.Tag = "oikeaKammen";
272
273
274        ProgressBar elamaPalkki = new ProgressBar(75, 10);
275        elamaPalkki.X = 0;
276        elamaPalkki.Y = 40;
277        elamaPalkki.BindTo(pelaaja.Elamat);
278        Add(elamaPalkki);
279
280        Timer ajastin = new Timer();
281        ajastin.Interval = 0.01;
282        ajastin.Timeout += delegate
283        {
284            elamaPalkki.Position = Camera.WorldToScreen(keskiVartalo.Position + new Vector(0, 150));
285        };
286        ajastin.Start();
287
288
289        AddCollisionHandler(keskiVartalo, "ase", delegate(PhysicsObject kasi, PhysicsObject ase) {
290            AseOsuuRuumiinOsaan(kasi, ase, pelaaja);
291        });
292
293        AddCollisionHandler(paa, "ase", delegate(PhysicsObject kasi, PhysicsObject ase)
294        {
295            AseOsuuRuumiinOsaan(kasi, ase, pelaaja);
296        });
297
298        pelaaja.Elamat.LowerLimit += delegate {
299            Explosion rajahdys = new Explosion(200);
300            rajahdys.Position = paa.Position;
301            Add(rajahdys);
302            paa.Destroy();
303        };
304
305        AddCollisionHandler(vasenKammen, "ase", delegate(PhysicsObject kasi, PhysicsObject ase) { KeraaAseVasempaanKateen(kasi, ase, pelaaja); });
306        AddCollisionHandler(oikeaKammen, "ase", delegate(PhysicsObject kasi, PhysicsObject ase) { KeraaAseOikeaanKateen(kasi, ase, pelaaja); });
307        pelaaja.RuumiinOsat.Add(paa);
308
309        pelaaja.RuumiinOsat.Add(vasenKammen);
310        pelaaja.RuumiinOsat.Add(oikeaKammen);
311
312        foreach (var item in pelaaja.RuumiinOsat)
313        {
314            Add(item);
315        }
316
317        Add(paa);
318        Add(keskiVartalo);
319        Add(vasenKasi);
320        Add(vasenKasi2);
321        Add(oikeaKasi);
322        Add(oikeaKasi2);
323        Add(vasenJalka);
324        Add(oikeaJalka);
325        Add(vasenJalka2);
326        Add(oikeaJalka2);
327        Add(vasenKammen);
328        Add(oikeaKammen);
329        LiitaYhteen(paa, keskiVartalo, new Vector(0, -5));
330        LiitaYhteen(keskiVartalo, vasenKasi, new Vector(-10, 30));
331        LiitaYhteen(vasenKasi, vasenKasi2, new Vector(-25, 0));
332        LiitaYhteen(keskiVartalo, oikeaKasi, new Vector(10, 30));
333        LiitaYhteen(oikeaKasi, oikeaKasi2, new Vector(25, 0));
334        LiitaYhteen(vasenJalka, keskiVartalo, new Vector(0, 30));
335        LiitaYhteen(oikeaJalka, keskiVartalo, new Vector(0, 30));
336        LiitaYhteen(vasenJalka2, vasenJalka, new Vector(0, 25));
337        LiitaYhteen(oikeaJalka2, oikeaJalka, new Vector(0, 25));
338        LiitaYhteen(vasenKasi2, vasenKammen, new Vector(-25, 0));
339        LiitaYhteen(oikeaKasi2, oikeaKammen, new Vector(25, 0));
340    }
341
342    void AseOsuuRuumiinOsaan(PhysicsObject ruumiinOsa, PhysicsObject ase, Pelaaja pelaaja)
343    {
344
345        if (pelaaja.oikeaKasi != null && ase.Equals(pelaaja.oikeaKasi.Object2)) return;
346        if (pelaaja.vasenKasi != null && ase.Equals(pelaaja.vasenKasi.Object2)) return;
347        pelaaja.Elamat.Value--;
348    }
349
350    void Sytytapommi(PhysicsObject pommi)
351    {
352        pommi.Animation = new Animation(Pomminposaus);
353        pommi.Animation.FPS = 1;
354        pommi.Animation.Played += delegate
355        {
356            Explosion rajahdys = new Explosion(1000);
357            rajahdys.Position = pommi.Position;
358            rajahdys.Image = Rajahdyskuva;
359            rajahdys.Speed = 500;
360            Add(rajahdys);
361            posahdus(rajahdys);
362            pommi.Destroy();
363        };
364        pommi.Animation.Start();
365
366    }
367    void posahdus(Explosion rajahdys)
368    {
369        PhysicsObject posaus = new PhysicsObject(500, 500);
370        posaus.Position = rajahdys.Position;
371        posaus.Shape = Shape.Circle;
372        posaus.LifetimeLeft = TimeSpan.FromSeconds(3);
373        posaus.Tag = "ase";
374        Add(posaus);
375
376    }
377    void KeraaAseVasempaanKateen(PhysicsObject kasi, PhysicsObject ase, Pelaaja pelaaja)
378    {
379        if (pelaaja.vasenKasi == null && pelaaja.OtetaankoKiinni)
380        {
381            pelaaja.vasenKasi = LiitaYhteen(kasi, ase, Vector.Zero);
382
383            if (ase is Pommi)
384            {
385                Sytytapommi(ase);
386            }
387        }
388        //ase.CollisionIgnoreGroup = kasi.CollisionIgnoreGroup;
389        AseKeratty(pelaaja);
390    }
391
392    void KeraaAseOikeaanKateen(PhysicsObject kasi, PhysicsObject ase, Pelaaja pelaaja)
393    {
394        if (pelaaja.oikeaKasi == null && pelaaja.OtetaankoKiinni)
395        {
396            pelaaja.oikeaKasi = LiitaYhteen(kasi, ase, Vector.Zero);
397
398            if (ase is Pommi)
399            {
400                Sytytapommi(ase);
401            }
402        }
403        //ase.CollisionIgnoreGroup = kasi.CollisionIgnoreGroup;
404        AseKeratty(pelaaja);
405
406    }
407
408    void AseKeratty(Pelaaja pelaaja)
409    {
410        pelaaja.OtetaankoKiinni = false;
411    }
412
413
414
415    AxleJoint LiitaYhteen(PhysicsObject ens, PhysicsObject toin, Vector sidosKohta)
416    {
417        AxleJoint liitos = new AxleJoint(ens, toin, ens.Position + sidosKohta);
418        liitos.Softness = 0.000000005;
419        Add(liitos);
420        return liitos;
421    }
422
423    PhysicsObject LuoRuumiinOsa(double leveys, double korkeus, Shape muoto, int collisionIgnoreGroup, Vector pos, Color vari)
424    {
425        PhysicsObject ruumiinOsa = new PhysicsObject(leveys, korkeus, muoto);
426        ruumiinOsa.Position = pos;
427        ruumiinOsa.Color = vari;
428        ruumiinOsa.CollisionIgnoreGroup = collisionIgnoreGroup;
429       
430        return ruumiinOsa;
431    }
432
433}
434
435public class Pelaaja
436{
437    List<PhysicsObject> ruumiinOsat = new List<PhysicsObject>();
438    public List<PhysicsObject> RuumiinOsat { get { return ruumiinOsat; } }
439    IntMeter elamat;
440    public IntMeter Elamat { get { return elamat; } }
441    bool otetaanko = false;
442    public AxleJoint vasenKasi;
443    public AxleJoint oikeaKasi;
444
445    public bool OtetaankoKiinni
446    {
447        get
448        {
449            return otetaanko;
450        }
451        set
452        {
453            otetaanko = value;
454            foreach (var item in ruumiinOsat)
455            {
456                if ("oikeaKammen".Equals(item.Tag))
457                {
458                    if (oikeaKasi != null) return;
459                    if (otetaanko) item.Color = Color.Red;
460                    else item.Color = Color.Black;
461                }
462                if ("vasenKammen".Equals(item.Tag))
463                {
464                    if (vasenKasi != null) return;
465                    if (otetaanko) item.Color = Color.Red;
466                    else item.Color = Color.Black;
467                }
468            }
469        }
470    }
471
472    public Pelaaja(int defaultHp)
473    {
474        elamat = new IntMeter(defaultHp, 0, defaultHp);
475    }       
476}
Note: See TracBrowser for help on using the repository browser.