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

Revision 956, 10.8 KB checked in by tekrjant, 10 years ago (diff)

Pilville kuvat.

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