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

Revision 920, 9.6 KB checked in by tekrjant, 10 years ago (diff)

Talo joka ei pysy pystyssä.

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    double keinumisSuunta = 1.0;
20
21    protected override void Begin()
22    {
23        LataaKuvat();
24
25        Gravity = new Vector(0, -500);
26
27        Level.Width = 3000;
28        Level.Height = 10000;
29        Level.BackgroundColor = Color.LightBlue;
30
31        PhysicsObject leftBorder = Level.CreateLeftBorder();
32        PhysicsObject rightBorder = Level.CreateRightBorder();
33        leftBorder.IsVisible = false;
34        rightBorder.IsVisible = false;
35
36        LuoMaasto();
37        LuoTalot();
38        LisaaPilvet();
39
40        pelaaja = new PlatformCharacter(20, 30);
41        pelaaja.CanMoveOnAir = false;
42        pelaaja.Mass = 80;
43        pelaaja.Image = LoadImage("hahmo");
44        pelaaja.Color = Color.Black;
45        pelaaja.LinearDamping = 0.99;
46        pelaaja.X = 0;
47        pelaaja.Y = Level.Top - 100;
48        Add(pelaaja);
49
50        AddCollisionHandler(pelaaja, PelaajaOsuu);
51
52        laskuvarjo = new GameObject(50, 50);
53        laskuvarjo.IsVisible = false;
54        laskuvarjo.X = 0;
55        laskuvarjo.Y = 20;
56        laskuvarjo.Animation = new Animation(laskuvarjonKuvat);
57        laskuvarjo.Animation.StopOnLastFrame = true;
58        pelaaja.Add(laskuvarjo);
59
60        Camera.Follow(pelaaja);
61
62        Timer korkeusAjastin = new Timer();
63        korkeusAjastin.Interval = 1;
64        korkeusAjastin.Trigger += NaytaKorkeus;
65        Add(korkeusAjastin);
66        korkeusAjastin.Start();
67
68        AsetaOhjaimet();
69    }
70
71    void LataaKuvat()
72    {
73        kuusenKuva = LoadImage("kuusi");
74        vuorenKuva = LoadImage("vuori");
75        seinanKuva = LoadImage("seina");
76        laskuvarjonKuvat = LoadImages(
77            "laskuvarjo1",
78            "laskuvarjo2",
79            "laskuvarjo3",
80            "laskuvarjo4",
81            "laskuvarjo5",
82            "laskuvarjo6",
83            "laskuvarjo7"
84            );
85    }
86
87    void NaytaKorkeus(Timer sender)
88    {
89        double korkeus = pelaaja.Y - Level.Bottom;
90        MessageDisplay.Add("Korkeus: " + korkeus.ToString("F0"));
91
92        if (korkeus < 100)
93        {
94            sender.Stop();
95        }
96    }
97
98    void PelaajaOsuu(PhysicsObject pelaaja, PhysicsObject toinen)
99    {
100        if (toinen == maasto)
101        {
102            SuljeLaskuvarjo();
103
104            MessageDisplay.Add("nopeus: " + pelaaja.Velocity.Y);
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                //   Vector maiskeenlento = new Vector();
126
127
128
129
130                pelaaja.Image = null;
131                pelaaja.Color = Color.Black;
132                pelaaja.Size = new Vector(20, 5);
133            }
134        }
135    }
136
137    void LisaaPilvet()
138    {
139        for (int i = 0; i < 100; i++)
140        {
141            double leveys = RandomGen.NextDouble(100, 600);
142            double korkeus = RandomGen.NextDouble(100, 500);
143            GameObject pilvi = new GameObject(leveys, korkeus, Shapes.Circle);
144            pilvi.X = RandomGen.NextDouble(Level.Left, Level.Right);
145            pilvi.Y = RandomGen.NextDouble(Level.Bottom + 1000, Level.Top);
146            pilvi.Color = Color.White;
147            Add(pilvi);
148        }
149    }
150
151    void LuoMaasto()
152    {
153        GameObject vuori = new GameObject(256, 256);
154        vuori.Image = vuorenKuva;
155        vuori.X = RandomGen.NextDouble(Level.Left + vuori.Width / 2, Level.Right - vuori.Width / 2);
156        vuori.Y = Level.Bottom + vuori.Height / 2 - 100;
157        Add(vuori);
158
159        maasto = PhysicsObject.CreateStaticObject(Level.Width, 1000, Shapes.Rectangle);
160        maasto.KineticFriction = 0.2;
161        maasto.X = 0;
162        maasto.Y = Level.Bottom - maasto.Height / 2;
163        maasto.Color = Color.Green;
164        Add(maasto);
165
166        for (int i = 0; i < 40; i++)
167        {
168            double leveys = RandomGen.NextDouble(40, 60);
169            double korkeus = RandomGen.NextDouble(80, 200);
170            GameObject kuusi = new GameObject(leveys, korkeus);
171            kuusi.Image = kuusenKuva;
172            kuusi.X = RandomGen.NextDouble(Level.Left, Level.Right);
173            kuusi.Y = Level.Bottom + kuusi.Height / 2;
174            Add(kuusi);
175        }
176    }
177
178    void LuoTalot()
179    {
180        LuoTalo(200, 100, 0);
181    }
182
183    void LuoTalo(double leveys, double korkeus, double x)
184    {
185        double left = x - leveys / 2;
186        double right = x + leveys / 2;
187        double kattoParrunPaksuus = 20;
188
189        // seinän tekstuuri...
190        GameObject seina = new GameObject(leveys, korkeus);
191        seina.Image = seinanKuva;
192        seina.X = x;
193        seina.Y = Level.Bottom + korkeus / 2;
194        seina.TextureWrapSize = new Vector(leveys / 64, korkeus / 64);
195        Add(seina);
196
197        PhysicsObject vasenSeina = new PhysicsObject(20, korkeus - kattoParrunPaksuus / 2);
198        vasenSeina.Mass = 1000;
199        vasenSeina.KineticFriction = 0.0;
200        vasenSeina.Restitution = 0.0;
201        vasenSeina.Color = Color.Brown;
202        vasenSeina.X = left + vasenSeina.Width / 2;
203        vasenSeina.Y = Level.Bottom + vasenSeina.Height / 2;
204        Add(vasenSeina);
205
206        PhysicsObject oikeaSeina = new PhysicsObject(20, korkeus - kattoParrunPaksuus / 2);
207        oikeaSeina.Mass = 1000;
208        oikeaSeina.KineticFriction = 0.0;
209        oikeaSeina.Restitution = 0.0;
210        oikeaSeina.Color = Color.Brown;
211        oikeaSeina.X = right - oikeaSeina.Width / 2;
212        oikeaSeina.Y = Level.Bottom + oikeaSeina.Height / 2;
213        Add(oikeaSeina);
214
215        PhysicsObject keskiParru = new PhysicsObject(20, korkeus - kattoParrunPaksuus / 2);
216        keskiParru.Mass = 100;
217        keskiParru.KineticFriction = 0.0;
218        keskiParru.Restitution = 0.0;
219        keskiParru.Color = Color.Brown;
220        keskiParru.X = x;
221        keskiParru.Y = Level.Bottom + keskiParru.Height / 2;
222        Add(keskiParru);
223
224        PhysicsObject kattoParru1 = new PhysicsObject(leveys / 2, kattoParrunPaksuus);
225        kattoParru1.Mass = 300;
226        kattoParru1.KineticFriction = 0.0;
227        kattoParru1.Restitution = 0.0;
228        kattoParru1.Color = Color.Brown;
229        kattoParru1.X = x - leveys / 4;
230        kattoParru1.Y = Level.Bottom + korkeus;
231        Add(kattoParru1);
232
233        PhysicsObject kattoParru2 = new PhysicsObject(leveys / 2, kattoParrunPaksuus);
234        kattoParru2.Mass = 300;
235        kattoParru1.KineticFriction = 0.0;
236        kattoParru1.Restitution = 0.0;
237        kattoParru2.Color = Color.Brown;
238        kattoParru2.X = x + leveys / 4;
239        kattoParru2.Y = Level.Bottom + korkeus + 10;
240        Add(kattoParru2);
241    }
242
243    void SuljeLaskuvarjo()
244    {
245        laskuvarjo.Animation.Stop();
246        laskuvarjo.IsVisible = false;
247        pelaaja.Angle = Angle.Zero;
248    }
249
250    void AsetaOhjaimet()
251    {
252        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
253
254        // huijaus
255        Keyboard.Listen(Key.F2, ButtonState.Pressed, PelaajaMaahan, null);
256
257        Keyboard.Listen(Key.Space, ButtonState.Pressed, AukaiseLaskuvarjo, "Aukaise laskuvarjo");
258        Keyboard.Listen(Key.Left, ButtonState.Down, pelaaja.Walk, null, -KavelyNopeus);
259        Keyboard.Listen(Key.Right, ButtonState.Down, pelaaja.Walk, null, KavelyNopeus);
260        Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
261        Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
262        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, null, 10000.0);
263    }
264
265    void Hyppaa(double voima)
266    {
267        pelaaja.Jump(voima);
268    }
269
270    void PelaajaMaahan()
271    {
272        pelaaja.X = -200;
273        pelaaja.Y = Level.Bottom + pelaaja.Height;
274        pelaaja.StopVertical();
275    }
276
277    void AukaiseLaskuvarjo()
278    {
279        if (!laskuvarjo.IsVisible)
280        {
281            laskuvarjo.IsVisible = true;
282            laskuvarjo.Animation.Start(1);
283        }
284    }
285
286    protected override void Update(Time time)
287    {
288        if (laskuvarjo.IsVisible)
289        {
290            Vector nostoVoima = new Vector(0, 32000);
291            pelaaja.Push(nostoVoima);
292
293            Angle asteitaSekunnissa = Angle.Degrees(5);
294            pelaaja.Angle += keinumisSuunta * asteitaSekunnissa * time.SinceLastUpdate.TotalSeconds;
295
296            if (pelaaja.Angle.Degree > 10)
297            {
298                keinumisSuunta = -1.0;
299            }
300            else if (pelaaja.Angle.Degree < -5)
301            {
302                keinumisSuunta = 1.0;
303            }
304        }
305
306        base.Update(time);
307    }
308}
Note: See TracBrowser for help on using the repository browser.