source: 2010/30/tekrjant/Seikkailu/Peli.cs @ 1511

Revision 1511, 13.6 KB checked in by tekrjant, 10 years ago (diff)

Energia-sauva!

Line 
1#region MIT License
2/*
3 * Copyright (c) 2010 Tero Jäntti.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 * THE SOFTWARE.
22 */
23#endregion
24
25using System;
26using System.Collections.Generic;
27using Jypeli;
28using Jypeli.Widgets;
29using Jypeli.Effects;
30
31
32public class Peli : PhysicsGame
33{
34    const double PelaajanNopeus = 2.0;
35    const double PelaajanKulmanopeus = 3.0;
36
37    EsineRuutu esineRuutu;
38    EsineValikko esineValikko;
39
40    PhysicsObject pelaaja;
41    Esine viimeksiKoskettuEsine;
42
43    Image[] ottiaisenKuvat = LoadImages( "ottiainen1", "ottiainen2", "ottiainen3", "ottiainen4" );
44    Image[] ottiaisenSyomisKuvat = LoadImages(
45        "ottiainen_syo1", "ottiainen_syo2", "ottiainen_syo3", "ottiainen_syo4",
46        "ottiainen_syo5", "ottiainen_syo6", "ottiainen_syo7", "ottiainen_syo8" );
47    Image ottiainenPalanutKuva = LoadImage( "ottiainen_palanut" );
48    Image liekinKuva = LoadImage( "liekki" );
49    Image ruohoTekstuuri = LoadImage( "ruoho" );
50    Image lyhdynKuva = LoadImage( "lyhty" );
51    Image timantinKuva = LoadImage( "timantti" );
52    Image taikasauvanKuva = LoadImage( "taikasauva" );
53    Image taikasauva2Kuva = LoadImage( "taikasauva2" );
54    Image[] energiaKuvat = LoadImages( "energia1", "energia2", "energia3", "energia4" );
55
56    Lieska tuliJaLeimaus;
57    Light lyhdynValo;
58
59    Timer lyhtyAjastin;
60
61
62    protected override void Begin()
63    {
64        LuoKentta();
65        LuoHUD();
66        AsetaOhjaimet();
67    }
68
69    void LuoHUD()
70    {
71        esineRuutu = new EsineRuutu( this, 200, 50 );
72        esineRuutu.X = Screen.Center.X + Screen.Width / 4;
73        esineRuutu.Y = Screen.Top - esineRuutu.Height / 2;
74        Add( esineRuutu );
75
76        esineValikko = new EsineValikko( 100, 100 );
77        esineValikko.X = 0;
78        esineValikko.Y = Screen.Bottom + esineValikko.Height / 2;
79        Add( esineValikko );
80    }
81
82    void LuoKentta()
83    {
84        ClearAll();
85        Level.BackgroundColor = Color.DarkGreen;
86        Level.Width = 20;
87        Level.Height = 20;
88
89        Level.AmbientLight = 0.2;
90        lyhdynValo = new Light();
91        lyhdynValo.Intensity = 0.0;
92        Add( lyhdynValo );
93
94        lyhtyAjastin = new Timer();
95        lyhtyAjastin.Interval = 0.1;
96        lyhtyAjastin.Trigger += PaivitaLyhtya;
97
98        double ruohonLeveys = 5;
99        double ruohonKorkeus = 5;
100        int ruohojaVaakasuunnassa = (int)Math.Ceiling( Level.Width / ruohonLeveys );
101        int ruohojaPystysuunnassa = (int)Math.Ceiling( Level.Height / ruohonKorkeus );
102
103        for ( int y = 0; y < ruohojaPystysuunnassa; y++ )
104        {
105            for ( int x = 0; x < ruohojaVaakasuunnassa; x++ )
106            {
107                GameObject ruoho = new GameObject( ruohonLeveys, ruohonKorkeus );
108                ruoho.X = Level.Left + x * ruohonLeveys + ruohonLeveys / 2;
109                ruoho.Y = Level.Bottom + y * ruohonKorkeus + ruohonKorkeus / 2;
110                ruoho.Image = ruohoTekstuuri;
111                Add( ruoho, -2 );
112            }
113        }
114
115        //tuli = new Flames( liekinKuva, 40, Angle.Zero );
116        //tuli.MinScale = 0.03;
117        //tuli.MaxScale = 0.04;
118        //tuli.MinVelocity = 0.01;
119        //tuli.MaxVelocity = 0.1;
120        //tuli.MinAcceleration = 0.1;
121        //tuli.MaxAcceleration = 2;
122        //Add( tuli );
123
124        tuliJaLeimaus = new Lieska( liekinKuva );
125        Add( tuliJaLeimaus );
126
127        PhysicsObject vasenSeina = Level.CreateLeftBorder();
128        PhysicsObject oikeaSeina = Level.CreateRightBorder();
129        PhysicsObject ylaSeina = Level.CreateTopBorder();
130        PhysicsObject alaSeina = Level.CreateBottomBorder();
131
132        PhysicsObject seina = PhysicsObject.CreateStaticObject( 4, 4, Shapes.Rectangle );
133        seina.Color = Color.DarkGray;
134        seina.X = Level.Center.X - Level.Width / 4;
135        seina.Y = Level.Center.Y;
136        Add( seina );
137
138        for ( int i = 0; i < 100; i++ )
139        {
140            PhysicsObject omena = new PhysicsObject( 0.1, 0.1, Shapes.Circle );
141            omena.Tag = "ruoka";
142            omena.IgnoresCollisionResponse = true;
143            omena.X = RandomGen.NextDouble( Level.Left, Level.Right );
144            omena.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
145            omena.Color = Color.Red;
146            Add( omena );
147        }
148
149        Esine taikasauva = new Esine( 0.8, 0.1, Shapes.Rectangle, EsineenTyyppi.TuliSauva );
150        taikasauva.Image = taikasauvanKuva;
151        taikasauva.X = 2;
152        taikasauva.Y = 0;
153        Add( taikasauva, -1 );
154
155        Esine energiaSauva = new Esine( 0.8, 0.1, Shapes.Rectangle, EsineenTyyppi.EnergiaSauva );
156        energiaSauva.Image = taikasauva2Kuva;
157        energiaSauva.X = -1;
158        energiaSauva.Y = -3;
159        Add( energiaSauva, -1 );
160
161        Esine lyhty = new Esine( 0.6, 0.6, Shapes.Circle, EsineenTyyppi.Lyhty );
162        lyhty.Image = lyhdynKuva;
163        lyhty.X = 4;
164        lyhty.Y = -2;
165        Add( lyhty, -1 );
166
167        pelaaja = new PhysicsObject( 0.8, 0.8, Shapes.Circle );
168        pelaaja.Color = Color.Blue;
169        pelaaja.Mass = 80;
170        pelaaja.LinearDamping = 0.96;
171        pelaaja.AngularDamping = 0.96;
172        Add( pelaaja );
173
174        AddCollisionHandler( pelaaja, PelaajaOsuu );
175
176        GameObject suuntaTikku = new GameObject( 0.2, 0.1 );
177        suuntaTikku.Color = Color.Green;
178        suuntaTikku.X = 0.5;
179        pelaaja.Add( suuntaTikku );
180
181        for ( int i = 0; i < 30; i++ )
182        {
183            Otus otti = LuoOttiainen();
184            otti.X = RandomGen.NextDouble( Level.Left + 1, Level.Right - 1 );
185            otti.Y = RandomGen.NextDouble( Level.Bottom + 1, Level.Top - 1 );
186        }
187
188        Esine timantti = new Esine( 0.3, 0.3, Shapes.Circle, EsineenTyyppi.Timantti );
189        timantti.X = RandomGen.NextDouble( Level.Left, Level.Right );
190        timantti.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
191        timantti.Image = timantinKuva;
192        Add( timantti, -1 );
193
194        Camera.StayInLevel = true;
195        Camera.Follow( pelaaja );
196    }
197
198    void PelaajaOsuu( PhysicsObject pelaaja, PhysicsObject kohde )
199    {
200        if ( kohde is Esine )
201        {
202            viimeksiKoskettuEsine = (Esine)kohde;
203            esineRuutu.Nayta( viimeksiKoskettuEsine );
204        }
205    }
206
207    Otus LuoOttiainen()
208    {
209        Otus ottiainen = new Otus( 0.6, 0.6, new Animation( ottiaisenKuvat[0] ) );
210        ottiainen.Mass = 20;
211        ottiainen.LiikkumisAnimaatio = new Animation( ottiaisenKuvat ) { FPS = 5 };
212        ottiainen.HyokkaysAnimaatio = new Animation( ottiaisenSyomisKuvat ) { FPS = 20 };
213        ottiainen.PalanutKuva = ottiainenPalanutKuva;
214        ottiainen.Angle = RandomGen.NextAngle();
215        Add( ottiainen );
216        return ottiainen;
217    }
218
219    void PaivitaLyhtya( Timer ajastin )
220    {
221        lyhdynValo.Position = pelaaja.Position;
222        lyhdynValo.Distance = RandomGen.NextDouble( 28, 32 );
223        lyhdynValo.Intensity = RandomGen.NextDouble( 0.8, 1.0 );
224    }
225
226    protected override void Update( Time time )
227    {
228        base.Update( time );
229    }
230
231    void AsetaOhjaimet()
232    {
233        Keyboard.Listen( Key.Escape, ButtonState.Pressed, Exit, null );
234
235        Keyboard.Listen( Key.Up, ButtonState.Down, Etene, null );
236        Keyboard.Listen( Key.Up, ButtonState.Released, pelaaja.Stop, null );
237
238        Keyboard.Listen( Key.Left, ButtonState.Down, KaannaVasemmalle, null );
239        Keyboard.Listen( Key.Right, ButtonState.Down, KaannaOikealle, null );
240        Keyboard.Listen( Key.Left, ButtonState.Released, EiKaanny, null );
241        Keyboard.Listen( Key.Right, ButtonState.Released, EiKaanny, null );
242
243        Keyboard.Listen( Key.Q, ButtonState.Pressed, esineValikko.Vasemmalle, null );
244        Keyboard.Listen( Key.W, ButtonState.Pressed, esineValikko.Oikealle, null );
245        Keyboard.Listen( Key.Space, ButtonState.Pressed, KaytaValittuaEsinetta, null );
246
247        Keyboard.Listen( Key.P, ButtonState.Pressed, Keraa, null );
248    }
249
250    void KaytaValittuaEsinetta()
251    {
252        Esine valittu = esineValikko.ValittuEsine;
253        if ( valittu == null )
254            return;
255
256        switch ( valittu.Tyyppi )
257        {
258            case EsineenTyyppi.TuliSauva:
259                KaytaTaikaSauvaa();
260                break;
261            case EsineenTyyppi.EnergiaSauva:
262                PhysicsObject energia = new PhysicsObject( 3, 1 );
263                energia.MaximumLifetime = TimeSpan.FromSeconds( 6 );
264                energia.Restitution = 1.5;
265                //energia.IgnoresCollisionResponse = true;
266
267                energia.Animation = new Animation( energiaKuvat );
268                energia.Animation.FPS = 20;
269                energia.Animation.Start();
270
271                Vector suunta = Vector.FromLengthAndAngle( 1, pelaaja.Angle );
272                energia.Position = pelaaja.Position + suunta * 1;
273                energia.Velocity = suunta * 3;
274                energia.Angle = pelaaja.Angle;
275                Add( energia );
276                break;
277            case EsineenTyyppi.Lyhty:
278                KaytaLamppua();
279                break;
280            case EsineenTyyppi.Timantti:
281                break;
282            default:
283                break;
284        }
285    }
286
287    double Etaisyys( Vector p1, Vector p2 )
288    {
289        double dx = p2.X - p1.X;
290        double dy = p2.Y - p1.Y;
291        return Math.Abs( dx * dx + dy * dy );
292    }
293
294    void Keraa()
295    {
296        if ( viimeksiKoskettuEsine == null )
297            return;
298
299        if ( ( Etaisyys( pelaaja.Position, viimeksiKoskettuEsine.Position ) - pelaaja.Width / 2 - viimeksiKoskettuEsine.Width / 2 ) > 0 )
300            return;
301
302        Remove( viimeksiKoskettuEsine );
303        esineValikko.Add( viimeksiKoskettuEsine );
304
305        switch ( viimeksiKoskettuEsine.Tyyppi )
306        {
307            case EsineenTyyppi.TuliSauva:
308                GameObject klooni = new GameObject( viimeksiKoskettuEsine.Width, viimeksiKoskettuEsine.Height );
309                klooni.Image = viimeksiKoskettuEsine.Image;
310                pelaaja.Add( klooni );
311                klooni.X = pelaaja.Width / 2 + klooni.Width / 4;
312                break;
313            case EsineenTyyppi.Lyhty:
314                break;
315            case EsineenTyyppi.Timantti:
316                Level.AmbientLight = 0.8;
317                MessageBox viesti = new MessageBox(
318                    "Peli läpi!", "Löysit timantin, pimeys poistui maasta. Onneksi olkoon!" );
319                Add( viesti );
320                break;
321            default:
322                break;
323        }
324
325        viimeksiKoskettuEsine = null;
326    }
327
328    void KaytaLamppua()
329    {
330        if ( lyhdynValo.Intensity <= 0.1 )
331        {
332           lyhtyAjastin.Start();
333        }
334        else
335        {
336            lyhtyAjastin.Stop();
337            lyhdynValo.Intensity = 0.0;
338        }
339    }
340
341    void KaytaTaikaSauvaa()
342    {
343        Vector paikka = pelaaja.Position + Vector.FromLengthAndAngle( 1, pelaaja.Angle );
344        tuliJaLeimaus.Suunta = pelaaja.Angle;
345        tuliJaLeimaus.AddEffect( paikka.X, paikka.Y, 40 );
346
347        int sateidenMaara = 5;
348        Angle pieninKulma = pelaaja.Angle + Angle.Degrees( -10 );
349        Angle suurinKulma = pelaaja.Angle + Angle.Degrees( 10 );
350        Angle sateidenVali = ( suurinKulma - pieninKulma ) / sateidenMaara;
351
352        for ( int i = 0; i < sateidenMaara; i++ )
353        {
354            Angle kulma = pieninKulma + i * sateidenVali;
355            Vector suuntaVektori = Vector.FromLengthAndAngle( 1, kulma );
356            RaySegment sadeKuvio = new RaySegment( suuntaVektori * 1.0, suuntaVektori, 5 );
357            PhysicsObject liekinSade = new PhysicsObject( sadeKuvio );
358            liekinSade.MaximumLifetime = TimeSpan.FromSeconds( 0.5 );
359            liekinSade.Position = pelaaja.Position;
360            liekinSade.Color = Color.Red;
361            liekinSade.IsVisible = false;
362            Add( liekinSade );
363
364            AddCollisionHandler( liekinSade, LiekkiSadeOsuu );
365        }
366    }
367
368    void LiekkiSadeOsuu( PhysicsObject sade, PhysicsObject kohde )
369    {
370        if ( kohde is Otus && kohde != pelaaja )
371        {
372            sade.Destroy();
373            Otus otus = (Otus)kohde;
374            otus.Liekita();
375        }
376    }
377
378    void Etene()
379    {
380        pelaaja.Velocity = Vector.FromLengthAndAngle( PelaajanNopeus, pelaaja.Angle );
381    }
382
383    void KaannaVasemmalle()
384    {
385        pelaaja.AngularVelocity = PelaajanKulmanopeus;
386    }
387
388    void KaannaOikealle()
389    {
390        pelaaja.AngularVelocity = -PelaajanKulmanopeus;
391    }
392
393    void EiKaanny()
394    {
395        pelaaja.AngularVelocity = 0;
396    }
397}
Note: See TracBrowser for help on using the repository browser.