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

Revision 1542, 14.4 KB checked in by tekrjant, 11 years ago (diff)

kaikkea pientä.

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;
30using Physics2DDotNet.Ignorers;
31
32
33public class Peli : PhysicsGame
34{
35    const double PelaajanNopeus = 2.0;
36    const double PelaajanKulmanopeus = 3.0;
37
38    Timer energiaAmpumisAjastin = new Timer() { Interval = 0.1 };
39    ObjectIgnorer energiaIgnorer = new ObjectIgnorer();
40
41    EsineRuutu esineRuutu;
42    EsineValikko esineValikko;
43
44    PhysicsObject pelaaja;
45    Esine viimeksiKoskettuEsine;
46
47    Image[] ottiaisenKuvat = LoadImages( "ottiainen1", "ottiainen2", "ottiainen3", "ottiainen4" );
48    Image[] ottiaisenSyomisKuvat = LoadImages(
49        "ottiainen_syo1", "ottiainen_syo2", "ottiainen_syo3", "ottiainen_syo4",
50        "ottiainen_syo5", "ottiainen_syo6", "ottiainen_syo7", "ottiainen_syo8" );
51    Image ottiainenKuollutKuva = LoadImage( "ottiainen_kuollut" );
52    Image ottiainenPalanutKuva = LoadImage( "ottiainen_palanut" );
53    Image liekinKuva = LoadImage( "liekki" );
54    Image ruohoTekstuuri = LoadImage( "ruoho" );
55    Image lyhdynKuva = LoadImage( "lyhty" );
56    Image timantinKuva = LoadImage( "timantti" );
57    Image taikasauvanKuva = LoadImage( "taikasauva" );
58    Image taikasauva2Kuva = LoadImage( "taikasauva2" );
59    Image[] energiaKuvat = LoadImages( "energia1", "energia2", "energia3", "energia4" );
60
61    Lieska tuliJaLeimaus;
62    Light lyhdynValo;
63
64    Timer lyhtyAjastin;
65
66
67    protected override void Begin()
68    {
69        LuoKentta();
70        LuoHUD();
71        AsetaOhjaimet();
72    }
73
74    void LuoHUD()
75    {
76        esineRuutu = new EsineRuutu( 200, 50 );
77        esineRuutu.X = Screen.Center.X + Screen.Width / 4;
78        esineRuutu.Y = Screen.Top - esineRuutu.Height / 2;
79        Add( esineRuutu );
80
81        esineValikko = new EsineValikko( 100, 100 );
82        esineValikko.X = 0;
83        esineValikko.Y = Screen.Bottom + esineValikko.Height / 2;
84        Add( esineValikko );
85    }
86
87    void LuoKentta()
88    {
89        ClearAll();
90        Level.BackgroundColor = Color.DarkGreen;
91        Level.Width = 20;
92        Level.Height = 20;
93
94        Level.AmbientLight = 0.2;
95        lyhdynValo = new Light();
96        lyhdynValo.Intensity = 0.0;
97        Add( lyhdynValo );
98
99        lyhtyAjastin = new Timer();
100        lyhtyAjastin.Interval = 0.1;
101        lyhtyAjastin.Trigger += PaivitaLyhtya;
102
103        energiaAmpumisAjastin.Trigger += AmmuEnergiaPallo;
104
105        double ruohonLeveys = 5;
106        double ruohonKorkeus = 5;
107        int ruohojaVaakasuunnassa = (int)Math.Ceiling( Level.Width / ruohonLeveys );
108        int ruohojaPystysuunnassa = (int)Math.Ceiling( Level.Height / ruohonKorkeus );
109
110        for ( int y = 0; y < ruohojaPystysuunnassa; y++ )
111        {
112            for ( int x = 0; x < ruohojaVaakasuunnassa; x++ )
113            {
114                GameObject ruoho = new GameObject( ruohonLeveys, ruohonKorkeus );
115                ruoho.X = Level.Left + x * ruohonLeveys + ruohonLeveys / 2;
116                ruoho.Y = Level.Bottom + y * ruohonKorkeus + ruohonKorkeus / 2;
117                ruoho.Image = ruohoTekstuuri;
118                Add( ruoho, -2 );
119            }
120        }
121
122        //tuli = new Flames( liekinKuva, 40, Angle.Zero );
123        //tuli.MinScale = 0.03;
124        //tuli.MaxScale = 0.04;
125        //tuli.MinVelocity = 0.01;
126        //tuli.MaxVelocity = 0.1;
127        //tuli.MinAcceleration = 0.1;
128        //tuli.MaxAcceleration = 2;
129        //Add( tuli );
130
131        tuliJaLeimaus = new Lieska( liekinKuva );
132        Add( tuliJaLeimaus );
133
134        PhysicsObject vasenSeina = Level.CreateLeftBorder();
135        PhysicsObject oikeaSeina = Level.CreateRightBorder();
136        PhysicsObject ylaSeina = Level.CreateTopBorder();
137        PhysicsObject alaSeina = Level.CreateBottomBorder();
138
139        PhysicsObject seina = PhysicsObject.CreateStaticObject( 4, 4, Shapes.Rectangle );
140        seina.Color = Color.DarkGray;
141        seina.X = Level.Center.X - Level.Width / 4;
142        seina.Y = Level.Center.Y;
143        Add( seina );
144
145        for ( int i = 0; i < 100; i++ )
146        {
147            PhysicsObject omena = new PhysicsObject( 0.1, 0.1, Shapes.Circle );
148            omena.Tag = "ruoka";
149            omena.IgnoresCollisionResponse = true;
150            omena.X = RandomGen.NextDouble( Level.Left, Level.Right );
151            omena.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
152            omena.Color = Color.Red;
153            Add( omena );
154        }
155
156        Esine taikasauva = new Esine( 0.8, 0.1, Shapes.Rectangle, EsineenTyyppi.TuliSauva );
157        taikasauva.Image = taikasauvanKuva;
158        taikasauva.X = 2;
159        taikasauva.Y = 0;
160        Add( taikasauva, -1 );
161
162        Esine energiaSauva = new Esine( 0.8, 0.1, Shapes.Rectangle, EsineenTyyppi.EnergiaSauva );
163        energiaSauva.Image = taikasauva2Kuva;
164        energiaSauva.X = -1;
165        energiaSauva.Y = -1;
166        Add( energiaSauva, -1 );
167
168        Esine lyhty = new Esine( 0.6, 0.6, Shapes.Circle, EsineenTyyppi.Lyhty );
169        lyhty.Image = lyhdynKuva;
170        lyhty.X = 2;
171        lyhty.Y = -1;
172        Add( lyhty, -1 );
173
174        pelaaja = new PhysicsObject( 0.8, 0.8, Shapes.Circle );
175        pelaaja.Color = Color.Blue;
176        pelaaja.Mass = 80;
177        pelaaja.LinearDamping = 0.96;
178        pelaaja.AngularDamping = 0.96;
179        Add( pelaaja );
180
181        AddCollisionHandler( pelaaja, PelaajaOsuu );
182
183        GameObject suuntaTikku = new GameObject( 0.2, 0.1 );
184        suuntaTikku.Color = Color.Green;
185        suuntaTikku.X = 0.5;
186        pelaaja.Add( suuntaTikku );
187
188        for ( int i = 0; i < 30; i++ )
189        {
190            Otus otti = LuoOttiainen();
191            otti.X = RandomGen.NextDouble( Level.Left + 1, Level.Right - 1 );
192            otti.Y = RandomGen.NextDouble( Level.Bottom + 1, Level.Top - 1 );
193        }
194
195        Esine timantti = new Esine( 0.3, 0.3, Shapes.Circle, EsineenTyyppi.Timantti );
196        timantti.X = RandomGen.NextDouble( Level.Left, Level.Right );
197        timantti.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
198        timantti.Image = timantinKuva;
199        Add( timantti, -1 );
200
201        Camera.StayInLevel = true;
202        Camera.Follow( pelaaja );
203    }
204
205    void PelaajaOsuu( PhysicsObject pelaaja, PhysicsObject kohde )
206    {
207        if ( kohde is Esine )
208        {
209            viimeksiKoskettuEsine = (Esine)kohde;
210            esineRuutu.Nayta( viimeksiKoskettuEsine );
211        }
212    }
213
214    Otus LuoOttiainen()
215    {
216        Otus ottiainen = new Otus( 0.6, 0.6, new Animation( ottiaisenKuvat[0] ) );
217        ottiainen.Mass = 20;
218        ottiainen.LiikkumisAnimaatio = new Animation( ottiaisenKuvat ) { FPS = 5 };
219        ottiainen.HyokkaysAnimaatio = new Animation( ottiaisenSyomisKuvat ) { FPS = 20 };
220        ottiainen.KuollutKuva = ottiainenKuollutKuva;
221        ottiainen.PalanutKuva = ottiainenPalanutKuva;
222        ottiainen.Angle = RandomGen.NextAngle();
223        Add( ottiainen );
224        return ottiainen;
225    }
226
227    void PaivitaLyhtya( Timer ajastin )
228    {
229        lyhdynValo.Position = pelaaja.Position;
230        lyhdynValo.Distance = RandomGen.NextDouble( 28, 32 );
231        lyhdynValo.Intensity = RandomGen.NextDouble( 0.8, 1.0 );
232    }
233
234    protected override void Update( Time time )
235    {
236        base.Update( time );
237    }
238
239    void AsetaOhjaimet()
240    {
241        Keyboard.Listen( Key.Escape, ButtonState.Pressed, Exit, null );
242
243        Keyboard.Listen( Key.Up, ButtonState.Down, Etene, null );
244        Keyboard.Listen( Key.Up, ButtonState.Released, pelaaja.Stop, null );
245
246        Keyboard.Listen( Key.Left, ButtonState.Down, KaannaVasemmalle, null );
247        Keyboard.Listen( Key.Right, ButtonState.Down, KaannaOikealle, null );
248        Keyboard.Listen( Key.Left, ButtonState.Released, EiKaanny, null );
249        Keyboard.Listen( Key.Right, ButtonState.Released, EiKaanny, null );
250
251        Keyboard.Listen( Key.Q, ButtonState.Pressed, esineValikko.Vasemmalle, null );
252        Keyboard.Listen( Key.W, ButtonState.Pressed, esineValikko.Oikealle, null );
253        Keyboard.Listen( Key.Space, ButtonState.Pressed, KaytaValittuaEsinetta, null );
254
255        Keyboard.Listen( Key.P, ButtonState.Pressed, Keraa, null );
256    }
257
258    void KaytaValittuaEsinetta()
259    {
260        Esine valittu = esineValikko.ValittuEsine;
261        if ( valittu == null )
262            return;
263
264        switch ( valittu.Tyyppi )
265        {
266            case EsineenTyyppi.TuliSauva:
267                KaytaTaikaSauvaa();
268                break;
269            case EsineenTyyppi.EnergiaSauva:
270                energiaAmpumisAjastin.Start( 5 );
271                break;
272            case EsineenTyyppi.Lyhty:
273                KaytaLamppua();
274                break;
275            case EsineenTyyppi.Timantti:
276                break;
277            default:
278                break;
279        }
280    }
281
282    void AmmuEnergiaPallo( Timer ajastin )
283    {
284        PhysicsObject energia = new PhysicsObject( 1, 1, Shapes.Circle );
285        energia.MaximumLifetime = TimeSpan.FromSeconds( 6 );
286        energia.Restitution = 1.5;
287        energia.CollisionIgnorer = energiaIgnorer;
288        AddCollisionHandler( energia, EnergiaPalloOsuu );
289
290        energia.Animation = new Animation( energiaKuvat );
291        energia.Animation.FPS = 20;
292        energia.Animation.Start();
293
294        Angle kulmanVaihtelu = RandomGen.NextAngle( Angle.Degrees( -5 ), Angle.Degrees( 5 ) );
295        Vector suunta = Vector.FromLengthAndAngle( 1, pelaaja.Angle + kulmanVaihtelu );
296        energia.Position = pelaaja.Position + suunta * 1;
297        energia.Velocity = suunta * 3;
298        energia.Angle = pelaaja.Angle;
299        Add( energia );
300    }
301
302    void EnergiaPalloOsuu( PhysicsObject energia, PhysicsObject kohde )
303    {
304        if ( kohde is Otus )
305        {
306            Otus otus = (Otus)kohde;
307            // TODO: efekti.
308            otus.TeeVahinkoa( 2 );
309        }
310    }
311
312    double Etaisyys( Vector p1, Vector p2 )
313    {
314        double dx = p2.X - p1.X;
315        double dy = p2.Y - p1.Y;
316        return Math.Abs( dx * dx + dy * dy );
317    }
318
319    void Keraa()
320    {
321        if ( viimeksiKoskettuEsine == null )
322            return;
323
324        if ( ( Etaisyys( pelaaja.Position, viimeksiKoskettuEsine.Position ) - pelaaja.Width / 2 - viimeksiKoskettuEsine.Width / 2 ) > 0 )
325            return;
326
327        Remove( viimeksiKoskettuEsine );
328        esineValikko.Add( viimeksiKoskettuEsine );
329
330        switch ( viimeksiKoskettuEsine.Tyyppi )
331        {
332            case EsineenTyyppi.TuliSauva:
333                GameObject klooni = new GameObject( viimeksiKoskettuEsine.Width, viimeksiKoskettuEsine.Height );
334                klooni.Image = viimeksiKoskettuEsine.Image;
335                pelaaja.Add( klooni );
336                klooni.X = pelaaja.Width / 2 + klooni.Width / 4;
337                break;
338            case EsineenTyyppi.Lyhty:
339                break;
340            case EsineenTyyppi.Timantti:
341                Level.AmbientLight = 0.8;
342                MessageBox viesti = new MessageBox(
343                    "Peli läpi!", "Löysit timantin, pimeys poistui maasta. Onneksi olkoon!" );
344                Add( viesti );
345                break;
346            default:
347                break;
348        }
349
350        viimeksiKoskettuEsine = null;
351    }
352
353    void KaytaLamppua()
354    {
355        if ( lyhdynValo.Intensity <= 0.1 )
356        {
357           lyhtyAjastin.Start();
358        }
359        else
360        {
361            lyhtyAjastin.Stop();
362            lyhdynValo.Intensity = 0.0;
363        }
364    }
365
366    void KaytaTaikaSauvaa()
367    {
368        Vector paikka = pelaaja.Position + Vector.FromLengthAndAngle( 1, pelaaja.Angle );
369        tuliJaLeimaus.Suunta = pelaaja.Angle;
370        tuliJaLeimaus.AddEffect( paikka.X, paikka.Y, 40 );
371
372        int sateidenMaara = 5;
373        Angle pieninKulma = pelaaja.Angle + Angle.Degrees( -10 );
374        Angle suurinKulma = pelaaja.Angle + Angle.Degrees( 10 );
375        Angle sateidenVali = ( suurinKulma - pieninKulma ) / sateidenMaara;
376
377        for ( int i = 0; i < sateidenMaara; i++ )
378        {
379            Angle kulma = pieninKulma + i * sateidenVali;
380            Vector suuntaVektori = Vector.FromLengthAndAngle( 1, kulma );
381            RaySegment sadeKuvio = new RaySegment( suuntaVektori * 1.0, suuntaVektori, 5 );
382            PhysicsObject liekinSade = new PhysicsObject( sadeKuvio );
383            liekinSade.MaximumLifetime = TimeSpan.FromSeconds( 0.5 );
384            liekinSade.Position = pelaaja.Position;
385            liekinSade.Color = Color.Red;
386            liekinSade.IsVisible = false;
387            Add( liekinSade );
388
389            AddCollisionHandler( liekinSade, LiekkiSadeOsuu );
390        }
391    }
392
393    void LiekkiSadeOsuu( PhysicsObject sade, PhysicsObject kohde )
394    {
395        if ( kohde is Otus && kohde != pelaaja )
396        {
397            sade.Destroy();
398            Otus otus = (Otus)kohde;
399            otus.Liekita();
400        }
401    }
402
403    void Etene()
404    {
405        pelaaja.Velocity = Vector.FromLengthAndAngle( PelaajanNopeus, pelaaja.Angle );
406    }
407
408    void KaannaVasemmalle()
409    {
410        pelaaja.AngularVelocity = PelaajanKulmanopeus;
411    }
412
413    void KaannaOikealle()
414    {
415        pelaaja.AngularVelocity = -PelaajanKulmanopeus;
416    }
417
418    void EiKaanny()
419    {
420        pelaaja.AngularVelocity = 0;
421    }
422}
Note: See TracBrowser for help on using the repository browser.