source: 2014/koodauskerho/38/AakeR/Turborace/Turborace/Turborace.cs @ 5845

Revision 5845, 17.5 KB checked in by sieerinn, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Jypeli.Content;
9
10public class Alus : PhysicsObject
11{
12    private IntMeter pommiLaskuri = new IntMeter(0, 0, 100);
13    public IntMeter PommiLaskuri { get { return pommiLaskuri; } }
14
15    private IntMeter ammoLaskuri = new IntMeter(0, 0, 60);
16    public IntMeter AmmoLaskuri { get { return ammoLaskuri; } }
17
18    private DoubleMeter elamaLaskuri = new DoubleMeter(100, 0, 100);
19    public DoubleMeter ElamaLaskuri { get { return elamaLaskuri; } }
20
21    private AssaultRifle ase;
22    public AssaultRifle Ase { get { return ase; } }
23   
24    public Alus(double leveys, double korkeus)
25        : base(leveys, korkeus)
26    {
27        ase = new AssaultRifle(60, 60);
28        ase.IsVisible = false;
29        ase.ProjectileCollision = PanosOsui;
30        //ase.InfiniteAmmo = true;
31        Add(ase);
32
33       
34    }
35
36    void PanosOsui(PhysicsObject panos, PhysicsObject kohde)
37    {
38        panos.Destroy();
39        if (kohde.Tag == "alus")
40        {
41            Alus alus = (Alus)kohde;
42            alus.elamaLaskuri.Value -= 3;
43
44        }
45    }
46
47}
48
49public class Turborace : PhysicsGame
50{
51    Vector[] reittiPisteet = new Vector[]
52{
53    new Vector( -700.0, 200.0 ),
54    new Vector( -500.0, 300.0 ),
55    new Vector( 100.0, 320.0 ),
56    new Vector( 500.0, 220.0 ),
57    new Vector( 600.0, 170.0 ),
58    new Vector( 700.0, -100.0 ),
59    new Vector( 600.0, -300.0 ),
60    new Vector( 400.0, -430.0 ),
61    new Vector( 100.0, -400.0 ),
62    new Vector( -300.0, -300.0 ),
63    new Vector( -700.0, -250.0 ),
64    new Vector( -900.0, 0.0 ),
65    new Vector( -670.0, 210.0 ),
66};
67
68
69
70    Image aluskuva1 = LoadImage("Alus1");
71    Image aluskuva2 = LoadImage("Alus2");
72    Image aluskuva3 = LoadImage("Alus3");
73    Image aluskuva4 = LoadImage("Alus4");
74    Image boostikuva = LoadImage("Boosti");
75    Image pommikuplakuva = LoadImage("PommiKupla");
76    Image pommikuva = LoadImage("Pommi");
77    Image laserkuplakuva = LoadImage("LaserKupla");
78    Image laserkuva = LoadImage("Laser");
79    Image aluspalakuva = LoadImage("AlusPalanen");
80    Image rajahdyskuva = LoadImage("Rajahdys");
81    Image lasipalakuva = LoadImage("Lasipala");
82    Image isolaserkuva1 = LoadImage("IsoLaser1");
83    Image isolaserkuva2 = LoadImage("IsoLaser2");
84    Image isolaserkuva3 = LoadImage("IsoLaser3");
85   
86    Alus alus1, alus2, alus3, alus4;
87    ProgressBar elama1, elama2, elama3, elama4;
88
89    public override void Begin()
90    {
91        IsFullScreen = true;
92        Level.Height = 1000;
93        Level.Width = 2000;
94        PhysicsObject vasenReuna = Level.CreateLeftBorder();
95        vasenReuna.Restitution = 1.0;
96        vasenReuna.KineticFriction = 0.0;
97        vasenReuna.IsVisible = false;
98
99        PhysicsObject oikeaReuna = Level.CreateRightBorder();
100        oikeaReuna.Restitution = 1.0;
101        oikeaReuna.KineticFriction = 0.0;
102        oikeaReuna.IsVisible = false;
103
104        PhysicsObject ylaReuna = Level.CreateTopBorder();
105        ylaReuna.Restitution = 1.0;
106        ylaReuna.KineticFriction = 0.0;
107        ylaReuna.IsVisible = false;
108
109        PhysicsObject alaReuna = Level.CreateBottomBorder();
110        alaReuna.Restitution = 1.0;
111        alaReuna.IsVisible = false;
112        alaReuna.KineticFriction = 0.0;
113
114        LuoRata();
115
116        Timer ajastin = new Timer();
117        ajastin.Interval = 2.3;
118        ajastin.Timeout += delegate {
119            int i = 1 + RandomGen.NextInt(reittiPisteet.Length - 1);
120            luoBoosti(reittiPisteet[i], reittiPisteet[i - 1]);
121        };
122        ajastin.Start();
123
124        Timer ajastin2 = new Timer();
125        ajastin2.Interval = 5;
126        ajastin2.Timeout += delegate
127        {
128            int i = 1 + RandomGen.NextInt(reittiPisteet.Length - 1);
129            luoPommiKupla(reittiPisteet[i], reittiPisteet[i - 1]);
130        };
131        ajastin2.Start();
132
133        Timer ajastin3 = new Timer();
134        ajastin3.Interval = 4.2;
135        ajastin3.Timeout += delegate
136        {
137            int i = 1 + RandomGen.NextInt(reittiPisteet.Length - 1);
138            luoLaserKupla(reittiPisteet[i], reittiPisteet[i - 1]);
139        };
140        ajastin3.Start();
141
142        // TODO: Kirjoita ohjelmakoodisi tähän
143        alus1 = luoAlus(aluskuva1,  -150);
144        alus2 = luoAlus(aluskuva2,  -100);
145        alus3 = luoAlus(aluskuva3,   -50);
146        alus4 = luoAlus(aluskuva4,   0);
147
148
149        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
150        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
151        Keyboard.Listen(Key.Up, ButtonState.Down, LiikutaAlusta, null, alus1, 1000.0);
152        Keyboard.Listen(Key.Left, ButtonState.Down, KaannaAlusta, null, alus1, 5.0);
153        Keyboard.Listen(Key.Right, ButtonState.Down, KaannaAlusta, null, alus1, -5.0);
154        Keyboard.Listen(Key.Down, ButtonState.Down, LiikutaAlusta, null, alus1, -400.0);
155        Keyboard.Listen(Key.K, ButtonState.Pressed, TiputaPommi, null, alus1);
156        Keyboard.Listen(Key.J, ButtonState.Down, LiikutaAlusta2, null, alus1, 90.0);
157        Keyboard.Listen(Key.L, ButtonState.Down, LiikutaAlusta2, null, alus1, -90.0);
158        Keyboard.Listen(Key.I, ButtonState.Down, AmmuLaser, null, alus1);
159
160        Keyboard.Listen(Key.W, ButtonState.Down, LiikutaAlusta, null, alus2, 1000.0);
161        Keyboard.Listen(Key.A, ButtonState.Down, KaannaAlusta, null, alus2, 5.0);
162        Keyboard.Listen(Key.D, ButtonState.Down, KaannaAlusta, null, alus2, -5.0);
163        Keyboard.Listen(Key.S, ButtonState.Down, LiikutaAlusta, null, alus2, -400.0);
164        Keyboard.Listen(Key.G, ButtonState.Pressed, TiputaPommi, null, alus2);
165        Keyboard.Listen(Key.F, ButtonState.Down, LiikutaAlusta2, null, alus2, 90.0);
166        Keyboard.Listen(Key.H, ButtonState.Down, LiikutaAlusta2, null, alus2, -90.0);
167        Keyboard.Listen(Key.T, ButtonState.Down, AmmuLaser, null, alus2);
168
169        ControllerOne.Listen(Button.A, ButtonState.Down, LiikutaAlusta, null, alus3, 1000.0);
170        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, KaannaAlusta, null, alus3, 5.0);
171        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, KaannaAlusta, null, alus3, -5.0);
172        ControllerOne.Listen(Button.X, ButtonState.Down, LiikutaAlusta, null, alus3, -400.0);
173        ControllerOne.Listen(Button.LeftTrigger, ButtonState.Down, LiikutaAlusta2, null, alus3, 90.0);
174        ControllerOne.Listen(Button.RightTrigger, ButtonState.Down, LiikutaAlusta2, null, alus3, -90.0);
175        ControllerOne.Listen(Button.B, ButtonState.Down, TiputaPommi, null, alus3);
176        ControllerOne.Listen(Button.RightShoulder, ButtonState.Down, AmmuLaser, null, alus3);
177
178        ControllerTwo.Listen(Button.A, ButtonState.Down, LiikutaAlusta, null, alus4, 1000.0);
179        ControllerTwo.Listen(Button.DPadLeft, ButtonState.Down, KaannaAlusta, null, alus4, 5.0);
180        ControllerTwo.Listen(Button.DPadRight, ButtonState.Down, KaannaAlusta, null, alus4, -5.0);
181        ControllerTwo.Listen(Button.X, ButtonState.Down, LiikutaAlusta, null, alus4, -400.0);
182        ControllerTwo.Listen(Button.LeftTrigger, ButtonState.Down, LiikutaAlusta2, null, alus4, 90.0);
183        ControllerTwo.Listen(Button.RightTrigger, ButtonState.Down, LiikutaAlusta2, null, alus4, -90.0);
184        ControllerTwo.Listen(Button.B, ButtonState.Down, TiputaPommi, null, alus4);
185        ControllerTwo.Listen(Button.RightShoulder, ButtonState.Down, AmmuLaser, null, alus4);
186
187        elama1 = new ProgressBar(50, 5);
188        elama1.Position = alus1.Position + new Vector(0, 30);
189        elama1.BindTo(alus1.ElamaLaskuri);
190        elama1.BorderColor = Color.Black;
191        Add(elama1);
192
193
194        elama2 = new ProgressBar(50, 5);
195        elama2.Position = alus2.Position + new Vector(0, 30);
196        elama2.BindTo(alus2.ElamaLaskuri);
197        elama2.BorderColor = Color.Black;
198        Add(elama2);
199
200        elama3 = new ProgressBar(50, 5);
201        elama3.Position = alus3.Position + new Vector(0, 30);
202        elama3.BindTo(alus3.ElamaLaskuri);
203        elama3.BorderColor = Color.Black;
204        Add(elama3);
205
206        elama4 = new ProgressBar(50, 5);
207        elama4.Position = alus4.Position + new Vector(0, 30);
208        elama4.BindTo(alus4.ElamaLaskuri);
209        elama4.BorderColor = Color.Black;
210        Add(elama4);
211
212        Timer palkkilaskuri = new Timer();
213        palkkilaskuri.Interval = 0.01;
214        palkkilaskuri.Timeout += delegate
215        {
216            elama1.Position = alus1.Position + new Vector(0, 30);
217            elama2.Position = alus2.Position + new Vector(0, 30);
218            elama3.Position = alus3.Position + new Vector(0, 30);
219            elama4.Position = alus4.Position + new Vector(0, 30);
220        };
221        palkkilaskuri.Start();
222
223        alus1.Destroyed += delegate { elama1.Destroy(); };
224        alus2.Destroyed += delegate { elama2.Destroy(); };
225        alus3.Destroyed += delegate { elama3.Destroy(); };
226        alus4.Destroyed += delegate { elama4.Destroy(); };
227       
228
229    }
230
231    public void AmmuLaser(Alus alus)
232    {
233        PhysicsObject panos;
234        if (alus.AmmoLaskuri.Value > 0)
235        {
236            panos = alus.Ase.Shoot();
237
238            if (panos != null)
239            {
240                alus.AmmoLaskuri.Value--;
241                panos.Image = laserkuva;
242                panos.AbsoluteAngle = alus.AbsoluteAngle - Angle.FromDegrees(90);
243               
244            }
245           
246        }
247       
248    }
249
250    public void TiputaPommi(PhysicsObject alus)
251    {
252        Alus pelaaja = (Alus)alus;
253        if (pelaaja.PommiLaskuri.Value > 0)
254        {
255            PhysicsObject pommi = new PhysicsObject(25, 25);
256            pommi.Image = pommikuva;
257            pommi.Position = alus.Position + alus.AbsoluteAngle.GetVector().Normalize() * -70;
258            pommi.AbsoluteAngle = alus.AbsoluteAngle + Angle.FromDegrees(90);
259            AddCollisionHandler(pommi, "alus", pommiRajahtaa);
260            PomminPudotusPois(pelaaja);
261            Add(pommi);
262            pelaaja.PommiLaskuri.Value--;
263            pommi.IgnoresExplosions = true;
264        }
265    }
266
267    public void pommiRajahtaa(PhysicsObject pommi, PhysicsObject alus)
268    {
269        Explosion rajahdys = new Explosion(100);
270        rajahdys.Position = pommi.Position;
271        rajahdys.AddShockwaveHandler("alus", PommiOsuu);
272        pommi.Destroy();
273        Add(rajahdys);
274
275    }
276
277    public void PommiOsuu(IPhysicsObject olio, Vector shokki)
278    {
279        Alus alus = (Alus)olio;
280        alus.ElamaLaskuri.Value -= 20;
281    }
282
283    public void LiikutaAlusta(PhysicsObject alus, double nopeus)
284    {
285        Vector aluksenSuunta = Vector.FromLengthAndAngle(nopeus, alus.Angle);
286        alus.Push(aluksenSuunta);
287    }
288
289    public void KaannaAlusta(PhysicsObject alus, double nopeus)
290    {
291        Angle kulma = new Angle();
292        kulma.Degrees = nopeus;
293        alus.Angle += kulma;
294    }
295
296    Alus luoAlus(Image kuva, double poikkeama)
297    {
298        Alus alus = new Alus(60, 40);
299        alus.ElamaLaskuri.LowerLimit += delegate
300        {
301            alus.Destroy(); int pMaxMaara = 100;
302            // Alustetaan räjähdysjärjestelmä
303            // Parametrit:
304            // * kuva: mitä tekstuuria räjähdyksen
305            //   hiukkasten halutaan käyttävän
306            // * pMaxMaara: räjähdyksen käyttämien
307            //   hiukkasten eli partikkeleiden maksimimäärä
308            ExplosionSystem rajahdys = new ExplosionSystem(LoadImage("AlusPalanen"), 100);
309            rajahdys.MinScale = 20;
310            rajahdys.MaxScale = 25;
311           
312            // Lisätään järjestelmä peliin
313            Add(rajahdys);
314
315            // "Käynnistetään" räjähdys
316            rajahdys.AddEffect(alus.X, alus.Y, 50);
317
318
319            ExplosionSystem rajahdys2 = new ExplosionSystem(LoadImage("Rajahdys"), 20);
320            rajahdys2.MinScale = 50;
321            rajahdys2.MaxScale = 100;
322
323            // Lisätään järjestelmä peliin
324            Add(rajahdys2);
325
326            // "Käynnistetään" räjähdys
327            rajahdys2.AddEffect(alus.X, alus.Y, 16);
328
329            ExplosionSystem rajahdys3 = new ExplosionSystem(LoadImage("Lasipala"), 8);
330            rajahdys3.MinScale = 30;
331            rajahdys3.MaxScale = 30;
332
333            // Lisätään järjestelmä peliin
334            Add(rajahdys3);
335
336            // "Käynnistetään" räjähdys
337            rajahdys3.AddEffect(alus.X, alus.Y, 50);
338
339        };
340        alus.Shape = Shape.Rectangle;
341        alus.Image = kuva;
342        Add(alus);
343        alus.Restitution = 0.2;
344        alus.AngularDamping = 0.5;
345        alus.LinearDamping = 0.97;
346        alus.Tag = "alus";
347
348        alus.AbsoluteAngle = (reittiPisteet[1] - reittiPisteet[0]).Angle;
349        alus.Position = reittiPisteet[0] + (alus.AbsoluteAngle + Angle.FromDegrees(90)).GetVector() * poikkeama;
350
351        AddCollisionHandler(alus, "boosti", Boosti);
352        AddCollisionHandler(alus, "PommiKupla", KeraaPommi);
353        AddCollisionHandler(alus, "LaserKupla", KeraaLaser);
354
355        /*Vector pelaajanSuunta = Vector.FromLengthAndAngle(10000.0, alus.Angle);
356        alus.Push(pelaajanSuunta);
357        alus.AngularVelocity = 5.0;*/
358
359        return alus;
360    }
361
362    public void KeraaLaser(PhysicsObject alus, PhysicsObject laserkupla)
363    {
364        ((Alus)alus).AmmoLaskuri.Value += 30;
365        laserkupla.Destroy();
366    }
367
368    public void KeraaPommi(PhysicsObject alus, PhysicsObject pommikupla)
369    {
370        ((Alus)alus).PommiLaskuri.Value++;
371        pommikupla.IgnoresExplosions = true;
372        pommikupla.Destroy();
373    }
374
375    public void Boosti(PhysicsObject alus, PhysicsObject boosti)
376    {
377        //alus.Velocity *= 2;
378        alus.Hit(alus.AbsoluteAngle.GetVector() * 500);
379        boosti.Destroy();
380    }
381
382    public void LiikutaAlusta2(PhysicsObject alus, double kulma)
383    {
384        Vector suunta = (alus.Angle+Angle.FromDegrees(kulma)).GetVector()*10;
385       
386        alus.Hit (suunta);
387    }
388
389    void LuoRata()
390    {
391        //RoadMap tie = new RoadMap(reittiPisteet);
392        //tie.DefaultWidth = 210.0;
393        //tie.CreateSegmentFunction = LuoKaiteenPatka;
394        //tie.Insert();
395
396        Vector[] ulkoKaidePisteet = new Vector[reittiPisteet.Length];
397        for (int i = 0; i < reittiPisteet.Length; i++)
398        {
399            ulkoKaidePisteet[i] = reittiPisteet[i] + reittiPisteet[i].Normalize() * 100;
400        }
401
402        RoadMap ulkoKaide = new RoadMap(ulkoKaidePisteet);
403        ulkoKaide.DefaultWidth = 20.0;
404        ulkoKaide.CreateSegmentFunction = LuoKaiteenPatka;
405        ulkoKaide.Insert();
406
407        Vector[] sisäKaidePisteet = new Vector[reittiPisteet.Length];
408        for (int i = 0; i < reittiPisteet.Length; i++)
409        {
410            sisäKaidePisteet[i] = reittiPisteet[i] - reittiPisteet[i].Normalize() * 250;
411        }
412
413        RoadMap sisaKaide = new RoadMap(sisäKaidePisteet);
414        sisaKaide.DefaultWidth = 20.0;
415        sisaKaide.CreateSegmentFunction = LuoKaiteenPatka;
416        Level.Background.Color = Color.Gray;
417        sisaKaide.Insert();
418    }
419
420    PhysicsObject LuoKaiteenPatka(double width, double height, Shape shape)
421    {
422        PhysicsObject patka = PhysicsObject.CreateStaticObject(width, height, shape);
423        patka.Color = Color.Black;
424        Add(patka);
425        return patka;
426    }
427
428    void luoBoosti(Vector paikka, Vector edellinenPiste)
429    {
430        PhysicsObject boosti = new PhysicsObject(50, 50);
431        boosti.Image = boostikuva;
432        boosti.Position = paikka - paikka.Normalize() * 100;
433        boosti.IgnoresCollisionResponse = true;
434        boosti.Tag = "boosti";
435        boosti.IgnoresExplosions = true;
436        Add(boosti);
437
438        Vector suunta = paikka - edellinenPiste;
439        boosti.AbsoluteAngle = suunta.Angle - Angle.FromDegrees(90);
440
441        boosti.LifetimeLeft = TimeSpan.FromSeconds(6);
442    }
443
444    void luoPommiKupla(Vector paikka, Vector edellinenPiste)
445    {
446        PhysicsObject pommiKupla = new PhysicsObject(50, 50);
447        pommiKupla.Image = pommikuplakuva;
448        pommiKupla.Position = paikka - paikka.Normalize() * 100;
449        pommiKupla.IgnoresCollisionResponse = true;
450        pommiKupla.IgnoresExplosions = true;
451        pommiKupla.Tag = "PommiKupla";
452        Add(pommiKupla);
453        pommiKupla.LifetimeLeft = TimeSpan.FromSeconds(6);
454    }
455
456    void PomminPudotusPois(Alus alus)
457    {
458        if (alus == alus1)
459        {
460            Keyboard.Disable(Key.K);
461            Timer.SingleShot(2.5, delegate { Keyboard.Enable(Key.K); });
462        }
463
464        if (alus == alus2)
465        {
466            Keyboard.Disable(Key.G);
467            Timer.SingleShot(2.5, delegate { Keyboard.Enable(Key.G); });
468        }
469
470        if (alus == alus3)
471        {
472            ControllerOne.Disable(Button.B);
473            Timer.SingleShot(2.5, delegate { ControllerOne.Enable(Button.B); });
474        }
475
476        if (alus == alus4)
477        {
478            ControllerTwo.Disable(Button.B);
479            Timer.SingleShot(2.5, delegate { ControllerTwo.Enable(Button.B); });
480        }
481    }
482
483        void luoLaserKupla(Vector paikka, Vector edellinenPiste)
484    {
485        PhysicsObject laserKupla = new PhysicsObject(50, 50);
486        laserKupla.Image = laserkuplakuva;
487        laserKupla.Position = paikka - paikka.Normalize() * 100;
488        laserKupla.IgnoresCollisionResponse = true;
489        laserKupla.IgnoresExplosions = true;
490        laserKupla.Tag = "LaserKupla";
491        laserKupla.LifetimeLeft = TimeSpan.FromSeconds(6);
492        Add(laserKupla);
493
494    }
495
496}
Note: See TracBrowser for help on using the repository browser.