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

Revision 957, 10.8 KB checked in by tekrjant, 9 years ago (diff)

Pelaaja ei voi liikkua kun kuolee.

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