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

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