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

Revision 972, 10.9 KB checked in by tekrjant, 9 years ago (diff)

Ääniefekti.

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