source: 2010/24/tekrjant/Laskuvarjo/Peli.cs @ 928

Revision 928, 10.7 KB checked in by tekrjant, 13 years ago (diff)

Mäiske-efekti on kohtuullisempi, ei vie niin ihan paljon tehoja.

Line 
1using System;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5
6public class Peli : PhysicsGame
7{
8    const double KavelyNopeus = 100;
9    const bool Gore = false; // K-18
10
11    Image[] laskuvarjonKuvat;
12    Image kuusenKuva;
13    Image vuorenKuva;
14    Image seinanKuva;
15
16    PhysicsObject maasto;
17    PlatformCharacter pelaaja;
18    GameObject laskuvarjo;
19
20    double keinumisSuunta = 1.0;
21    bool hengissa = true;
22
23    protected override void Begin()
24    {
25        LataaKuvat();
26
27        Gravity = new Vector(0, -500);
28
29        Level.Width = 3000;
30        Level.Height = 10000;
31        Level.BackgroundColor = Color.LightBlue;
32
33        PhysicsObject leftBorder = Level.CreateLeftBorder();
34        PhysicsObject rightBorder = Level.CreateRightBorder();
35        leftBorder.IsVisible = false;
36        rightBorder.IsVisible = false;
37
38        LuoMaasto();
39        LuoTalo();
40        LisaaPilvet();
41
42        pelaaja = new PlatformCharacter(20, 30);
43        pelaaja.CanMoveOnAir = false;
44        pelaaja.Mass = 80;
45        pelaaja.Image = LoadImage("hahmo");
46        pelaaja.Color = Color.Black;
47        pelaaja.LinearDamping = 0.99;
48        pelaaja.X = 0;
49        pelaaja.Y = Level.Top - 100;
50        //pelaaja.X = -200;
51        //pelaaja.Y = Level.Bottom + 20;
52        Add(pelaaja);
53
54        AddCollisionHandler(pelaaja, PelaajaOsuu);
55
56        laskuvarjo = new GameObject(50, 50);
57        laskuvarjo.IsVisible = false;
58        laskuvarjo.X = 0;
59        laskuvarjo.Y = 20;
60        laskuvarjo.Animation = new Animation(laskuvarjonKuvat);
61        laskuvarjo.Animation.StopOnLastFrame = true;
62        pelaaja.Add(laskuvarjo);
63
64        Camera.Follow(pelaaja);
65
66        Timer korkeusAjastin = new Timer();
67        korkeusAjastin.Interval = 1;
68        korkeusAjastin.Trigger += NaytaKorkeus;
69        Add(korkeusAjastin);
70        korkeusAjastin.Start();
71
72        AsetaOhjaimet();
73    }
74
75    void LataaKuvat()
76    {
77        kuusenKuva = LoadImage("kuusi");
78        vuorenKuva = LoadImage("vuori");
79        seinanKuva = LoadImage("seina");
80        laskuvarjonKuvat = LoadImages(
81            "laskuvarjo1",
82            "laskuvarjo2",
83            "laskuvarjo3",
84            "laskuvarjo4",
85            "laskuvarjo5",
86            "laskuvarjo6",
87            "laskuvarjo7"
88            );
89    }
90
91    void NaytaKorkeus(Timer sender)
92    {
93        double korkeus = pelaaja.Y - Level.Bottom;
94        MessageDisplay.Add("Korkeus: " + korkeus.ToString("F0"));
95
96        if (korkeus < 100)
97        {
98            sender.Stop();
99        }
100    }
101
102    void PelaajaOsuu(PhysicsObject pelaaja, PhysicsObject toinen)
103    {
104        SuljeLaskuvarjo();
105
106        if (Math.Abs(pelaaja.Velocity.Y) > 200)
107        {
108            // auts...
109            if (Gore)
110            {
111                for (int i = 0; i < 50; i++)
112                {
113                    PhysicsObject jama = new PhysicsObject(RandomGen.NextInt(1, 5), RandomGen.NextInt(1, 5), Shapes.Rectangle, CollisionShapeQuality.Worst);
114                    jama.X = pelaaja.X;
115                    jama.Y = pelaaja.Y;
116                    Vector maiskeenlento = Vector.FromLengthAndAngle(RandomGen.NextDouble(0, 800), RandomGen.NextAngle());
117                    jama.KineticFriction = 0.5;
118                    jama.LinearDamping = 0.99;
119                    jama.Color = RandomGen.NextColor(Color.Red, Color.Brown);
120                    jama.Hit(maiskeenlento);
121                    Add(jama);
122                }
123            }
124
125            pelaaja.Image = null;
126            pelaaja.Color = Color.Black;
127            pelaaja.Size = new Vector(20, 5);
128            hengissa = false;
129            // TODO: poista kontrollit...
130        }
131    }
132
133    void LisaaPilvet()
134    {
135        for (int i = 0; i < 100; i++)
136        {
137            double leveys = RandomGen.NextDouble(100, 600);
138            double korkeus = RandomGen.NextDouble(100, 500);
139            GameObject pilvi = new GameObject(leveys, korkeus, Shapes.Circle);
140            pilvi.X = RandomGen.NextDouble(Level.Left, Level.Right);
141            pilvi.Y = RandomGen.NextDouble(Level.Bottom + 1000, Level.Top);
142            pilvi.Color = Color.White;
143            Add(pilvi);
144        }
145    }
146
147    void LuoMaasto()
148    {
149        GameObject vuori = new GameObject(256, 256);
150        vuori.Image = vuorenKuva;
151        vuori.X = RandomGen.NextDouble(Level.Left + vuori.Width / 2, Level.Right - vuori.Width / 2);
152        vuori.Y = Level.Bottom + vuori.Height / 2 - 100;
153        Add(vuori);
154
155        maasto = PhysicsObject.CreateStaticObject(Level.Width, 1000, Shapes.Rectangle);
156        maasto.KineticFriction = 0.2;
157        maasto.X = 0;
158        maasto.Y = Level.Bottom - maasto.Height / 2;
159        maasto.Color = Color.Green;
160        Add(maasto);
161
162        for (int i = 0; i < 40; i++)
163        {
164            double leveys = RandomGen.NextDouble(40, 60);
165            double korkeus = RandomGen.NextDouble(80, 200);
166            GameObject kuusi = new GameObject(leveys, korkeus);
167            kuusi.Image = kuusenKuva;
168            kuusi.X = RandomGen.NextDouble(Level.Left, Level.Right);
169            kuusi.Y = Level.Bottom + kuusi.Height / 2;
170            Add(kuusi);
171        }
172    }
173
174    void LuoTalo()
175    {
176        LuoKerros( 200, 100, 0, Level.Bottom );
177        LuoKerros( 200, 100, 0, Level.Bottom + 100 );
178        LuoKerros( 200, 100, 0, Level.Bottom + 200 );
179        LuoKerros( 200, 100, 0, Level.Bottom + 300 );
180        LuoKerros( 200, 100, 0, Level.Bottom + 400 );
181    }
182
183    void LuoKerros(double leveys, double korkeus, double x, double y)
184    {
185        double left = x - leveys / 2;
186        double right = x + leveys / 2;
187        double katonPaksuus = 20;
188
189        GameObject takaSeina = new GameObject(leveys, korkeus);
190        takaSeina.Image = seinanKuva;
191        takaSeina.X = x;
192        takaSeina.Y = y + korkeus / 2;
193        takaSeina.TextureWrapSize = new Vector(leveys / 64, korkeus / 64);
194        Add(takaSeina);
195
196        PhysicsObject vasenSeina = LuoSeina(20, korkeus - katonPaksuus);
197        vasenSeina.X = left + vasenSeina.Width / 2;
198        vasenSeina.Y = y + vasenSeina.Height / 2;
199
200        PhysicsObject oikeaSeina = LuoSeina(20, korkeus - katonPaksuus);
201        oikeaSeina.X = right - oikeaSeina.Width / 2;
202        oikeaSeina.Y = y + oikeaSeina.Height / 2;
203
204        PhysicsObject vasenTukiPalkki = PhysicsObject.CreateStaticObject( 20, 20 );
205        vasenTukiPalkki.X = left + vasenSeina.Width + vasenTukiPalkki.Width / 2;
206        vasenTukiPalkki.Y = y + korkeus - katonPaksuus - vasenTukiPalkki.Height / 2;
207        vasenTukiPalkki.Color = Color.Black;
208        Add( vasenTukiPalkki );
209
210        PhysicsObject oikeaTukiPalkki = PhysicsObject.CreateStaticObject( 20, 20 );
211        oikeaTukiPalkki.X = right - oikeaSeina.Width - oikeaTukiPalkki.Width / 2;
212        oikeaTukiPalkki.Y = y + korkeus - katonPaksuus - oikeaTukiPalkki.Height / 2;
213        oikeaTukiPalkki.Color = Color.Black;
214        Add( oikeaTukiPalkki );
215
216        PhysicsObject katto = LuoKatto( leveys, katonPaksuus );
217        katto.X = x;
218        katto.Y = y + korkeus - katto.Height / 2;
219    }
220
221    PhysicsObject LuoSeina( double leveys, double korkeus)
222    {
223        PhysicsObject seina = PhysicsObject.CreateStaticObject( leveys, korkeus, Shapes.Rectangle, CollisionShapeQuality.FromValue( 0.8 ) );
224        seina.KineticFriction = 0.0;
225        seina.Restitution = 0.1;
226        seina.Color = Color.Brown;
227        Add( seina );
228        return seina;
229    }
230
231    PhysicsObject LuoKatto(double leveys, double korkeus)
232    {
233        PhysicsObject parru = new PhysicsObject(leveys, korkeus, Shapes.Rectangle, CollisionShapeQuality.FromValue(0.8));
234        parru.Mass = 500;
235        parru.AngularDamping = 0.95;
236        parru.LinearDamping = 0.95;
237        parru.StaticFriction = 0.0;
238        parru.KineticFriction = 0.0;
239        parru.Restitution = 0.0;
240        parru.Color = Color.Brown;
241        Add(parru);
242        AddCollisionHandler( parru, kattoonOsuu );
243        return parru;
244    }
245
246    void kattoonOsuu( PhysicsObject katto, PhysicsObject toinen )
247    {
248        if ( katto.Width > 50 && Math.Abs(toinen.Velocity.Y) > 100 )
249        {
250            toinen.Velocity = new Vector( toinen.Velocity.X, toinen.Velocity.Y * 0.6 );
251            katto.Destroy();
252
253            PhysicsObject pala1 = LuoKatto( katto.Width * 0.3, katto.Height );
254            pala1.X = katto.X - katto.Width * 0.15;
255            pala1.Y = katto.Y;
256
257            PhysicsObject pala2 = LuoKatto( katto.Width * 0.3, katto.Height );
258            pala2.X = katto.X + katto.Width * 0.15;
259            pala2.Y = katto.Y;
260        }
261    }
262
263    void SuljeLaskuvarjo()
264    {
265        laskuvarjo.Animation.Stop();
266        laskuvarjo.IsVisible = false;
267        pelaaja.Angle = Angle.Zero;
268    }
269
270    void AsetaOhjaimet()
271    {
272        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
273
274        // huijaus
275        Keyboard.Listen(Key.F2, ButtonState.Pressed, PelaajaMaahan, null);
276        Keyboard.Listen(Key.F3, ButtonState.Pressed, pelaajaMatalalle, null);
277
278        Keyboard.Listen(Key.Space, ButtonState.Pressed, AukaiseLaskuvarjo, "Aukaise laskuvarjo");
279        Keyboard.Listen(Key.Left, ButtonState.Down, pelaaja.Walk, null, -KavelyNopeus);
280        Keyboard.Listen(Key.Right, ButtonState.Down, pelaaja.Walk, null, KavelyNopeus);
281        Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
282        Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
283        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, null, 20000.0);
284    }
285
286    void Hyppaa(double voima)
287    {
288        pelaaja.Jump(voima);
289    }
290
291    void PelaajaMaahan()
292    {
293        pelaaja.X = -200;
294        pelaaja.Y = Level.Bottom + pelaaja.Height;
295        pelaaja.StopVertical();
296    }
297
298    void pelaajaMatalalle()
299    {
300        pelaaja.X = 0;
301        pelaaja.Y = Level.Bottom + 1500;
302    }
303
304    void AukaiseLaskuvarjo()
305    {
306        if (!laskuvarjo.IsVisible)
307        {
308            laskuvarjo.IsVisible = true;
309            laskuvarjo.Animation.Start(1);
310        }
311    }
312
313    protected override void Update(Time time)
314    {
315        if (laskuvarjo.IsVisible)
316        {
317            Vector nostoVoima = new Vector(0, 32000);
318            pelaaja.Push(nostoVoima);
319
320            Angle asteitaSekunnissa = Angle.Degrees(5);
321            pelaaja.Angle += keinumisSuunta * asteitaSekunnissa * time.SinceLastUpdate.TotalSeconds;
322
323            if (pelaaja.Angle.Degree > 10)
324            {
325                keinumisSuunta = -1.0;
326            }
327            else if (pelaaja.Angle.Degree < -5)
328            {
329                keinumisSuunta = 1.0;
330            }
331        }
332
333        base.Update(time);
334    }
335}
Note: See TracBrowser for help on using the repository browser.