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

Revision 1556, 15.0 KB checked in by tekrjant, 10 years ago (diff)

Miekka jonka voi kerätä.

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