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

Revision 7134, 33.1 KB checked in by otjojunt, 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
9class Pistooli : MeleeAse
10{
11    public Timer ampumisAjastin;
12
13    public Pistooli(Weaporage peli, double leveys, double korkeus)
14        : base(peli, leveys, korkeus)
15    {     
16    }
17
18    public void LopetaAmpuminen()
19    {
20        if (ampumisAjastin != null)
21            ampumisAjastin.Stop();
22    }
23}
24
25class Valomiekka : MeleeAse
26{
27    public Valomiekka(Weaporage peli, double leveys, double korkeus)
28            : base(peli, leveys, korkeus)
29    {
30    }
31}
32class Valomiekka2 : MeleeAse
33{
34    public Valomiekka2(Weaporage peli, double leveys, double korkeus)
35            : base(peli, leveys, korkeus)
36    {
37    }
38}
39class Valomiekka3 : MeleeAse
40{
41    public Valomiekka3(Weaporage peli, double leveys, double korkeus)
42            : base(peli, leveys, korkeus)
43    {
44    }
45}
46class MeleeAse : PhysicsObject
47{
48    Weaporage peli;
49
50    AxleJoint currentHolder;
51
52    public MeleeAse(Weaporage peli, double leveys, double korkeus)
53        : base(leveys, korkeus)
54    {
55        this.peli = peli;
56    }
57
58    public void VaihdaOmistajaa(AxleJoint joint)
59    {
60        if (currentHolder != null)
61            currentHolder.Destroy();
62        currentHolder = joint;
63    }
64}
65class Pommi : PhysicsObject
66{
67    Weaporage peli;
68
69   
70
71    public Pommi(Weaporage peli, double leveys, double korkeus)
72        : base(leveys, korkeus)
73    {
74        this.peli = peli;
75    }
76
77    public void Sytyta(SoundEffect Bombuchan)
78    {
79        Animation = new Animation(peli.Pomminposaus);
80        Animation.FPS = 1.46;
81        Bombuchan.Play();
82        Animation.Played += delegate
83        {
84            Explosion rajahdys = new Explosion(1000);
85            rajahdys.Position = Position;
86            rajahdys.Image = peli.Rajahdyskuva;
87            rajahdys.ShockwaveReachesObject += PaineaaltoOsuu;
88            rajahdys.Speed = 1500;
89            peli.Add(rajahdys);
90            Destroy();
91        };
92        Animation.Start();
93    }
94
95    void PaineaaltoOsuu(IPhysicsObject olio, Vector shokki)
96    {
97        Pelaaja pelaaja = peli.EtsiOmistaja(olio as PhysicsObject);
98
99        if (pelaaja != null)
100        {
101            pelaaja.Elamat.Value -= 49;
102        }
103    }
104}
105
106
107public class Pelaaja
108{
109    List<PhysicsObject> ruumiinOsat = new List<PhysicsObject>();
110    public List<PhysicsObject> RuumiinOsat { get { return ruumiinOsat; } }
111
112    public List<AxleJoint> liitokset = new List<AxleJoint>();
113    public PhysicsObject tamanhetkinenAse;
114
115    DoubleMeter elamat;
116
117    public DoubleMeter Elamat { get { return elamat; } }
118
119    bool otetaanko = false;
120    public AxleJoint vasenKasi;
121    public AxleJoint oikeaKasi;
122
123    public bool OtetaankoKiinni
124    {
125        get
126        {
127            return otetaanko;
128        }
129        set
130        {
131            otetaanko = value;
132            foreach (var item in ruumiinOsat)
133            {
134                if ("oikeaKammen".Equals(item.Tag))
135                {
136                    if (oikeaKasi != null) return;
137                    if (otetaanko) item.Color = Color.Red;
138                    else item.Color = Color.Black;
139                }
140                if ("vasenKammen".Equals(item.Tag))
141                {
142                    if (vasenKasi != null) return;
143                    if (otetaanko) item.Color = Color.Red;
144                    else item.Color = Color.Black;
145                }
146            }
147        }
148    }
149
150    public Pelaaja(double defaultHp)
151    {
152        elamat = new DoubleMeter(defaultHp, 0.0, defaultHp);
153    }
154
155    public void RikoLiitokset()
156    {
157        if (liitokset != null && liitokset.Count != 0)
158        {
159            for (int i = 0; i < liitokset.Count; i++)
160            {
161                liitokset[i].Destroy();
162            }
163        }
164    }
165}
166
167
168
169public class Weaporage : PhysicsGame
170{
171
172    Pelaaja pelaaja1;
173    Pelaaja pelaaja2;
174    Pelaaja pelaaja3;
175    Pelaaja pelaaja4;
176
177    public Image Pomminkuva = LoadImage("Pommi1");
178    public Image Rajahdyskuva = LoadImage("Rajahdys");
179    public Image[] Pomminposaus = LoadImages("Pommi2", "Pommi3", "Pommi4", "Pommi5", "Pommi6");
180
181    SoundEffect Saber = LoadSoundEffect("Valo");
182    SoundEffect Saber2 = LoadSoundEffect("Valo2");
183    SoundEffect SaberOff = LoadSoundEffect("Valopois");
184    SoundEffect Ampuu = LoadSoundEffect("Ampuu");
185    SoundEffect Bombuchan = LoadSoundEffect("Pommi");
186
187    Image Miekankuva = LoadImage("Miekka");
188    Image Nuijankuva = LoadImage("Nuija");
189    Image Tikarinkuva = LoadImage("Tikari");
190    Image Kirveenkuva = LoadImage("Kirves");
191    Image Sauvankuva = LoadImage("Sauva");
192    Image Pistoolinkuva = LoadImage("Sniper");
193    Image Luodinkuva = LoadImage("Luoti");
194    Image DoubleSaber = LoadImage("DoubleSaber");
195    Image[] DoubleSaberOn = LoadImages("DoubleSaber1", "DoubleSaber2", "DoubleSaber3", "DoubleSaber4", "DoubleSaber5", "DoubleSaber6", "DoubleSaber7");
196    Image[] DoubleSaberOff = LoadImages("DoubleSaber7", "DoubleSaber6", "DoubleSaber5", "DoubleSaber4", "DoubleSaber3", "DoubleSaber2", "DoubleSaber1");
197    Image Valomiekankuva = LoadImage("Valomiekka");
198    Image ToisenValomiekankuva = LoadImage("ToinenValomiekka");
199    Image[] Valomiekkaaukeaa = LoadImages("Valomiekka1", "Valomiekka2", "Valomiekka3", "Valomiekka4", "Valomiekka5");
200    Image[] ToinenValomiekkaaukeaa = LoadImages("ToinenValomiekka1", "ToinenValomiekka2", "ToinenValomiekka3", "ToinenValomiekka4", "ToinenValomiekka5");
201    Image[] Valomiekkasulkeutuu = LoadImages("Valomiekka5", "Valomiekka4", "Valomiekka3", "Valomiekka2", "Valomiekka1", "ToinenValomiekka");
202    Image[] Valomiekka2sulkeutuu = LoadImages("ToinenValomiekka5", "ToinenValomiekka4", "ToinenValomiekka3", "ToinenValomiekka2", "ToinenValomiekka1", "ToinenValomiekka");
203
204
205
206    Image Pallonkuva = LoadImage("Pallo");
207
208    public override void Begin()
209    {
210        Level.Width = 2400;
211        Level.Height = 1800;
212        LisaaAseetPeliin(new Vector(700, 700));
213        LisaaAseetPeliin(new Vector(700, -700));
214        LisaaAseetPeliin(new Vector(-700, -700));
215        LisaaAseetPeliin(new Vector(-700, 700));
216
217        {
218            Timer pallotulee = new Timer();
219            pallotulee.Interval = 5;
220            pallotulee.Timeout += delegate
221            {
222                PhysicsObject pallo = new PhysicsObject(100, 100);
223                pallo.Position = new Vector(0, 0);
224                RandomMoverBrain satunnaisAivot = new RandomMoverBrain(2000);
225                pallo.Image = Pallonkuva;
226                pallo.Brain = satunnaisAivot;
227                satunnaisAivot.ChangeMovementSeconds = 100;
228                pallo.Shape = Shape.Circle;
229                pallo.AngularAcceleration = 100;
230                pallo.RotateImage = true;
231                pallo.Tag = "ase";
232                AddCollisionHandler(pallo, "ase", CollisionHandler.ExplodeObject(500, true));
233                //Add(pallo);
234
235                Pommi ase7 = new Pommi(this, 75, 75);
236                ase7.Position = new Vector(0, 0);
237                ase7.Image = Pomminkuva;
238                ase7.Shape = Shape.FromImage(Pomminkuva);
239                ase7.Tag = "ase";
240                //Add(ase7);
241
242                LisaaAseetPeliin(new Vector(0, 0));
243
244            };
245            pallotulee.Start();
246        }
247
248
249        Level.Background.CreateGradient(RandomGen.NextColor(), RandomGen.NextColor());
250
251        IsFullScreen = true;
252
253        pelaaja1 = new Pelaaja(100);
254        pelaaja2 = new Pelaaja(100);
255        pelaaja3 = new Pelaaja(100);
256        pelaaja4 = new Pelaaja(100);
257
258        IsMouseVisible = true;
259
260        Level.CreateBorders();
261        Camera.ZoomToLevel();
262        Gravity = new Vector(0, -100);
263
264        Luopelaaja(pelaaja1, 2, new Vector(200, 200), RandomGen.NextColor());
265        Luopelaaja(pelaaja2, 12, new Vector(200, -200), RandomGen.NextColor());
266        Luopelaaja(pelaaja3, 20, new Vector(-200, -200), RandomGen.NextColor());
267        Luopelaaja(pelaaja4, 30, new Vector(-200, 200), RandomGen.NextColor());
268
269        Keyboard.Listen(Key.Left, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(-300, 0));
270        Keyboard.Listen(Key.Right, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(300, 0));
271        Keyboard.Listen(Key.Down, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(0, -300));
272        Keyboard.Listen(Key.Up, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja1, new Vector(0, 300));
273        Keyboard.Listen(Key.RightControl, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja1);
274        Keyboard.Listen(Key.RightAlt, ButtonState.Pressed, IrrotaAseet, null, pelaaja1);
275
276        Keyboard.Listen(Key.Space, ButtonState.Pressed, AloitaAlustaPeli, null);
277
278        Keyboard.Listen(Key.A, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(-300, 0));
279        Keyboard.Listen(Key.D, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(300, 0));
280        Keyboard.Listen(Key.S, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(0, -300));
281        Keyboard.Listen(Key.W, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja2, new Vector(0, 300));
282        Keyboard.Listen(Key.Q, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja2);
283        Keyboard.Listen(Key.E, ButtonState.Pressed, IrrotaAseet, null, pelaaja2);
284
285        Keyboard.Listen(Key.J, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(-300, 0));
286        Keyboard.Listen(Key.L, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(300, 0));
287        Keyboard.Listen(Key.K, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(0, -300));
288        Keyboard.Listen(Key.I, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja3, new Vector(0, 300));
289        Keyboard.Listen(Key.U, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja3);
290        Keyboard.Listen(Key.O, ButtonState.Pressed, IrrotaAseet, null, pelaaja3);
291
292        Keyboard.Listen(Key.NumPad4, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(-300, 0));
293        Keyboard.Listen(Key.NumPad6, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(300, 0));
294        Keyboard.Listen(Key.NumPad5, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(0, -300));
295        Keyboard.Listen(Key.NumPad8, ButtonState.Down, LiikutaPelaajaa, "liikuta", pelaaja4, new Vector(0, 300));
296        Keyboard.Listen(Key.Divide, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja4);
297        Keyboard.Listen(Key.Multiply, ButtonState.Pressed, IrrotaAseet, null, pelaaja4);
298
299        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja1);
300        ControllerTwo.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja2);
301        ControllerThree.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja3);
302        ControllerFour.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja4);
303
304
305        ControllerOne.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja1);
306        ControllerOne.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja1);
307        ControllerTwo.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja2);
308        ControllerTwo.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja2);
309        ControllerThree.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja3);
310        ControllerThree.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja3);
311        ControllerFour.Listen(Button.A, ButtonState.Pressed, ValmiinaOttamaanAseen, null, pelaaja4);
312        ControllerFour.Listen(Button.A, ButtonState.Released, IrrotaAseet, null, pelaaja4);
313
314        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
315        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
316    }
317
318    void AloitaAlustaPeli()
319    {
320        ClearAll();
321        Begin();
322    }
323
324
325    void IrrotaAseet(Pelaaja pelaaja)
326    {
327        if (pelaaja.oikeaKasi != null)
328        {
329            pelaaja.oikeaKasi.Destroy();
330            pelaaja.oikeaKasi = null;
331        }
332        if (pelaaja.vasenKasi != null)
333        {
334            pelaaja.vasenKasi.Destroy();
335            pelaaja.vasenKasi = null;
336        }
337        pelaaja.OtetaankoKiinni = false;
338        Pistooli p = pelaaja.tamanhetkinenAse as Pistooli;
339        if (p != null)
340            p.LopetaAmpuminen();
341
342        Valomiekka miekka = pelaaja.tamanhetkinenAse as Valomiekka;
343        if (miekka != null)
344            SammutaValomiekka(miekka);
345
346        Valomiekka2 miekka2 = pelaaja.tamanhetkinenAse as Valomiekka2;
347        if (miekka2 != null)
348            SammutaValomiekka2(miekka2);
349
350        Valomiekka3 miekka3 = pelaaja.tamanhetkinenAse as Valomiekka3;
351        if (miekka3 != null)
352            SammutaValomiekka3(miekka3);
353
354        pelaaja.tamanhetkinenAse = null;
355        //p = null;
356    }
357    void ValmiinaOttamaanAseen(Pelaaja pelaaja)
358    {
359        if (pelaaja.OtetaankoKiinni)
360            pelaaja.OtetaankoKiinni = false;
361        else pelaaja.OtetaankoKiinni = true;
362    }
363
364    void SammutaValomiekka(Valomiekka miekka)
365    {
366        Animation anim = new Animation(Valomiekkasulkeutuu);
367        anim.FPS = 10;
368        SaberOff.Play();
369        //anim.StopOnLastFrame = true;
370        miekka.Animation = anim;
371        miekka.Animation.Start();
372
373        anim.Played += delegate
374        {
375            miekka.Animation = null;
376            miekka.Image = Valomiekkasulkeutuu[Valomiekkasulkeutuu.Length - 1];
377            miekka.Shape = Shape.FromImage(Valomiekkasulkeutuu[Valomiekkasulkeutuu.Length - 1]);
378        };
379    }
380
381        void SammutaValomiekka2(Valomiekka2 miekka2)
382    {
383            Animation anim2 = new Animation(Valomiekka2sulkeutuu);
384            anim2.FPS = 10;
385            SaberOff.Play();
386            //anim.StopOnLastFrame = true;
387            miekka2.Animation = anim2;
388            miekka2.Animation.Start();
389
390            anim2.Played += delegate
391            {
392                miekka2.Animation = null;
393                miekka2.Image = Valomiekka2sulkeutuu[Valomiekka2sulkeutuu.Length - 1];
394                miekka2.Shape = Shape.FromImage(Valomiekka2sulkeutuu[Valomiekka2sulkeutuu.Length - 1]);
395            };
396        }
397    void SammutaValomiekka3(Valomiekka3 miekka3)
398    {
399        Timer.SingleShot(0.4,
400           delegate { SaberOff.Play(); });
401
402            Animation anim = new Animation(DoubleSaberOff);
403        anim.FPS = 10;
404        SaberOff.Play();
405        //anim.StopOnLastFrame = true;
406        miekka3.Animation = anim;
407        miekka3.Animation.Start();
408
409        anim.Played += delegate
410        {
411            Image kuva = DoubleSaber; //DoubleSaberOff[DoubleSaberOff.Length - 1];
412            miekka3.Animation = null;
413            miekka3.Image = kuva;
414            miekka3.Size = new Vector(kuva.Width, kuva.Height) * 2;
415            //miekka3.Shape = Shape.FromImage(DoubleSaberOff[DoubleSaberOff.Length - 1]);
416        };
417    }
418    void LisaaAseetPeliin(Vector asepaikka)
419    {
420        int asenumero = RandomGen.NextInt(1, 11);
421        if (asenumero == 8)
422        {
423            MeleeAse ase = new MeleeAse(this, 76*2, 182*2);
424            ase.Position = asepaikka;
425            ase.Mass = 3;
426            ase.Image = Kirveenkuva;
427            ase.Shape = Shape.FromImage(Kirveenkuva);
428            ase.Tag = "ase";
429            Add(ase);
430        }
431        else if (asenumero == 9)
432        {
433            MeleeAse ase2 = new MeleeAse(this, 40, 93);
434            ase2.Position = asepaikka;
435            ase2.Mass = 0.00000001;
436            ase2.Image = Tikarinkuva;
437            ase2.Shape = Shape.FromImage(Tikarinkuva);
438            ase2.Tag = "ase";
439            Add(ase2);
440        }
441        else if (asenumero == 10)
442        {
443            MeleeAse ase3 = new MeleeAse(this, 52, 320);
444            ase3.Position = asepaikka;
445            ase3.Mass = 0.1;
446            ase3.Image = Miekankuva;
447            ase3.CollisionIgnoreGroup = 20000;
448            ase3.Shape = Shape.FromImage(Miekankuva);
449            ase3.Tag = "ase";
450            AddCollisionHandler(ase3, "irtoava", CollisionHandler.DestroyTarget);
451            Add(ase3);
452        }
453        else if (asenumero == 4)
454        {
455            MeleeAse ase4 = new MeleeAse(this, 72*2, 176*2);
456            ase4.Position = asepaikka;
457            ase4.Mass = 2;
458            ase4.Image = Nuijankuva;
459            ase4.Shape = Shape.FromImage(Nuijankuva);
460            ase4.Tag = "ase";
461            Add(ase4);
462        }
463        else if (asenumero == 5)
464        {
465            MeleeAse ase5 = new MeleeAse(this, 12, 440);
466            ase5.Position = asepaikka;
467            ase5.Image = Sauvankuva;
468            ase5.Shape = Shape.FromImage(Sauvankuva);
469            ase5.Tag = "ase";
470            Add(ase5);
471        }
472        else if (asenumero == 6)
473        {
474            Pistooli ase6 = new Pistooli(this, 180, 60);
475            ase6.Position = asepaikka;
476            ase6.Image = Pistoolinkuva;
477            ase6.Shape = Shape.FromImage(Pistoolinkuva);
478            ase6.Tag = "ase";
479            Add(ase6);
480        }
481        else if (asenumero == 7)
482        {
483            Pommi ase7 = new Pommi(this, 75, 75);
484            ase7.Position = asepaikka;
485            ase7.Image = Pomminkuva;
486            ase7.Shape = Shape.FromImage(Pomminkuva);
487            ase7.Tag = "ase";
488            Add(ase7);
489        }
490        else if (asenumero == 1)
491        {
492            Valomiekka ase7 = new Valomiekka(this, 40, 296);
493            ase7.Position = asepaikka;
494            ase7.Image = Valomiekankuva;
495            ase7.Shape = Shape.FromImage(Valomiekankuva);
496            ase7.Tag = "ase";
497            Add(ase7);
498        }
499        else if (asenumero == 2)
500        {
501            Valomiekka2 ase8 = new Valomiekka2(this, 40, 296);
502            ase8.Position = asepaikka;
503            ase8.Image = ToisenValomiekankuva;
504            ase8.Shape = Shape.FromImage(ToisenValomiekankuva);
505            ase8.Tag = "ase";
506            Add(ase8);
507        }
508        else if (asenumero == 3)
509        {
510            Valomiekka3 ase9 = new Valomiekka3(this, 14, 112);
511            ase9.Position = asepaikka;
512            ase9.Image = DoubleSaber;
513            ase9.Shape = Shape.Rectangle;
514            ase9.Tag = "ase";
515            Add(ase9);
516        }
517
518    }
519    void LiikutaTatilla(AnalogState tatti, Pelaaja pelaaja)
520    {
521        LiikutaPelaajaa(pelaaja, tatti.StateVector * 100);
522    }
523
524    void LiikutaPelaajaa(Pelaaja pelaaja, Vector suunta)
525    {
526        if (pelaaja.RuumiinOsat.Count == 0) return;
527        pelaaja.RuumiinOsat[0].Hit(suunta);
528
529    }
530
531
532    void Luopelaaja(Pelaaja pelaaja,int collisionIgnoreGroup, Vector pos, Color vari)
533    {
534        const double perusKoko = 30;
535        //int collisionIgnoreGroup = 2;
536
537
538
539        PhysicsObject paa = LuoRuumiinOsa(perusKoko, perusKoko, Shape.Circle,collisionIgnoreGroup, pos, vari);
540        PhysicsObject keskiVartalo = LuoRuumiinOsa(perusKoko, perusKoko * 3, Shape.Ellipse, collisionIgnoreGroup, paa.Position + new Vector(0, -2 * perusKoko), vari);
541        PhysicsObject vasenKasi = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(-35, 40), vari);
542        PhysicsObject vasenKasi2 = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(-85, 40), vari);
543        PhysicsObject oikeaKasi = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(35, 40), vari);
544        PhysicsObject oikeaKasi2 = LuoRuumiinOsa(perusKoko * 2, perusKoko / 2, Shape.Ellipse, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(85, 40), vari);
545        PhysicsObject vasenJalka = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(-10, -70), vari);
546        PhysicsObject oikeaJalka = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(10, -70), vari);
547        PhysicsObject vasenJalka2 = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(-10, -120), vari);
548        //vasenJalka2.Tag = "irtoava";
549        PhysicsObject oikeaJalka2 = LuoRuumiinOsa(perusKoko / 2, perusKoko * 2, Shape.Ellipse, collisionIgnoreGroup + 2, keskiVartalo.Position + new Vector(10, -120), vari);
550        PhysicsObject vasenKammen = LuoRuumiinOsa(perusKoko / 2, perusKoko / 2, Shape.Circle, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(-115, 40), vari);
551        vasenKammen.Tag = "vasenKammen";
552        PhysicsObject oikeaKammen = LuoRuumiinOsa(perusKoko / 2, perusKoko / 2, Shape.Circle, collisionIgnoreGroup + 1, keskiVartalo.Position + new Vector(115, 40), vari);
553        oikeaKammen.Tag = "oikeaKammen";
554
555        keskiVartalo.Tag = "ruumis";
556        paa.Tag = "ruumis";
557
558
559        ProgressBar elamaPalkki = new ProgressBar(75, 10);
560        elamaPalkki.X = 0;
561        elamaPalkki.Y = 40;
562        elamaPalkki.BindTo(pelaaja.Elamat);
563        Add(elamaPalkki);
564
565        Timer ajastin = new Timer();
566        ajastin.Interval = 0.01;
567        ajastin.Timeout += delegate
568        {
569            elamaPalkki.Position = Camera.WorldToScreen(keskiVartalo.Position + new Vector(0, 150));
570        };
571        ajastin.Start();
572
573
574        AddCollisionHandler(keskiVartalo, "ase", delegate(PhysicsObject kasi, PhysicsObject ase) {
575            AseOsuuRuumiinOsaan(kasi, ase, pelaaja);
576        });
577
578        AddCollisionHandler(paa, "ase", delegate(PhysicsObject kasi, PhysicsObject ase)
579        {
580            AseOsuuRuumiinOsaan(kasi, ase, pelaaja);
581        });
582
583        pelaaja.Elamat.LowerLimit += delegate {
584            Explosion rajahdys = new Explosion(200);
585            rajahdys.Position = paa.Position;
586            Add(rajahdys);
587            paa.Destroy();
588            oikeaKammen.Destroy();
589            vasenKammen.Destroy();
590            pelaaja.RikoLiitokset();
591            IrrotaAseet(pelaaja);
592        };
593
594        AddCollisionHandler(vasenKammen, "ase", delegate(PhysicsObject kasi, PhysicsObject ase) { KeraaAseVasempaanKateen(kasi, ase, pelaaja); });
595        AddCollisionHandler(oikeaKammen, "ase", delegate(PhysicsObject kasi, PhysicsObject ase) { KeraaAseOikeaanKateen(kasi, ase, pelaaja); });
596        pelaaja.RuumiinOsat.Add(paa);
597
598        pelaaja.RuumiinOsat.Add(vasenKammen);
599        pelaaja.RuumiinOsat.Add(oikeaKammen);
600
601        foreach (var item in pelaaja.RuumiinOsat)
602        {
603            Add(item);
604        }
605
606        Add(paa);
607        Add(keskiVartalo);
608        Add(vasenKasi);
609        Add(vasenKasi2);
610        Add(oikeaKasi);
611        Add(oikeaKasi2);
612        Add(vasenJalka);
613        Add(oikeaJalka);
614        Add(vasenJalka2);
615        Add(oikeaJalka2);
616        Add(vasenKammen);
617        Add(oikeaKammen);
618        pelaaja.liitokset.Add(LiitaYhteen(paa, keskiVartalo, new Vector(0, -5)));
619        pelaaja.liitokset.Add(LiitaYhteen(keskiVartalo, vasenKasi, new Vector(-10, 30)));
620        pelaaja.liitokset.Add(LiitaYhteen(vasenKasi, vasenKasi2, new Vector(-25, 0)));
621        pelaaja.liitokset.Add(LiitaYhteen(keskiVartalo, oikeaKasi, new Vector(10, 30)));
622        pelaaja.liitokset.Add(LiitaYhteen(oikeaKasi, oikeaKasi2, new Vector(25, 0)));
623        pelaaja.liitokset.Add(LiitaYhteen(vasenJalka, keskiVartalo, new Vector(0, 30)));
624        pelaaja.liitokset.Add(LiitaYhteen(oikeaJalka, keskiVartalo, new Vector(0, 30)));
625        pelaaja.liitokset.Add(LiitaYhteen(vasenJalka2, vasenJalka, new Vector(0, 25)));
626        pelaaja.liitokset.Add(LiitaYhteen(oikeaJalka2, oikeaJalka, new Vector(0, 25)));
627        pelaaja.liitokset.Add(LiitaYhteen(vasenKasi2, vasenKammen, new Vector(-25, 0)));
628        pelaaja.liitokset.Add(LiitaYhteen(oikeaKasi2, oikeaKammen, new Vector(25, 0)));
629    }
630
631    void AseOsuuRuumiinOsaan(PhysicsObject ruumiinOsa, PhysicsObject ase, Pelaaja pelaaja)
632    {
633        const double KERROIN = 0.05; // > 0
634        double extraDmg = ase.Velocity.Magnitude * KERROIN;
635
636        if (pelaaja.oikeaKasi != null && ase.Equals(pelaaja.oikeaKasi.Object2)) return;
637        if (pelaaja.vasenKasi != null && ase.Equals(pelaaja.vasenKasi.Object2)) return;
638        int dmg = (int)(1 + extraDmg);
639        pelaaja.Elamat.Value -= dmg;
640        Label vahinko = new Label(dmg.ToString());
641        //vahinko.X = ruumiinOsa.X;
642        //vahinko.Y = ruumiinOsa.Y;
643        vahinko.Position = Camera.WorldToScreen(ruumiinOsa.Position);
644        vahinko.LifetimeLeft = TimeSpan.FromSeconds(2.0);
645        Add(vahinko);
646    }
647
648    void KeraaAseVasempaanKateen(PhysicsObject kasi, PhysicsObject ase, Pelaaja pelaaja)
649    {
650        if (pelaaja.vasenKasi == null && pelaaja.OtetaankoKiinni)
651        {
652            pelaaja.vasenKasi = LiitaYhteen(kasi, ase, Vector.Zero);
653            pelaaja.tamanhetkinenAse = ase;
654            MeleeAse weapon = ase as MeleeAse;
655            if (weapon != null)
656            {
657                weapon.VaihdaOmistajaa(pelaaja.vasenKasi);
658            }
659
660            if (ase is Pommi)
661            {
662                (ase as Pommi).Sytyta(Bombuchan);
663                //Sytytapommi(ase);
664            }
665            else if (ase is Pistooli)
666            {
667                Timer laukausaika = new Timer();
668                laukausaika.Interval = 1;
669                laukausaika.Timeout += delegate
670                {
671                    PhysicsObject luoti = new PhysicsObject(46, 32);
672                    luoti.Position = ase.Position + ase.AbsoluteAngle.GetVector() * 300;
673                    luoti.Image = Luodinkuva;
674                    luoti.Hit(ase.Angle.GetVector() * 5000);
675                    luoti.LifetimeLeft = TimeSpan.FromSeconds(2);
676                    luoti.Tag = "ase";
677                    AddCollisionHandler(luoti, "ase", CollisionHandler.ExplodeObject(50, true));
678                    Ampuu.Play();
679                    Add(luoti);
680                };
681                laukausaika.Start();
682                Pistooli p = ase as Pistooli;
683                p.ampumisAjastin = laukausaika;
684            }
685            else if (ase is Valomiekka)
686            {
687                Animation anim = new Animation(Valomiekkaaukeaa);
688                anim.FPS = 5;
689                Saber2.Play();
690                //anim.StopOnLastFrame = true;
691                ase.Animation = anim;
692                ase.Animation.Start();
693
694                anim.Played += delegate
695                {
696                    ase.Animation = null;
697                    ase.Image = Valomiekkaaukeaa[Valomiekkaaukeaa.Length - 1];
698                    ase.Shape = Shape.FromImage(Valomiekkaaukeaa[Valomiekkaaukeaa.Length - 1]);
699                };
700            }
701            else if (ase is Valomiekka2)
702            {
703                Animation anim = new Animation(ToinenValomiekkaaukeaa);
704                anim.FPS = 5;
705                Saber.Play();
706                //anim.StopOnLastFrame = true;
707                ase.Animation = anim;
708                ase.Animation.Start();
709
710                anim.Played += delegate
711                {
712                    ase.Animation = null;
713                    ase.Image = ToinenValomiekkaaukeaa[ToinenValomiekkaaukeaa.Length - 1];
714                    ase.Shape = Shape.FromImage(ToinenValomiekkaaukeaa[ToinenValomiekkaaukeaa.Length - 1]);
715                };
716            }
717            else if (ase is Valomiekka3)
718            {
719                Timer.SingleShot(0.666666667,
720               delegate {Saber.Play(); });
721
722                Animation anim = new Animation(DoubleSaberOn);
723                anim.FPS = 5;
724                Saber.Play();
725                //anim.StopOnLastFrame = true;
726                ase.Height = 2 * 296;
727                ase.Width = 2 * 20;
728                ase.Animation = anim;
729                ase.Animation.Start();
730
731                anim.Played += delegate
732                {
733                    ase.Animation = null;
734                    ase.Image = DoubleSaberOn[DoubleSaberOn.Length - 1];
735                    ase.Shape = Shape.FromImage(DoubleSaberOn[DoubleSaberOn.Length - 1]);
736                };
737            }
738        }
739        //ase.CollisionIgnoreGroup = kasi.CollisionIgnoreGroup;
740        AseKeratty(pelaaja);
741    }
742
743 
744    void KeraaAseOikeaanKateen(PhysicsObject kasi, PhysicsObject ase, Pelaaja pelaaja)
745    {
746        if (pelaaja.oikeaKasi == null && pelaaja.OtetaankoKiinni)
747        {
748            pelaaja.oikeaKasi = LiitaYhteen(kasi, ase, Vector.Zero);
749            pelaaja.tamanhetkinenAse = ase;
750            MeleeAse weapon = ase as MeleeAse;
751            if (weapon != null)
752            {
753                weapon.VaihdaOmistajaa(pelaaja.oikeaKasi);
754            }
755
756            if (ase is Pommi)
757            {
758                (ase as Pommi).Sytyta(Bombuchan);
759            }
760            else if (ase is Pistooli)
761            {
762                Timer laukausaika = new Timer();
763                laukausaika.Interval = 1;
764                laukausaika.Timeout += delegate
765                {
766                    PhysicsObject luoti = new PhysicsObject(46, 32);
767                    luoti.Position = ase.Position + ase.AbsoluteAngle.GetVector() * 150;
768                    luoti.Image = Luodinkuva;
769                    luoti.Hit(ase.Angle.GetVector() * 5000);
770                    luoti.LifetimeLeft = TimeSpan.FromSeconds(2);
771                    luoti.Tag = "ase";
772                    AddCollisionHandler(luoti, "ase", CollisionHandler.ExplodeObject(50, true));
773                    Ampuu.Play();
774                    Add(luoti);
775                };
776                laukausaika.Start();
777                Pistooli p = ase as Pistooli;
778                p.ampumisAjastin = laukausaika;
779            }
780            else if (ase is Valomiekka)
781            {
782                Animation anim = new Animation(Valomiekkaaukeaa);
783                anim.FPS = 5;
784                Saber2.Play();
785                ase.Animation = anim;
786                ase.Animation.Start();
787
788                anim.Played += delegate
789                {
790                    ase.Animation = null;
791                    ase.Image = Valomiekkaaukeaa[Valomiekkaaukeaa.Length - 1];
792                    ase.Shape = Shape.FromImage(Valomiekkaaukeaa[Valomiekkaaukeaa.Length - 1]);
793                };
794            }
795            else if (ase is Valomiekka2)
796            {
797                Animation anim = new Animation(ToinenValomiekkaaukeaa);
798                anim.FPS = 5;
799                Saber.Play();
800                ase.Animation = anim;
801                ase.Animation.Start();
802
803                anim.Played += delegate
804                {
805                    ase.Animation = null;
806                    ase.Image = ToinenValomiekkaaukeaa[ToinenValomiekkaaukeaa.Length - 1];
807                    ase.Shape = Shape.FromImage(ToinenValomiekkaaukeaa[ToinenValomiekkaaukeaa.Length - 1]);
808                };
809            }
810            else if (ase is Valomiekka3)
811            {
812                Timer.SingleShot(0.666666667,
813               delegate { Saber.Play(); });
814
815                Animation anim = new Animation(DoubleSaberOn);
816                anim.FPS = 5;
817                Saber.Play();
818                //anim.StopOnLastFrame = true;
819                ase.Height = 2 * 296;
820                ase.Width = 2 * 20;
821                ase.Animation = anim;
822                ase.Animation.Start();
823
824                anim.Played += delegate
825                {
826                    ase.Animation = null;
827                    ase.Image = DoubleSaberOn[DoubleSaberOn.Length - 1];
828                    ase.Shape = Shape.FromImage(DoubleSaberOn[DoubleSaberOn.Length - 1]);
829                };
830            }
831        }
832        //ase.CollisionIgnoreGroup = kasi.CollisionIgnoreGroup;
833        AseKeratty(pelaaja);
834
835    }
836
837    void AseKeratty(Pelaaja pelaaja)
838    {
839        pelaaja.OtetaankoKiinni = false;
840    }
841
842
843
844    AxleJoint LiitaYhteen(PhysicsObject ens, PhysicsObject toin, Vector sidosKohta)
845    {
846        AxleJoint liitos = new AxleJoint(ens, toin, ens.Position + sidosKohta);
847        liitos.Softness = 0.000000005;
848        Add(liitos);
849        return liitos;
850    }
851
852    PhysicsObject LuoRuumiinOsa(double leveys, double korkeus, Shape muoto, int collisionIgnoreGroup, Vector pos, Color vari)
853    {
854        PhysicsObject ruumiinOsa = new PhysicsObject(leveys, korkeus, muoto);
855        ruumiinOsa.Position = pos;
856        ruumiinOsa.Color = vari;
857        ruumiinOsa.CollisionIgnoreGroup = collisionIgnoreGroup;
858       
859        return ruumiinOsa;
860    }
861
862    public Pelaaja EtsiOmistaja(PhysicsObject osa)
863    {
864        if (OmistaaOsan(pelaaja1, osa)) return pelaaja1;
865        if (OmistaaOsan(pelaaja2, osa)) return pelaaja2;
866        if (OmistaaOsan(pelaaja3, osa)) return pelaaja3;
867        if (OmistaaOsan(pelaaja4, osa)) return pelaaja4;
868        return null;
869    }
870
871    bool OmistaaOsan(Pelaaja pelaaja, PhysicsObject osa)
872    {
873        foreach (var obj in pelaaja.RuumiinOsat)
874        {
875            if (obj == osa)
876                return true;
877        }
878        return false;
879    }
880}
Note: See TracBrowser for help on using the repository browser.