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

Revision 4641, 11.6 KB checked in by misakana, 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
9public class YellowSubmarine : PhysicsGame
10   
11{   
12   
13    PhysicsObject sukellusvene;
14    Image sukellusvenekuva = LoadImage("submarine");
15    Image taustakuva = LoadImage("TaustaVuoret");
16    Image kuplanKuva1 = LoadImage("Kupla");
17    Image kuplanKuva2 = LoadImage("Kupla2");
18
19    GameObject tausta;
20    Image pienKivenKuva = LoadImage("Kivi1");
21    Image miinankuva = LoadImage("Miina");
22    Image kiviKuva = LoadImage("Kivi2");
23    Image arkunKuva = LoadImage("aarrearkku");
24    Image valikonKuva = LoadImage("Valikkokuva");
25    Animation sukellusveneAnimaatio = new Animation(LoadImages("submarine", "submarine1", "submarine2", "submarine1"));
26    ExplosionSystem expSys;
27    ExplosionSystem expSys2;
28    ExplosionSystem expSys3;
29
30    Image vesirajahdys = LoadImage("vesirajahdys1");
31    Image vesirajahdys2 = LoadImage("vesirajahdys2");
32    Image vesirajahdys3 = LoadImage("vesirajahdys3");
33
34
35   
36
37
38    /// <summary>
39    /// Onko "oikeaa" peliä aloitettu.
40    /// </summary>
41    bool isGameStarted = false;
42
43    public override void Begin()
44    {
45        IsFullScreen = true;
46        AlkuValikko();
47
48    }
49
50    void LuoSatunnaistaTavaraa()
51    {
52        if (RandomGen.NextBool() && RandomGen.NextBool()) LisaaMiina();
53
54        if (RandomGen.NextInt(101) <= 1) LisaaAarreArkku();
55
56        if (RandomGen.NextInt(101) <= 15)
57        {
58            LuoMaastoa();
59        }
60    }
61
62
63    void LisaaAarreArkku()
64    {
65        PhysicsObject arkku = LuoObjektiRuudunReunaan(-250, 0);
66        arkku.Tag = "kerättävä";
67        arkku.Color = RandomGen.NextColor();
68        arkku.IgnoresCollisionResponse = true;
69        arkku.Image = arkunKuva;
70        Add(arkku);
71
72    }
73
74
75    void LisaaMiina()
76    {
77        PhysicsObject miina = LuoObjektiRuudunReunaan(-100, 250);
78        miina.Tag = "miina";
79        miina.Image = miinankuva;
80
81        Add(miina);
82    }
83
84    PhysicsObject LuoObjektiRuudunReunaan(double yAla, double yYla)
85    {
86        PhysicsObject palikka = new PhysicsObject(25, 25);
87        palikka.X = Camera.ScreenToWorld(new Vector(Screen.Right, 0)).X;
88        palikka.Y = RandomGen.NextDouble(yAla, yYla);
89        palikka.LifetimeLeft = TimeSpan.FromSeconds(15);
90        palikka.MakeStatic();
91        return palikka;
92    }
93
94    void LuoLisaaTaustaa(Vector paikka)
95    {
96        Vector uudenPaikka = paikka + new Vector(tausta.Width / 2 - 1, 0);
97        tausta = new GameObject(1000, 600);
98        tausta.Image = taustakuva;
99        tausta.LifetimeLeft = TimeSpan.FromSeconds(30);
100        tausta.Position = uudenPaikka;
101        tausta.Color = Jypeli.RandomGen.NextColor();
102        Add(tausta, -2);
103
104        LuoMaata();
105        //Tähän voi tehdä myös surfacen lisäluomisen
106    }
107
108    private void LuoMaata()
109    {
110        PhysicsObject maa = new PhysicsObject(tausta.Width, 50);
111        maa.Position = tausta.Position + new Vector(0, -300);
112        //maa.Shape = Shape.Triangle;
113        maa.Color = Color.Black;
114        maa.MakeStatic();
115        maa.LifetimeLeft = TimeSpan.FromSeconds(60);
116        Add(maa);
117    }
118
119
120    void RajaytaKohteet(PhysicsObject ens, PhysicsObject toinen)
121    {
122        expSys.AddEffect(ens.Position, 100);
123        expSys2.AddEffect(ens.Position, 100);
124        expSys3.AddEffect(ens.Position, 100);
125        ens.Destroy();
126        toinen.Destroy();
127
128    }
129
130
131
132
133    void LuoSukellusvene()
134    {
135        sukellusvene = new PhysicsObject(sukellusvenekuva.Width / 2, sukellusvenekuva.Height / 2);
136        sukellusvene.Velocity = new Vector(50, 0);
137        sukellusvene.CanRotate = false;
138        sukellusvene.Animation = sukellusveneAnimaatio;
139        sukellusvene.Animation.Start();
140        sukellusvene.Shape = Shape.FromImage(sukellusvenekuva);
141        AddCollisionHandler(sukellusvene, "miina", RajaytaKohteet);
142        AddCollisionHandler(sukellusvene, "miina", Havio);
143
144        AddCollisionHandler(sukellusvene, "kivi", RajaytaKohteet);
145        AddCollisionHandler(sukellusvene, "kivi", Havio);
146        Add(sukellusvene);
147
148        int times = 0;
149
150        Timer ajastin = new Timer();
151        ajastin.Interval = 0.1;
152        const int kuinkaUseinKupliaSekunninKymmenesOsissa = 30;
153        ajastin.Timeout += delegate
154        {
155
156            if (sukellusvene.Velocity.X >= 300) ajastin.Stop();
157            else sukellusvene.Velocity += new Vector(0.2,0);
158            times++;
159
160            if (times % kuinkaUseinKupliaSekunninKymmenesOsissa == 0)
161            {
162                for (int i = 0; i < RandomGen.NextInt(1, 4); i++)
163                {
164                    LuoKelluvaKupla(sukellusvene.Position + new Vector(-10, 0) + Jypeli.RandomGen.NextVector(1, 5));
165                }
166            }
167            //sukellusvene.Velocity = new Vector(sukellusvene.Velocity.X * 1.1, sukellusvene.Velocity.Y);
168        };
169        ajastin.Start();
170    }
171
172
173
174    void LuoKelluvaKupla(Vector paikka)
175    {
176        GameObject kupla = new GameObject(5, 5);
177        kupla.Image = Jypeli.RandomGen.SelectOne(kuplanKuva1, kuplanKuva2);
178        kupla.Position = paikka;
179        Add(kupla);
180
181        Timer ajastin = new Timer();
182        ajastin.Interval = 0.5;
183        ajastin.Timeout += delegate
184        {
185            if (kupla.Position.Y > Screen.Top)
186            {
187                kupla.Destroy();
188                ajastin.Stop();
189            }
190            else kupla.Position += new Vector(RandomGen.NextDouble(-10, 10), 7);
191        };
192        ajastin.Start();
193
194    }
195
196
197    void AsetaOhjaimet()
198    {
199        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
200        Keyboard.Listen(Key.Up, ButtonState.Down, LiikutaSukellusvenetta, null, new Vector(0, 50));
201    }
202
203
204    void LiikutaSukellusvenetta(Vector vector)
205    {
206        sukellusvene.Velocity = new Vector(sukellusvene.Velocity.X, vector.Y);
207    }
208
209    void LuoMaastoa()
210    {
211
212        PhysicsObject kivi = LuoObjektiRuudunReunaan(-250, -150);
213        kivi.Shape = Shape.Triangle;
214        kivi.Color = Color.Black;
215
216        for (int i = 0; i < 20; i++)
217        {
218            PhysicsObject pienKivi = new PhysicsObject(25, 25);
219            pienKivi.Position = new Vector(kivi.Right, kivi.Y + RandomGen.NextDouble(20, 120));
220            pienKivi.Shape = Shape.Circle;
221            pienKivi.Color = Color.Red;
222            pienKivi.LifetimeLeft = TimeSpan.FromSeconds(25);
223            pienKivi.Mass = 100;
224            pienKivi.Tag = "kivi";
225            pienKivi.Image = pienKivenKuva;
226            Add(pienKivi);
227        }
228
229        LuoMaastonOsa(
230            Camera.ScreenToWorld(RandomGen.NextVector(Screen.Right, Screen.Bottom + 100, Screen.Right + 100, Screen.Bottom + 200)),
231            new Vector(50.0, 50.0),
232            kiviKuva,
233            TimeSpan.FromSeconds(25),
234            10000,
235            true
236            );
237    }
238
239    /// <summary>
240    /// Luodaan maaston osa.
241    /// </summary>
242    /// <param name="paikka">Paikka</param>
243    /// <param name="koko">Koko. X leveys, Y korkeus.</param>
244    /// <param name="kuva">Kuva</param>
245    /// <param name="elinaika">Aika, jonka kuluttua kappale poistetaan.</param>
246    /// <param name="jaakoPaikalleenOsuttuaanJohonkin">Muuttuko kappale staattiseksi osuttuaan johonkin.</param>
247    void LuoMaastonOsa(Vector paikka, Vector koko, Image kuva, TimeSpan elinaika, double massa, bool jaakoPaikalleenOsuttuaanJohonkin)
248    {
249        PhysicsObject kappale = new PhysicsObject(koko.X, koko.Y);
250        kappale.Image = kuva;
251        kappale.MaximumLifetime = elinaika;
252        kappale.Position = paikka;
253        kappale.Mass = massa;
254        Add(kappale);
255    }
256
257    void AlkuValikko()
258    {
259        ClearAll();
260        Level.Background.Image = valikonKuva;
261        List<Label> valikonKohdat = new List<Label>();
262
263        Label kohta1 = new Label("Aloita uusi peli");
264        kohta1.Position = new Vector(0, 40);
265        valikonKohdat.Add(kohta1);
266        Add(kohta1);
267
268        Label kohta2 = new Label("Lopeta");
269        kohta2.Position = new Vector(0, -40);
270        valikonKohdat.Add(kohta2);
271        Mouse.IsCursorVisible = true;
272        Mouse.ListenMovement(1.0, delegate(AnalogState ht) { ValikossaLiikkuminen(ht, valikonKohdat); }, null);
273        Add(kohta2);
274
275        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, delegate { AloitaPeli(valikonKohdat); }, null);
276        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Exit, null);
277    }
278
279    ExplosionSystem AlustaExpSystem(Image kuva)
280    {
281        ExplosionSystem alustettava = new ExplosionSystem(kuva, 150);
282        alustettava.Image = kuva;
283        alustettava.MaxScale = 35;
284        alustettava.MinScale = 10;
285        alustettava.MinVelocity = 100;
286        alustettava.MaxVelocity = 200;
287        Add(alustettava);
288        return alustettava;
289    }
290
291
292    void AloitaPeli(List<Label> valikonOsat)
293    {
294        foreach (Label osa in valikonOsat)
295        {
296            osa.Destroy();
297        }
298
299        expSys = AlustaExpSystem(vesirajahdys);
300        expSys2 = AlustaExpSystem(vesirajahdys2);
301        expSys3 = AlustaExpSystem(vesirajahdys3);
302
303        AsetaOhjaimet();
304
305        Gravity = new Vector(0.0, -150.0);
306        Level.Size = new Vector(2048, 221);
307
308        //MultiSelectWindow alkuvalikko = new MultiSelectWindow("Yellow Submarine", "Aloita", "Lopeta");
309        //Add(alkuvalikko);
310
311        Level.Background.CreateGradient(Color.DarkBlue, Color.LightBlue);
312
313        tausta = new GameObject(1000, 600);
314        tausta.Image = taustakuva;
315        // tausta.Position = sukellusvene.Position;
316        Add(tausta, -2);
317        LuoMaata();
318
319       
320        //Surface tausta = new Surface(200, 100);
321        //tausta.Color = Color.Pink;
322        //tausta.IgnoresCollisionResponse = true;
323        //Add(tausta, -2);
324
325        Timer miinaAjastin = new Timer();
326        miinaAjastin.Interval = 0.5;
327        miinaAjastin.Timeout += LuoSatunnaistaTavaraa;
328        miinaAjastin.Start();
329
330        //Level.CreateBorders();
331        //Level.Background.Image = taustakuva;
332        Camera.StayInLevel = false;
333        LuoSukellusvene();
334        LuoMaastoa();
335        tausta.Position = sukellusvene.Position;
336        Camera.Follow(sukellusvene);
337        Camera.ZoomFactor = 2;
338        Camera.FollowsY = false;
339        isGameStarted = true;
340
341        Level.AmbientLight = 0.25;
342    }
343
344    void ValikossaLiikkuminen(AnalogState hiirenTila, List<Label> valikonKohdat)
345    {
346        foreach (Label kohta in valikonKohdat)
347        {
348            if (Mouse.IsCursorOn(kohta))
349            {
350                kohta.TextColor = Color.Red;
351            }
352            else
353            {
354                kohta.TextColor = Color.Black;
355            }
356        }
357
358    }
359
360    void Havio(PhysicsObject tormaaja, PhysicsObject kohde)
361    {
362        isGameStarted = false;
363        Timer.SingleShot(1.0, AlkuValikko);
364    }
365
366    protected override void Update(Time time)
367    {
368        if (!isGameStarted)
369        {
370            base.Update(time);
371            return;
372        }
373        base.Update(time);
374        //Vector paikka = Camera.ScreenToWorld(new Vector(Screen.Right, 0));
375        Vector paikka = new Vector(sukellusvene.X + tausta.Width*2, 0);
376        if (paikka.X >= tausta.Right) LuoLisaaTaustaa(new Vector(tausta.X, tausta.Y));
377        //if (sukellusvene.X >= tausta.Right) LuoLisaaTaustaa(new Vector(tausta.Right, tausta.Y));
378
379        //valo.Position = sukellusvene.Position;
380
381       
382    }
383
384
385}
386
387
Note: See TracBrowser for help on using the repository browser.