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

Revision 925, 9.1 KB checked in by tekrjant, 10 years ago (diff)

Pikku viilausta.

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        LuoTalot();
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        Add(pelaaja);
51
52        AddCollisionHandler(pelaaja, PelaajaOsuu);
53
54        laskuvarjo = new GameObject(50, 50);
55        laskuvarjo.IsVisible = false;
56        laskuvarjo.X = 0;
57        laskuvarjo.Y = 20;
58        laskuvarjo.Animation = new Animation(laskuvarjonKuvat);
59        laskuvarjo.Animation.StopOnLastFrame = true;
60        pelaaja.Add(laskuvarjo);
61
62        Camera.Follow(pelaaja);
63
64        Timer korkeusAjastin = new Timer();
65        korkeusAjastin.Interval = 1;
66        korkeusAjastin.Trigger += NaytaKorkeus;
67        Add(korkeusAjastin);
68        korkeusAjastin.Start();
69
70        AsetaOhjaimet();
71    }
72
73    void LataaKuvat()
74    {
75        kuusenKuva = LoadImage("kuusi");
76        vuorenKuva = LoadImage("vuori");
77        seinanKuva = LoadImage("seina");
78        laskuvarjonKuvat = LoadImages(
79            "laskuvarjo1",
80            "laskuvarjo2",
81            "laskuvarjo3",
82            "laskuvarjo4",
83            "laskuvarjo5",
84            "laskuvarjo6",
85            "laskuvarjo7"
86            );
87    }
88
89    void NaytaKorkeus(Timer sender)
90    {
91        double korkeus = pelaaja.Y - Level.Bottom;
92        MessageDisplay.Add("Korkeus: " + korkeus.ToString("F0"));
93
94        if (korkeus < 100)
95        {
96            sender.Stop();
97        }
98    }
99
100    void PelaajaOsuu(PhysicsObject pelaaja, PhysicsObject toinen)
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
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 LuoTalot()
176    {
177        LuoTalo(200, 100, 0);
178    }
179
180    void LuoTalo(double leveys, double korkeus, double x)
181    {
182        double left = x - leveys / 2;
183        double right = x + leveys / 2;
184        double kattoParrunPaksuus = 20;
185
186        GameObject seina = new GameObject(leveys, korkeus);
187        seina.Image = seinanKuva;
188        seina.X = x;
189        seina.Y = Level.Bottom + korkeus / 2;
190        seina.TextureWrapSize = new Vector(leveys / 64, korkeus / 64);
191        Add(seina);
192
193        PhysicsObject vasenSeina = LuoParru(20, korkeus - kattoParrunPaksuus / 2);
194        vasenSeina.X = left + vasenSeina.Width / 2;
195        vasenSeina.Y = Level.Bottom + vasenSeina.Height / 2;
196
197        PhysicsObject oikeaSeina = LuoParru(20, korkeus - kattoParrunPaksuus / 2);
198        oikeaSeina.X = right - oikeaSeina.Width / 2;
199        oikeaSeina.Y = Level.Bottom + oikeaSeina.Height / 2;
200
201        PhysicsObject keskiParru = LuoParru(30, korkeus - kattoParrunPaksuus / 2);
202        keskiParru.X = x;
203        keskiParru.Y = Level.Bottom + keskiParru.Height / 2;
204
205        PhysicsObject kattoParru1 = LuoParru(leveys / 2, kattoParrunPaksuus);
206        kattoParru1.X = x - leveys / 4;
207        kattoParru1.Y = Level.Bottom + korkeus;
208
209        PhysicsObject kattoParru2 = LuoParru(leveys / 2, kattoParrunPaksuus);
210        kattoParru2.X = x + leveys / 4;
211        kattoParru2.Y = Level.Bottom + korkeus + 10;
212    }
213
214    PhysicsObject LuoParru(double leveys, double korkeus)
215    {
216        PhysicsObject parru = new PhysicsObject(leveys, korkeus);
217        parru.Mass = 500;
218        parru.AngularDamping = 0.95;
219        parru.LinearDamping = 0.95;
220        parru.StaticFriction = 0.0;
221        parru.KineticFriction = 0.0;
222        parru.Restitution = 0.0;
223        parru.Color = Color.Brown;
224        Add(parru);
225        return parru;
226    }
227
228    void SuljeLaskuvarjo()
229    {
230        laskuvarjo.Animation.Stop();
231        laskuvarjo.IsVisible = false;
232        pelaaja.Angle = Angle.Zero;
233    }
234
235    void AsetaOhjaimet()
236    {
237        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
238
239        // huijaus
240        Keyboard.Listen(Key.F2, ButtonState.Pressed, PelaajaMaahan, null);
241        Keyboard.Listen(Key.F3, ButtonState.Pressed, pelaajaMatalalle, null);
242
243        Keyboard.Listen(Key.Space, ButtonState.Pressed, AukaiseLaskuvarjo, "Aukaise laskuvarjo");
244        Keyboard.Listen(Key.Left, ButtonState.Down, pelaaja.Walk, null, -KavelyNopeus);
245        Keyboard.Listen(Key.Right, ButtonState.Down, pelaaja.Walk, null, KavelyNopeus);
246        Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
247        Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
248        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, null, 10000.0);
249    }
250
251    void Hyppaa(double voima)
252    {
253        pelaaja.Jump(voima);
254    }
255
256    void PelaajaMaahan()
257    {
258        pelaaja.X = -200;
259        pelaaja.Y = Level.Bottom + pelaaja.Height;
260        pelaaja.StopVertical();
261    }
262
263    void pelaajaMatalalle()
264    {
265        pelaaja.Y = Level.Bottom + 1500;
266    }
267
268    void AukaiseLaskuvarjo()
269    {
270        if (!laskuvarjo.IsVisible)
271        {
272            laskuvarjo.IsVisible = true;
273            laskuvarjo.Animation.Start(1);
274        }
275    }
276
277    protected override void Update(Time time)
278    {
279        if (laskuvarjo.IsVisible)
280        {
281            Vector nostoVoima = new Vector(0, 32000);
282            pelaaja.Push(nostoVoima);
283
284            Angle asteitaSekunnissa = Angle.Degrees(5);
285            pelaaja.Angle += keinumisSuunta * asteitaSekunnissa * time.SinceLastUpdate.TotalSeconds;
286
287            if (pelaaja.Angle.Degree > 10)
288            {
289                keinumisSuunta = -1.0;
290            }
291            else if (pelaaja.Angle.Degree < -5)
292            {
293                keinumisSuunta = 1.0;
294            }
295        }
296
297        base.Update(time);
298    }
299}
Note: See TracBrowser for help on using the repository browser.