source: 2013/24/AamosR/GeneerinenAvaruuslentely/GeneerinenAvaruuslentely/GeneerinenAvaruuslentely/GeneerinenAvaruuslentely.cs @ 4120

Revision 4120, 14.2 KB checked in by juiitamm, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9
10
11
12class alus : PhysicsObject
13{
14    private IntMeter elamaLaskuri = new IntMeter(3, 0, 3);
15    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
16
17    public alus(double leveys, double korkeus)
18        : base(leveys, korkeus)
19    {
20        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
21    }
22}
23
24public class GeneerinenAvaruuslentely : PhysicsGame
25{
26    EasyHighScore topLista = new EasyHighScore();
27    Image aluskuva = LoadImage("alus");
28    Image asteroidikuva = LoadImage("asteroidi");
29    Image tausta = LoadImage("tausta");
30    Image vihollinenkuva = LoadImage("vihollinen");
31    Image hp = LoadImage("hp");
32    Image rajahdys = LoadImage("explosion0");
33    Image liekkikuva = LoadImage("liekki");
34    SoundEffect hurt = LoadSoundEffect("hit");
35    SoundEffect shoot = LoadSoundEffect("shoot");
36    SoundEffect explosion = LoadSoundEffect("explosion");
37    SoundEffect powerup = LoadSoundEffect("powerup");
38
39
40    alus alus;
41    PhysicsObject asteroidi;
42    PhysicsObject HP;
43    //PhysicsObject vihollinen;
44    IntMeter pisteLaskuri;
45    IntMeter ElamaLaskuri;
46
47    bool SaaAmpua = true;
48   
49   
50   
51    public override void Begin()
52    {
53        // TODO: Kirjoita ohjelmakoodisi tähän
54        //IsFullScreen = true;
55        ClearAll();
56        Level.Background.Image = tausta;
57
58        SetWindowSize(1920, 1080, true);
59        MultiSelectWindow valikko = new MultiSelectWindow("Generic Space Game", "Start Game", "How to play", "High Score", "Quit");
60        //valikko.ItemSelected += PainettiinValikonNappia;
61       
62        valikko.Color = Color.SkyBlue;
63       
64        valikko.BorderColor = Color.Black;
65        valikko.AddItemHandler(0, AloitaPeli);
66        valikko.AddItemHandler(1, Ohjeet);
67        valikko.AddItemHandler(2, ParhaatPisteet);
68        valikko.AddItemHandler(3, ConfirmExit);
69       
70        Add(valikko);
71       
72    }
73
74    void ParhaatPisteet()
75    {
76        topLista.Show();
77        topLista.HighScoreWindow.Closed += delegate { Begin(); };
78    }
79   
80    void AloitaPeli()
81    {
82        ClearAll();
83
84        MediaPlayer.Play("8bit Dungeon Boss");
85        MediaPlayer.IsRepeating = true;
86        LuoKentta();
87        AsteroidiAjastin();
88        VihollisAjastin();
89        HPAjastin();
90        AsetaOhjaimet();
91        LuoPisteLaskuri();
92        LuoElamaLaskuri();
93    }
94
95    void LuoElamaLaskuri()
96    {
97        ElamaLaskuri = new IntMeter(5, 0, 10);
98
99        Label ElamaNaytto = new Label();
100        ElamaNaytto.X = Screen.Left + 100;
101        ElamaNaytto.Y = Screen.Top - 100;
102        ElamaNaytto.TextColor = Color.White;
103        ElamaNaytto.Title = "HP";
104        ElamaNaytto.BindTo(ElamaLaskuri);
105       
106        ElamaLaskuri.LowerLimit +=  ElamaLoppui;
107        ElamaLaskuri.LowerLimit += ElamaLaskuri.Reset;
108        //ElamaLaskuri.LowerLimit += topLista.EnterAndShow(pisteLaskuri.Value);
109        //ElamaLaskuri.LowerLimit += topLista.HighScoreWindow.Closed += Begin;
110
111        Add(ElamaNaytto);
112
113
114    }
115
116    void ElamaLoppui()
117    {
118        alus.Destroy();
119        explosion.Play();
120        ControllerOne.Vibrate(10.0, 10.0, 10.0, 10.0, 1.5);
121        //Begin();
122        Explosion rajahdys = new Explosion(1000);
123        rajahdys.Position = alus.Position;
124        rajahdys.Force = 0;
125        Add(rajahdys);
126        topLista.EnterAndShow(pisteLaskuri.Value);
127        topLista.HighScoreWindow.Closed += delegate { Begin(); };
128       
129       
130    }
131
132    void Ohjeet()
133    {
134        MessageWindow ikkuna = new MessageWindow("The goal of this game is to survive. You get points when time passes and from destroying enemies. Health Packs give you 2 HP. \n \n \n Controls (Keyboard): \n \n WASD: move \n \n rCtrl: shoot \n \n Press Enter to continue \n");
135        ikkuna.Closed += delegate { Begin(); };
136        ikkuna.Message.SizeMode = TextSizeMode.AutoSize;
137        Add(ikkuna);
138        //Window ikkuna = new Window();
139        //ikkuna.
140        //ikkuna.Title.Text = "How to play:";
141        //Label teksti = new Label("The goal of this game is to survive. You get points when time passes and from destroying enemies. Controls: WASD: move rCtrl: shoot Press Enter to continue");
142        //teksti.Width = 300;
143        //teksti.SizeMode = TextSizeMode.Wrapped;
144        //ikkuna.Add(teksti);
145        //Add(ikkuna);
146        //Add(teksti);
147        //Keyboard.Listen(Key.Enter, ButtonState.Pressed, Begin, null);
148    }
149
150    void LuoPisteLaskuri()
151    {
152        pisteLaskuri = new IntMeter(0);
153
154        Timer pisteTimer = new Timer();
155        pisteTimer.Interval = 2;
156        pisteTimer.Timeout += delegate { pisteLaskuri.Value++; };
157        pisteTimer.Start();
158
159        Label pisteNaytto = new Label();
160        pisteNaytto.X = Screen.Right - 100;
161        pisteNaytto.Y = Screen.Top - 100;
162        pisteNaytto.TextColor = Color.White;
163        //pisteNaytto.Color = Color.White;
164        pisteNaytto.Title = "Points";
165       
166
167        pisteNaytto.BindTo(pisteLaskuri);
168        Add(pisteNaytto);
169       
170    }
171
172
173    void LuoKentta()
174    {
175        Level.Width = Screen.Width;
176        Level.Height = Screen.Height;
177        Level.CreateBorders();
178       
179        alus = new alus(100, 100);
180        alus.Shape = Shape.Rectangle;
181        alus.X = 0;
182        alus.Y = 0;
183        alus.Image = aluskuva;
184        alus.AngularDamping = 0.5;
185        alus.LinearDamping = 0.95;
186        alus.ElamaLaskuri.Value--;
187        Vector pelaajanSuunta = Vector.FromLengthAndAngle(2500.0, alus.Angle);
188        Flame liekki = new Flame(liekkikuva);
189        //liekki.RotateImage = true;
190        //liekki. = Angle.RightAngle;
191        liekki.IgnoreWind = false;
192        Wind = new Vector(0, -100);
193        Add(liekki, -1);
194
195        Level.Background.Image = tausta;
196
197        Add(alus);
198
199        AddCollisionHandler(alus, "vihollinen", kuolema);
200        AddCollisionHandler(alus, "hp", LisaaTerveys);
201    }
202
203   
204
205    void AsetaOhjaimet()
206    {
207        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
208        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
209        Keyboard.Listen(Key.A, ButtonState.Down, KaannaAlusta, null, 10.0);
210        Keyboard.Listen(Key.D, ButtonState.Down, KaannaAlusta, null, -10.0);
211        Keyboard.Listen(Key.W, ButtonState.Down, TyonnaAlusta, null);
212        Keyboard.Listen(Key.S, ButtonState.Down, VedaAlusta, null);
213        Keyboard.Listen(Key.RightControl, ButtonState.Down, Ammu, null);
214        Keyboard.Listen(Key.P, ButtonState.Pressed, Pause, null);
215        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, KaannaTatilla, null);
216        ControllerOne.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, null);
217        ControllerOne.Listen(Button.Start, ButtonState.Pressed, Pause, null);
218        ControllerOne.ListenAnalog(AnalogControl.LeftTrigger, 0.1, AmmuLiipasin, null);
219
220       
221       
222       
223    }
224
225    void AmmuLiipasin(AnalogState liipasimenTila)
226    {
227        Ammu();
228    }
229
230
231    void KaannaTatilla(AnalogState tatinTila)
232    {
233        Vector tatinAsento = tatinTila.StateVector;
234        alus.AngularVelocity = tatinAsento.X * -10;
235        Vector pelaajanSuunta = Vector.FromLengthAndAngle(tatinAsento.Y * 2500, alus.Angle);
236        alus.Push(pelaajanSuunta);
237    }
238
239    void KaannaAlusta(double kulma)
240    {
241        alus.AngularVelocity = kulma;
242    }
243
244    void LisaaTerveys(PhysicsObject alus, PhysicsObject HP)
245    {
246        ElamaLaskuri.Value += 2;
247        HP.Destroy();
248        powerup.Play();
249    }
250
251    void TyonnaAlusta()
252    {
253        Vector pelaajanSuunta = Vector.FromLengthAndAngle(2500.0, alus.Angle);
254        alus.Push(pelaajanSuunta);
255
256    }
257
258    void VedaAlusta()
259    {
260        Vector pelaajanSuunta = Vector.FromLengthAndAngle(2500.0, alus.Angle);
261        alus.Push(pelaajanSuunta - pelaajanSuunta - pelaajanSuunta);
262
263    }
264
265    void kuolema(PhysicsObject alus, PhysicsObject vihollinen)
266    {
267        hurt.Play();
268        Explosion rajahdys = new Explosion(100);
269        rajahdys.Position = vihollinen.Position;
270        rajahdys.Force = 0;
271        //rajahdys.Image = rajahdys;
272        Add(rajahdys);
273        ControllerOne.Vibrate(0.25, 0.25, 1.0, 1.0, 0.25);
274        ElamaLaskuri.Value -= 1;
275        vihollinen.Destroy();
276    }
277
278
279    void HPAjastin()
280    {
281        Timer ajastin = new Timer();
282        ajastin.Interval = 20;
283        ajastin.Timeout += LisaaHP;
284        ajastin.Start();
285    }
286
287    void LisaaHP()
288    {
289        Vector kentanPiste = Level.GetRandomPosition();
290        HP = new PhysicsObject(50, 50);
291        HP.IgnoresCollisionResponse = true;
292        HP.Tag = "hp";
293        HP.Image = hp;
294        HP.Position = kentanPiste;
295        HP.LifetimeLeft = TimeSpan.FromSeconds(10);
296        Add(HP);
297    }
298
299    void LisaaAsteroidi()
300    {
301        //Vector kentanPiste = Level.GetRandomPosition();
302        //RandomGen.NextVector(
303
304        Vector kentanPiste = Vector.FromLengthAndAngle(Level.Width + 200, RandomGen.NextAngle());
305        asteroidi = new PhysicsObject(50, 50);
306        asteroidi.Position = kentanPiste;
307        asteroidi.Shape = Shape.Circle;
308        asteroidi.Color = Color.Black;
309        asteroidi.Image = asteroidikuva;
310        asteroidi.Tag = "vihollinen";
311        asteroidi.LifetimeLeft = TimeSpan.FromSeconds(10);
312        asteroidi.IgnoresCollisionResponse = true;
313        Add(asteroidi);
314        Angle asteroidikulma = (Vector.Zero - asteroidi.Position).Angle;
315        Vector asteroidivector = Vector.FromLengthAndAngle(500, RandomGen.NextAngle(asteroidikulma -Angle.FromDegrees(50), (asteroidikulma +Angle.FromDegrees(50))));
316        asteroidi.Hit(asteroidivector);
317    }
318
319    void AsteroidiAjastin()
320    {
321        Timer ajastin = new Timer();
322        ajastin.Interval = 0.25;
323        ajastin.Timeout += LisaaAsteroidi;
324        ajastin.Start();
325    }
326
327    void VihollisAjastin()
328    {
329        Timer ajastin = new Timer();
330        ajastin.Interval = 5;
331        ajastin.Timeout += LisaaVihollinen;
332        ajastin.Start();
333    }
334
335    void LisaaVihollinen()
336    {
337        Vector kentanPiste = Vector.FromLengthAndAngle(Level.Width + 200, RandomGen.NextAngle());
338        PhysicsObject vihollinen = new PhysicsObject(150, 150);
339        vihollinen.Position = kentanPiste;
340        vihollinen.Shape = Shape.Circle;
341        vihollinen.Color = Color.Black;
342        vihollinen.Image = vihollinenkuva;
343        vihollinen.Tag = "vihollinen";
344        //vihollinen.Tag = "vihu";
345        vihollinen.IgnoresCollisionResponse = true;
346        vihollinen.LifetimeLeft = TimeSpan.FromSeconds(10);
347
348        AssaultRifle pelaajan1Ase = new AssaultRifle(30, 10);
349        pelaajan1Ase.IsVisible = false;
350        pelaajan1Ase.FireRate = 9001;
351        pelaajan1Ase.InfiniteAmmo = true;
352        pelaajan1Ase.Power.DefaultValue = 100;
353        pelaajan1Ase.Power.Value = 100;
354        pelaajan1Ase.ProjectileCollision = AmmusOsui;
355        vihollinen.Add(pelaajan1Ase);
356
357        Add(vihollinen);
358        Angle vihollinenkulma = (Vector.Zero - vihollinen.Position).Angle;
359        Vector vihollinenvector = Vector.FromLengthAndAngle(500, RandomGen.NextAngle(vihollinenkulma - Angle.FromDegrees(10), (vihollinenkulma + Angle.FromDegrees(10))));
360       
361        vihollinen.Hit(vihollinenvector);
362
363        Timer ajastin = new Timer();
364        ajastin.Interval = 5;
365        ajastin.Timeout += delegate { VihollinenAmpuu(vihollinen, pelaajan1Ase, ajastin); };
366        ajastin.Start();
367
368    }
369
370    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
371    {
372        if (kohde == alus)
373        {
374            ElamaLaskuri.Value -= 1;
375            hurt.Play();
376            Explosion rajahdys = new Explosion(100);
377            ControllerOne.Vibrate(0.25, 0.25, 1.0, 1.0, 0.25);
378            rajahdys.Position = ammus.Position;
379            rajahdys.Force = 0;
380            Add(rajahdys);
381           
382        }
383
384        ammus.Destroy();
385    }
386
387    void VihollinenAmpuu(PhysicsObject vihollinen, AssaultRifle ase, Timer ajastin)
388    {
389        if (vihollinen.IsDestroyed)
390        {
391            ajastin.Stop();
392            return;
393        }
394        Vector suunta = (alus.Position - vihollinen.Position).Normalize();
395        ase.Angle = suunta.Angle;
396        PhysicsObject ammus = ase.Shoot();
397
398        if (ammus != null)
399        {
400            ammus.IgnoresCollisionResponse = true;
401        }
402    }
403
404    void Ammu()
405    {
406        if (SaaAmpua == true)
407        {
408            SaaAmpua = false;
409            shoot.Play();
410            PhysicsObject ammus = new PhysicsObject(10, 10);
411
412            Vector pelaajanSuunta = Vector.FromLengthAndAngle(2500.0, alus.Angle);
413
414
415            ammus.Position = alus.Position + Vector.FromLengthAndAngle(80.0, alus.Angle);
416            ammus.Shape = Shape.Circle;
417            ammus.Color = Color.Yellow;
418            ammus.Hit(pelaajanSuunta);
419
420            Add(ammus, -1);
421
422
423            ammus.CanRotate = false;
424            ammus.IgnoresCollisionResponse = true;
425            AddCollisionHandler(ammus, "vihollinen", vihollisenKuolema);
426
427            Timer poistumisAjastin = new Timer();
428            poistumisAjastin.Interval = 1;
429            poistumisAjastin.Timeout += delegate { ammusPoistuu(ammus); };
430            poistumisAjastin.Start();
431
432            Timer.SingleShot(0.002,
433                delegate { SaaAmpua = true; }
434            );
435        }
436    }
437
438    void ammusPoistuu(PhysicsObject ammus)
439    {
440        if (ammus.X > Level.Right)
441        {
442            ammus.Destroy();
443        }
444
445        else if (ammus.Y > Level.Top)
446        {
447            ammus.Destroy();
448        }
449    }
450
451    void vihollisenKuolema(PhysicsObject ammus, PhysicsObject vihollinen)
452    {
453        vihollinen.Destroy();
454        hurt.Play();
455        Explosion rajahdys = new Explosion(100);
456        rajahdys.Position = vihollinen.Position;
457        rajahdys.Force = 0;
458        Add(rajahdys);
459        ammus.Destroy();
460
461        pisteLaskuri.Value += 10;
462       
463    }
464
465    void asteroidiKuolema(PhysicsObject ammus, PhysicsObject asteroidi)
466    {
467        asteroidi.Destroy();
468        ammus.Destroy();
469
470        pisteLaskuri.Value += 5;
471    }
472}
Note: See TracBrowser for help on using the repository browser.