source: 2013/30/MitjaK/YellowSubmarine/YellowSubmarine/YellowSubmarine/YellowSubmarine.cs @ 4717

Revision 4717, 15.0 KB checked in by misakana, 9 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
9public class YellowSubmarine : PhysicsGame
10{
11
12    PhysicsObject sukellusvene;
13    Image sukellusvenekuva = LoadImage("submarine");
14    Image taustakuva = LoadImage("TaustaVuoret");
15    Image kuplanKuva1 = LoadImage("Kupla");
16    Image kuplanKuva2 = LoadImage("Kupla2");
17
18    Image torpedonKuva = LoadImage("Torpedo");
19
20    GameObject tausta;
21    Image pienKivenKuva = LoadImage("Kivi1");
22    Image miinankuva = LoadImage("Miina");
23    Image kettinki = LoadImage("ketju");
24    Image kiviKuva = LoadImage("Kivi2");
25    Image arkunKuva = LoadImage("aarrearkku");
26    Image valikonKuva = LoadImage("Valikkokuva");
27    Animation sukellusveneAnimaatio = new Animation(LoadImages("submarine", "submarine1", "submarine2", "submarine1"));
28    ExplosionSystem expSys;
29    ExplosionSystem expSys2;
30    ExplosionSystem expSys3;
31
32    Image vesirajahdys = LoadImage("vesirajahdys1");
33    Image vesirajahdys2 = LoadImage("vesirajahdys2");
34    Image vesirajahdys3 = LoadImage("vesirajahdys3");
35    Image scoreKuva = LoadImage("Tulostaulu");
36    Image pisteKuva = LoadImage("Tulostaulu2");
37    Image valokuva = LoadImage("valo");
38    Image tulostaulu = LoadImage("parhaat pisteet");
39
40    SoundEffect taustamusiikki = LoadSoundEffect("Yellow Submarine.mp3");
41
42
43
44    IntMeter pisteLaskuri;
45
46    EasyHighScore topLista = new EasyHighScore();
47
48
49
50
51
52
53
54    /// <summary>
55    /// Onko "oikeaa" peliä aloitettu.
56    /// </summary>
57    bool isGameStarted = false;
58
59    public override void Begin()
60    {
61       
62        //IsFullScreen = true;
63        SetWindowSize(1024, 768);
64        AlkuValikko();
65
66
67
68    }
69
70    void LuoSatunnaistaTavaraa()
71    {
72        pisteLaskuri.Value += 1;
73
74        if (RandomGen.NextBool() && RandomGen.NextBool()) LisaaMiina();
75
76        // if (RandomGen.NextInt(101) <= 1) LisaaAarreArkku();
77
78        if (RandomGen.NextInt(101) <= 15)
79        {
80            LuoMaastoa();
81        }
82        if (RandomGen.NextInt(101) <= 5)
83        {
84            torpedo();
85        }
86        if (RandomGen.NextInt(101) <= 25)
87        {
88            LuoKelluviaKuplia(Camera.ScreenToWorld(new Vector(Screen.Right, Screen.Bottom + 30)), 5);
89        }
90
91
92    }
93
94
95    void LisaaAarreArkku()
96    {
97        // PhysicsObject arkku = LuoObjektiRuudunReunaan(-250, 0);
98        // arkku.Tag = "kerättävä";
99        // arkku.Color = RandomGen.NextColor();
100        //arkku.IgnoresCollisionResponse = true;
101        //arkku.Image = arkunKuva;
102        //Add(arkku);
103
104    }
105
106
107    void LisaaMiina()
108    {
109        PhysicsObject miina = LuoObjektiRuudunReunaan(-100, 250);
110        miina.Size *= 1.5;
111        miina.Tag = "miina";
112        miina.Image = miinankuva;
113        GameObject ketjuOlio = Ketju(miina.Position);
114        miina.Destroyed += delegate { ketjuOlio.Destroy(); };
115        Add(miina);
116    }
117
118    PhysicsObject LuoObjektiRuudunReunaan(double yAla, double yYla)
119    {
120        PhysicsObject palikka = new PhysicsObject(25, 25);
121        palikka.X = Camera.ScreenToWorld(new Vector(Screen.Right, 0)).X;
122        palikka.Y = RandomGen.NextDouble(yAla, yYla);
123        palikka.LifetimeLeft = TimeSpan.FromSeconds(15);
124        palikka.MakeStatic();
125        return palikka;
126    }
127
128    void LuoLisaaTaustaa(Vector paikka)
129    {
130        Vector uudenPaikka = paikka + new Vector(tausta.Width / 2 - 1, 0);
131        tausta = new GameObject(1000, 600);
132        tausta.Image = taustakuva;
133        tausta.LifetimeLeft = TimeSpan.FromSeconds(30);
134        tausta.Position = uudenPaikka;
135        tausta.Color = Jypeli.RandomGen.NextColor();
136        Add(tausta, -2);
137
138        LuoMaata();
139        //Tähän voi tehdä myös surfacen lisäluomisen
140    }
141
142    private void LuoMaata()
143    {
144        PhysicsObject maa = new PhysicsObject(tausta.Width, 50);
145        maa.Position = tausta.Position + new Vector(0, -300);
146        //maa.Shape = Shape.Triangle;
147        maa.Tag = "kivi";
148        maa.Color = Color.Black;
149        maa.MakeStatic();
150        maa.LifetimeLeft = TimeSpan.FromSeconds(60);
151        Add(maa);
152
153        //LuoKelluvaKupla(new Vector(0, Screen.Bottom));
154        //LuoKelluvaKupla(new Vector(RandomGen.NextDouble(Level.Left, Level.Right), Screen.Bottom));
155
156    }
157
158
159    void RajaytaKohteet(PhysicsObject ens, PhysicsObject toinen)
160    {
161
162        expSys.AddEffect(ens.Position, 100);
163        expSys2.AddEffect(ens.Position, 100);
164        expSys3.AddEffect(ens.Position, 100);
165        ens.Destroy();
166        if (toinen != null)
167            toinen.Destroy();
168
169    }
170
171    void RajaytaKohteet(PhysicsObject ens)
172    {
173        RajaytaKohteet(ens, null);
174    }
175
176    void LuoSukellusvene()
177    {
178        sukellusvene = new PhysicsObject(sukellusvenekuva.Width / 2, sukellusvenekuva.Height / 2);
179        sukellusvene.Velocity = new Vector(50, 0);
180        sukellusvene.CanRotate = false;
181        sukellusvene.Animation = sukellusveneAnimaatio;
182        sukellusvene.Animation.Start();
183        sukellusvene.Shape = Shape.FromImage(sukellusvenekuva);
184
185        sukellusvene.Destroyed += delegate { Timer.SingleShot(2.0, Havio); };
186
187        AddCollisionHandler(sukellusvene, "miina", RajaytaKohteet);
188
189        AddCollisionHandler(sukellusvene, "kivi", RajaytaKohteet);
190        Add(sukellusvene, 1);
191
192        GameObject Valo = new GameObject(valokuva);
193        sukellusvene.Add(Valo);
194        Valo.Position = new Vector(sukellusvene.X, sukellusvene.Y -18); 
195        int times = 0;
196
197        Timer ajastin = new Timer();
198        ajastin.Interval = 0.1;
199        const int kuinkaUseinKupliaSekunninKymmenesOsissa = 30;
200        ajastin.Timeout += delegate
201        {
202
203            if (sukellusvene.Velocity.X < 300) sukellusvene.Velocity += new Vector(2.0, 0);
204
205            times++;
206
207            if (times % kuinkaUseinKupliaSekunninKymmenesOsissa == 0)
208            {
209                LuoKelluviaKuplia(sukellusvene.Position + new Vector(-10, 0), 3);
210            }
211            //sukellusvene.Velocity = new Vector(sukellusvene.Velocity.X * 1.1, sukellusvene.Velocity.Y);
212        };
213        ajastin.Start();
214    }
215
216    private void LuoKelluviaKuplia(Vector paikka, int maxMaara)
217    {
218        for (int i = 0; i < RandomGen.NextInt(1, maxMaara + 1); i++)
219        {
220            LuoKelluvaKupla(paikka + Jypeli.RandomGen.NextVector(1, 5));
221        }
222    }
223
224
225
226    void LuoKelluvaKupla(Vector paikka)
227    {
228        GameObject kupla = new GameObject(5, 5);
229        kupla.Image = Jypeli.RandomGen.SelectOne(kuplanKuva1, kuplanKuva2);
230        kupla.Position = paikka;
231        Add(kupla, -1);
232
233        Timer ajastin = new Timer();
234        ajastin.Interval = 0.5;
235        ajastin.Timeout += delegate
236        {
237            if (kupla.Position.Y > Screen.Top)
238            {
239                kupla.Destroy();
240                ajastin.Stop();
241            }
242            else kupla.Position += new Vector(RandomGen.NextDouble(-10, 10), 7);
243        };
244        ajastin.Start();
245
246    }
247
248
249    void AsetaOhjaimet()
250    {
251        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
252        Keyboard.Listen(Key.Up, ButtonState.Down, LiikutaSukellusvenetta, null, new Vector(0, 50));
253    }
254
255
256    void LiikutaSukellusvenetta(Vector vector)
257    {
258        if (sukellusvene.Top > 285 && !sukellusvene.IsDestroyed)
259        {
260            RajaytaKohteet(sukellusvene);
261        }
262        sukellusvene.Velocity = new Vector(sukellusvene.Velocity.X, vector.Y);
263    }
264
265    void LuoMaastoa()
266    {
267
268        PhysicsObject kivi = LuoObjektiRuudunReunaan(-290, -290);
269        kivi.Shape = Shape.Triangle;
270        kivi.Color = Color.Black;
271
272        for (int i = 0; i < 20; i++)
273        {
274            PhysicsObject pienKivi = new PhysicsObject(25, 25);
275            pienKivi.Position = new Vector(kivi.Right, kivi.Y + RandomGen.NextDouble(100, 200));
276            pienKivi.Shape = Shape.Circle;
277            pienKivi.Color = Color.Red;
278            pienKivi.LifetimeLeft = TimeSpan.FromSeconds(25);
279            pienKivi.Mass = 100;
280            pienKivi.Tag = "kivi";
281            pienKivi.Image = pienKivenKuva;
282            Add(pienKivi);
283        }
284
285        LuoMaastonOsa(
286            Camera.ScreenToWorld(RandomGen.NextVector(Screen.Right, Screen.Bottom + 100, Screen.Right + 100, Screen.Bottom + 200)),
287            new Vector(50.0, 50.0),
288            "kivi",
289            kiviKuva,
290            TimeSpan.FromSeconds(25),
291            10000,
292            true
293            );
294    }
295
296    /// <summary>
297    /// Luodaan maaston osa.
298    /// </summary>
299    /// <param name="paikka">Paikka</param>
300    /// <param name="koko">Koko. X leveys, Y korkeus.</param>
301    /// <param name="kuva">Kuva</param>
302    /// <param name="elinaika">Aika, jonka kuluttua kappale poistetaan.</param>
303    /// <param name="jaakoPaikalleenOsuttuaanJohonkin">Muuttuko kappale staattiseksi osuttuaan johonkin.</param>
304    void LuoMaastonOsa(Vector paikka, Vector koko, string tag, Image kuva, TimeSpan elinaika, double massa, bool jaakoPaikalleenOsuttuaanJohonkin)
305    {
306        PhysicsObject kappale = new PhysicsObject(koko.X, koko.Y);
307        kappale.Tag = tag;
308        kappale.Image = kuva;
309        kappale.MaximumLifetime = elinaika;
310        kappale.Position = paikka;
311        kappale.Mass = massa;
312        Add(kappale);
313    }
314
315    void AlkuValikko()
316    {
317        ClearAll();
318        Level.Background.Image = valikonKuva;
319        Level.Background.FitToLevel();
320        List<Label> valikonKohdat = new List<Label>();
321
322        Label kohta1 = new Label("Aloita uusi peli");
323        kohta1.Position = new Vector(0, 40);
324        valikonKohdat.Add(kohta1);
325        Add(kohta1);
326
327        Label kohta2 = new Label("Lopeta");
328        kohta2.Position = new Vector(0, -40);
329        valikonKohdat.Add(kohta2);
330        Mouse.IsCursorVisible = true;
331        Mouse.ListenMovement(1.0, delegate(AnalogState ht) { ValikossaLiikkuminen(ht, valikonKohdat); }, null);
332        Add(kohta2);
333
334        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, delegate { AloitaPeli(valikonKohdat); }, null);
335        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Exit, null);
336    }
337
338    ExplosionSystem AlustaExpSystem(Image kuva)
339    {
340        ExplosionSystem alustettava = new ExplosionSystem(kuva, 150);
341        alustettava.Image = kuva;
342        alustettava.MaxScale = 35;
343        alustettava.MinScale = 10;
344        alustettava.MinVelocity = 100;
345        alustettava.MaxVelocity = 200;
346        Add(alustettava);
347        return alustettava;
348    }
349
350
351    void AloitaPeli(List<Label> valikonOsat)
352    {
353        Level.Size = new Vector(700, 400);
354        foreach (Label osa in valikonOsat)
355        {
356            osa.Destroy();
357        }
358
359        IsPaused = false;
360
361        expSys = AlustaExpSystem(vesirajahdys);
362        expSys2 = AlustaExpSystem(vesirajahdys2);
363        expSys3 = AlustaExpSystem(vesirajahdys3);
364
365        AsetaOhjaimet();
366
367        Gravity = new Vector(0.0, -150.0);
368        //Level.Size = new Vector(2048, 221);
369        //MultiSelectWindow alkuvalikko = new MultiSelectWindow("Yellow Submarine", "Aloita", "Lopeta");
370        //Add(alkuvalikko);
371
372        Level.Background.CreateGradient(Color.DarkBlue, Color.LightBlue);
373
374        tausta = new GameObject(1000, 600);
375        tausta.Image = taustakuva;
376        // tausta.Position = sukellusvene.Position;
377        Add(tausta, -2);
378        LuoMaata();
379        pistelaskuri();
380        aanet();
381
382
383        Timer miinaAjastin = new Timer();
384        miinaAjastin.Interval = 0.5;
385        miinaAjastin.Timeout += LuoSatunnaistaTavaraa;
386        miinaAjastin.Start();
387
388
389        Camera.StayInLevel = false;
390        LuoSukellusvene();
391        LuoMaastoa();
392        tausta.Position = sukellusvene.Position;
393       
394        Camera.ZoomToLevel();
395        Camera.Follow(sukellusvene);
396        Camera.FollowsY = false;
397        isGameStarted = true;
398
399        //Level.AmbientLight = 0.25;
400    }
401
402    void ValikossaLiikkuminen(AnalogState hiirenTila, List<Label> valikonKohdat)
403    {
404        foreach (Label kohta in valikonKohdat)
405        {
406            if (Mouse.IsCursorOn(kohta))
407            {
408                kohta.TextColor = Color.Red;
409            }
410            else
411            {
412                kohta.TextColor = Color.Black;
413            }
414        }
415
416    }
417
418    void Havio()
419    {
420        isGameStarted = false;
421        //Timer.SingleShot(1.0, AlkuValikko);
422
423        topLista.HighScoreWindow.Image = tulostaulu;
424
425        topLista.EnterAndShow(pisteLaskuri.Value);
426        topLista.HighScoreWindow.Closed += delegate { AlkuValikko(); };
427        IsPaused = true;
428        MediaPlayer.Pause();
429    }
430
431    protected override void Update(Time time)
432    {
433        if (!isGameStarted)
434        {
435            base.Update(time);
436            return;
437        }
438        base.Update(time);
439        //Vector paikka = Camera.ScreenToWorld(new Vector(Screen.Right, 0));
440        Vector paikka = new Vector(sukellusvene.X + tausta.Width * 2, 0);
441        if (paikka.X >= tausta.Right) LuoLisaaTaustaa(new Vector(tausta.X, tausta.Y));
442        //if (sukellusvene.X >= tausta.Right) LuoLisaaTaustaa(new Vector(tausta.Right, tausta.Y));
443
444        //valo.Position = sukellusvene.Position;
445
446
447    }
448    GameObject Ketju(Vector paikka)
449    {
450        GameObject ketju = new GameObject(5, 500);
451        ketju.Image = kettinki;
452        ketju.Position = paikka;
453        ketju.Y -= 250;
454        ketju.TextureWrapSize = new Vector(1.0, 60.0);
455        ketju.LifetimeLeft = TimeSpan.FromSeconds(60);
456        Add(ketju, -1);
457        return ketju;
458
459    }
460    void torpedo()
461    {
462        PhysicsObject torpedo = LuoObjektiRuudunReunaan(-250, 250);
463        torpedo.Image = torpedonKuva;
464        torpedo.Size = new Vector(120, 30);
465        torpedo.Velocity = new Vector(-250, 0);
466        LuoKelluvaKupla(torpedo.Position);
467        Add(torpedo);
468        AddCollisionHandler(torpedo, RajaytaKohteet);
469    }
470    void pistelaskuri()
471    {
472
473        pisteLaskuri = new IntMeter(0);
474
475
476        Label pisteNaytto = new Label();
477        pisteNaytto.X = Screen.Left + 260;
478        pisteNaytto.Y = Screen.Top - 100;
479        pisteNaytto.TextColor = Color.LightBlue;
480        pisteNaytto.Color = Color.Transparent;
481
482        GameObject pisteKuvaNaytto = new GameObject(pisteKuva);
483        pisteKuvaNaytto.Position = pisteNaytto.Position;
484        pisteKuvaNaytto.Size *= 2;
485
486        Add(pisteKuvaNaytto);
487
488        Label pisteTekstiNaytto = new Label(scoreKuva);
489        pisteTekstiNaytto.Position = new Vector(Screen.Left + 200, Screen.Top - 100);
490        pisteTekstiNaytto.Size *= 0.5;
491        //pisteTekstiNaytto.X = Screen.Left + 100;
492        //pisteTekstiNaytto.Y = Screen.Top - 100;
493
494        Add(pisteTekstiNaytto);
495
496       
497
498        pisteNaytto.BindTo(pisteLaskuri);
499        Add(pisteNaytto);
500    }
501    void aanet()
502    {
503        //taustamusiikki.Play();
504        MediaPlayer.Play("Yellow Submarine");
505        MediaPlayer.IsRepeating = true;
506    }
507
508
509}
510
511
Note: See TracBrowser for help on using the repository browser.