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

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

Talo pysyy 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        GameObject seina = new GameObject(leveys, korkeus);
190        seina.Image = seinanKuva;
191        seina.X = x;
192        seina.Y = Level.Bottom + korkeus / 2;
193        seina.TextureWrapSize = new Vector(leveys / 64, korkeus / 64);
194        Add(seina);
195
196        PhysicsObject vasenSeina = LuoParru(20, korkeus - kattoParrunPaksuus / 2);
197        vasenSeina.X = left + vasenSeina.Width / 2;
198        vasenSeina.Y = Level.Bottom + vasenSeina.Height / 2;
199
200        PhysicsObject oikeaSeina = LuoParru(20, korkeus - kattoParrunPaksuus / 2);
201        oikeaSeina.X = right - oikeaSeina.Width / 2;
202        oikeaSeina.Y = Level.Bottom + oikeaSeina.Height / 2;
203
204        PhysicsObject keskiParru = LuoParru(30, korkeus - kattoParrunPaksuus / 2);
205        keskiParru.X = x;
206        keskiParru.Y = Level.Bottom + keskiParru.Height / 2;
207
208        PhysicsObject kattoParru1 = LuoParru(leveys / 2, kattoParrunPaksuus);
209        kattoParru1.X = x - leveys / 4;
210        kattoParru1.Y = Level.Bottom + korkeus;
211
212        PhysicsObject kattoParru2 = LuoParru(leveys / 2, kattoParrunPaksuus);
213        kattoParru2.X = x + leveys / 4;
214        kattoParru2.Y = Level.Bottom + korkeus + 10;
215    }
216
217    PhysicsObject LuoParru(double leveys, double korkeus)
218    {
219        PhysicsObject parru = new PhysicsObject(leveys, korkeus);
220        parru.Mass = 500;
221        parru.AngularDamping = 0.95;
222        parru.LinearDamping = 0.95;
223        parru.StaticFriction = 0.0;
224        parru.KineticFriction = 0.0;
225        parru.Restitution = 0.0;
226        parru.Color = Color.Brown;
227        Add(parru);
228        return parru;
229    }
230
231    void SuljeLaskuvarjo()
232    {
233        laskuvarjo.Animation.Stop();
234        laskuvarjo.IsVisible = false;
235        pelaaja.Angle = Angle.Zero;
236    }
237
238    void AsetaOhjaimet()
239    {
240        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
241
242        // huijaus
243        Keyboard.Listen(Key.F2, ButtonState.Pressed, PelaajaMaahan, null);
244
245        Keyboard.Listen(Key.Space, ButtonState.Pressed, AukaiseLaskuvarjo, "Aukaise laskuvarjo");
246        Keyboard.Listen(Key.Left, ButtonState.Down, pelaaja.Walk, null, -KavelyNopeus);
247        Keyboard.Listen(Key.Right, ButtonState.Down, pelaaja.Walk, null, KavelyNopeus);
248        Keyboard.Listen(Key.Left, ButtonState.Released, pelaaja.StopHorizontal, null);
249        Keyboard.Listen(Key.Right, ButtonState.Released, pelaaja.StopHorizontal, null);
250        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, null, 10000.0);
251    }
252
253    void Hyppaa(double voima)
254    {
255        pelaaja.Jump(voima);
256    }
257
258    void PelaajaMaahan()
259    {
260        pelaaja.X = -200;
261        pelaaja.Y = Level.Bottom + pelaaja.Height;
262        pelaaja.StopVertical();
263    }
264
265    void AukaiseLaskuvarjo()
266    {
267        if (!laskuvarjo.IsVisible)
268        {
269            laskuvarjo.IsVisible = true;
270            laskuvarjo.Animation.Start(1);
271        }
272    }
273
274    protected override void Update(Time time)
275    {
276        if (laskuvarjo.IsVisible)
277        {
278            Vector nostoVoima = new Vector(0, 32000);
279            pelaaja.Push(nostoVoima);
280
281            Angle asteitaSekunnissa = Angle.Degrees(5);
282            pelaaja.Angle += keinumisSuunta * asteitaSekunnissa * time.SinceLastUpdate.TotalSeconds;
283
284            if (pelaaja.Angle.Degree > 10)
285            {
286                keinumisSuunta = -1.0;
287            }
288            else if (pelaaja.Angle.Degree < -5)
289            {
290                keinumisSuunta = 1.0;
291            }
292        }
293
294        base.Update(time);
295    }
296}
Note: See TracBrowser for help on using the repository browser.