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

Revision 927, 10.7 KB checked in by tekrjant, 10 years ago (diff)

Monta kerrosta, voi mennä katosta läpi.

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 < 100; i++)
112                {
113                    PhysicsObject jama = new PhysicsObject(RandomGen.NextInt(1, 5), RandomGen.NextInt(1, 5));
114                    jama.X = pelaaja.X;
115                    jama.Y = pelaaja.Y;
116                    Vector maiskeenlento = Vector.FromLengthAndAngle(RandomGen.NextDouble(0, 1000), RandomGen.NextAngle());
117                    jama.KineticFriction = 0.5;
118                    jama.LinearDamping = 0.99;
119                    jama.Color = RandomGen.NextColor(Color.Red, Color.Brown);
120                    //jama.Color = Color.Red;
121                    jama.Hit(maiskeenlento);
122                    Add(jama);
123                }
124            }
125
126            pelaaja.Image = null;
127            pelaaja.Color = Color.Black;
128            pelaaja.Size = new Vector(20, 5);
129            hengissa = false;
130            // TODO: poista kontrollit...
131        }
132    }
133
134    void LisaaPilvet()
135    {
136        for (int i = 0; i < 100; i++)
137        {
138            double leveys = RandomGen.NextDouble(100, 600);
139            double korkeus = RandomGen.NextDouble(100, 500);
140            GameObject pilvi = new GameObject(leveys, korkeus, Shapes.Circle);
141            pilvi.X = RandomGen.NextDouble(Level.Left, Level.Right);
142            pilvi.Y = RandomGen.NextDouble(Level.Bottom + 1000, Level.Top);
143            pilvi.Color = Color.White;
144            Add(pilvi);
145        }
146    }
147
148    void LuoMaasto()
149    {
150        GameObject vuori = new GameObject(256, 256);
151        vuori.Image = vuorenKuva;
152        vuori.X = RandomGen.NextDouble(Level.Left + vuori.Width / 2, Level.Right - vuori.Width / 2);
153        vuori.Y = Level.Bottom + vuori.Height / 2 - 100;
154        Add(vuori);
155
156        maasto = PhysicsObject.CreateStaticObject(Level.Width, 1000, Shapes.Rectangle);
157        maasto.KineticFriction = 0.2;
158        maasto.X = 0;
159        maasto.Y = Level.Bottom - maasto.Height / 2;
160        maasto.Color = Color.Green;
161        Add(maasto);
162
163        for (int i = 0; i < 40; i++)
164        {
165            double leveys = RandomGen.NextDouble(40, 60);
166            double korkeus = RandomGen.NextDouble(80, 200);
167            GameObject kuusi = new GameObject(leveys, korkeus);
168            kuusi.Image = kuusenKuva;
169            kuusi.X = RandomGen.NextDouble(Level.Left, Level.Right);
170            kuusi.Y = Level.Bottom + kuusi.Height / 2;
171            Add(kuusi);
172        }
173    }
174
175    void LuoTalo()
176    {
177        LuoKerros( 200, 100, 0, Level.Bottom );
178        LuoKerros( 200, 100, 0, Level.Bottom + 100 );
179        LuoKerros( 200, 100, 0, Level.Bottom + 200 );
180        LuoKerros( 200, 100, 0, Level.Bottom + 300 );
181        LuoKerros( 200, 100, 0, Level.Bottom + 400 );
182    }
183
184    void LuoKerros(double leveys, double korkeus, double x, double y)
185    {
186        double left = x - leveys / 2;
187        double right = x + leveys / 2;
188        double katonPaksuus = 20;
189
190        GameObject takaSeina = new GameObject(leveys, korkeus);
191        takaSeina.Image = seinanKuva;
192        takaSeina.X = x;
193        takaSeina.Y = y + korkeus / 2;
194        takaSeina.TextureWrapSize = new Vector(leveys / 64, korkeus / 64);
195        Add(takaSeina);
196
197        PhysicsObject vasenSeina = LuoSeina(20, korkeus - katonPaksuus);
198        vasenSeina.X = left + vasenSeina.Width / 2;
199        vasenSeina.Y = y + vasenSeina.Height / 2;
200
201        PhysicsObject oikeaSeina = LuoSeina(20, korkeus - katonPaksuus);
202        oikeaSeina.X = right - oikeaSeina.Width / 2;
203        oikeaSeina.Y = y + oikeaSeina.Height / 2;
204
205        PhysicsObject vasenTukiPalkki = PhysicsObject.CreateStaticObject( 20, 20 );
206        vasenTukiPalkki.X = left + vasenSeina.Width + vasenTukiPalkki.Width / 2;
207        vasenTukiPalkki.Y = y + korkeus - katonPaksuus - vasenTukiPalkki.Height / 2;
208        vasenTukiPalkki.Color = Color.Black;
209        Add( vasenTukiPalkki );
210
211        PhysicsObject oikeaTukiPalkki = PhysicsObject.CreateStaticObject( 20, 20 );
212        oikeaTukiPalkki.X = right - oikeaSeina.Width - oikeaTukiPalkki.Width / 2;
213        oikeaTukiPalkki.Y = y + korkeus - katonPaksuus - oikeaTukiPalkki.Height / 2;
214        oikeaTukiPalkki.Color = Color.Black;
215        Add( oikeaTukiPalkki );
216
217        PhysicsObject katto = LuoKatto( leveys, katonPaksuus );
218        katto.X = x;
219        katto.Y = y + korkeus - katto.Height / 2;
220    }
221
222    PhysicsObject LuoSeina( double leveys, double korkeus)
223    {
224        PhysicsObject seina = PhysicsObject.CreateStaticObject( leveys, korkeus, Shapes.Rectangle, CollisionShapeQuality.FromValue( 0.8 ) );
225        seina.KineticFriction = 0.0;
226        seina.Restitution = 0.1;
227        seina.Color = Color.Brown;
228        Add( seina );
229        return seina;
230    }
231
232    PhysicsObject LuoKatto(double leveys, double korkeus)
233    {
234        PhysicsObject parru = new PhysicsObject(leveys, korkeus, Shapes.Rectangle, CollisionShapeQuality.FromValue(0.8));
235        parru.Mass = 500;
236        parru.AngularDamping = 0.95;
237        parru.LinearDamping = 0.95;
238        parru.StaticFriction = 0.0;
239        parru.KineticFriction = 0.0;
240        parru.Restitution = 0.0;
241        parru.Color = Color.Brown;
242        Add(parru);
243        AddCollisionHandler( parru, kattoonOsuu );
244        return parru;
245    }
246
247    void kattoonOsuu( PhysicsObject katto, PhysicsObject toinen )
248    {
249        if ( katto.Width > 50 && Math.Abs(toinen.Velocity.Y) > 100 )
250        {
251            toinen.Velocity = new Vector( toinen.Velocity.X, toinen.Velocity.Y * 0.6 );
252            katto.Destroy();
253
254            PhysicsObject pala1 = LuoKatto( katto.Width * 0.3, katto.Height );
255            pala1.X = katto.X - katto.Width * 0.15;
256            pala1.Y = katto.Y;
257
258            PhysicsObject pala2 = LuoKatto( katto.Width * 0.3, katto.Height );
259            pala2.X = katto.X + katto.Width * 0.15;
260            pala2.Y = katto.Y;
261        }
262    }
263
264    void SuljeLaskuvarjo()
265    {
266        laskuvarjo.Animation.Stop();
267        laskuvarjo.IsVisible = false;
268        pelaaja.Angle = Angle.Zero;
269    }
270
271    void AsetaOhjaimet()
272    {
273        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
274
275        // huijaus
276        Keyboard.Listen(Key.F2, ButtonState.Pressed, PelaajaMaahan, null);
277        Keyboard.Listen(Key.F3, ButtonState.Pressed, pelaajaMatalalle, null);
278
279        Keyboard.Listen(Key.Space, ButtonState.Pressed, AukaiseLaskuvarjo, "Aukaise laskuvarjo");
280        Keyboard.Listen(Key.Left, ButtonState.Down, pelaaja.Walk, null, -KavelyNopeus);
281        Keyboard.Listen(Key.Right, ButtonState.Down, pelaaja.Walk, null, KavelyNopeus);
282        Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
283        Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
284        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, null, 20000.0);
285    }
286
287    void Hyppaa(double voima)
288    {
289        pelaaja.Jump(voima);
290    }
291
292    void PelaajaMaahan()
293    {
294        pelaaja.X = -200;
295        pelaaja.Y = Level.Bottom + pelaaja.Height;
296        pelaaja.StopVertical();
297    }
298
299    void pelaajaMatalalle()
300    {
301        pelaaja.X = 0;
302        pelaaja.Y = Level.Bottom + 1500;
303    }
304
305    void AukaiseLaskuvarjo()
306    {
307        if (!laskuvarjo.IsVisible)
308        {
309            laskuvarjo.IsVisible = true;
310            laskuvarjo.Animation.Start(1);
311        }
312    }
313
314    protected override void Update(Time time)
315    {
316        if (laskuvarjo.IsVisible)
317        {
318            Vector nostoVoima = new Vector(0, 32000);
319            pelaaja.Push(nostoVoima);
320
321            Angle asteitaSekunnissa = Angle.Degrees(5);
322            pelaaja.Angle += keinumisSuunta * asteitaSekunnissa * time.SinceLastUpdate.TotalSeconds;
323
324            if (pelaaja.Angle.Degree > 10)
325            {
326                keinumisSuunta = -1.0;
327            }
328            else if (pelaaja.Angle.Degree < -5)
329            {
330                keinumisSuunta = 1.0;
331            }
332        }
333
334        base.Update(time);
335    }
336}
Note: See TracBrowser for help on using the repository browser.