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

Revision 1346, 12.1 KB checked in by tekrjant, 10 years ago (diff)

Esine-valikko.

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
53    Lieska tuliJaLeimaus;
54    Light lyhdynValo;
55
56    protected override void Begin()
57    {
58        LuoKentta();
59        LuoHUD();
60        AsetaOhjaimet();
61    }
62
63    void LuoHUD()
64    {
65        esineRuutu = new EsineRuutu( this, 200, 50 );
66        esineRuutu.X = Screen.Center.X + Screen.Width / 4;
67        esineRuutu.Y = Screen.Top - esineRuutu.Height / 2;
68        Add( esineRuutu );
69
70        esineValikko = new EsineValikko( 100, 100 );
71        esineValikko.X = 0;
72        esineValikko.Y = Screen.Bottom + esineValikko.Height / 2;
73        Add( esineValikko );
74    }
75
76    void LuoKentta()
77    {
78        ClearAll();
79        Level.BackgroundColor = Color.DarkGreen;
80        Level.Width = 20;
81        Level.Height = 20;
82
83        Level.AmbientLight = 0.2;
84        lyhdynValo = new Light();
85        lyhdynValo.Intensity = 0.0;
86        lyhdynValo.Distance = 30.0;
87        Add( lyhdynValo );
88
89        double ruohonLeveys = 5;
90        double ruohonKorkeus = 5;
91        int ruohojaVaakasuunnassa = (int)Math.Ceiling( Level.Width / ruohonLeveys );
92        int ruohojaPystysuunnassa = (int)Math.Ceiling( Level.Height / ruohonKorkeus );
93
94        for ( int y = 0; y < ruohojaPystysuunnassa; y++ )
95        {
96            for ( int x = 0; x < ruohojaVaakasuunnassa; x++ )
97            {
98                GameObject ruoho = new GameObject( ruohonLeveys, ruohonKorkeus );
99                ruoho.X = Level.Left + x * ruohonLeveys + ruohonLeveys / 2;
100                ruoho.Y = Level.Bottom + y * ruohonKorkeus + ruohonKorkeus / 2;
101                ruoho.Image = ruohoTekstuuri;
102                Add( ruoho, -2 );
103            }
104        }
105
106        //tuli = new Flames( liekinKuva, 40, Angle.Zero );
107        //tuli.MinScale = 0.03;
108        //tuli.MaxScale = 0.04;
109        //tuli.MinVelocity = 0.01;
110        //tuli.MaxVelocity = 0.1;
111        //tuli.MinAcceleration = 0.1;
112        //tuli.MaxAcceleration = 2;
113        //Add( tuli );
114
115        tuliJaLeimaus = new Lieska( liekinKuva );
116        Add( tuliJaLeimaus );
117
118        PhysicsObject vasenSeina = Level.CreateLeftBorder();
119        PhysicsObject oikeaSeina = Level.CreateRightBorder();
120        PhysicsObject ylaSeina = Level.CreateTopBorder();
121        PhysicsObject alaSeina = Level.CreateBottomBorder();
122
123        PhysicsObject seina = PhysicsObject.CreateStaticObject( 4, 4, Shapes.Rectangle );
124        seina.Color = Color.DarkGray;
125        seina.X = Level.Center.X - Level.Width / 4;
126        seina.Y = Level.Center.Y;
127        Add( seina );
128
129        for ( int i = 0; i < 100; i++ )
130        {
131            PhysicsObject omena = new PhysicsObject( 0.1, 0.1, Shapes.Circle );
132            omena.Tag = "ruoka";
133            omena.IgnoresCollisionResponse = true;
134            omena.X = RandomGen.NextDouble( Level.Left, Level.Right );
135            omena.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
136            omena.Color = Color.Red;
137            Add( omena );
138        }
139
140        PhysicsObject taikaSauva = LuoTaikaSauva();
141        Add( taikaSauva, -1 );
142
143        Esine lyhty = new Esine( 0.6, 0.6, Shapes.Circle, EsineenTyyppi.Lyhty );
144        lyhty.Image = lyhdynKuva;
145        lyhty.X = 4;
146        lyhty.Y = -2;
147        Add( lyhty, -1 );
148
149        pelaaja = new PhysicsObject( 0.8, 0.8, Shapes.Circle );
150        pelaaja.Color = Color.Blue;
151        pelaaja.Mass = 80;
152        pelaaja.LinearDamping = 0.96;
153        pelaaja.AngularDamping = 0.96;
154        Add( pelaaja );
155
156        AddCollisionHandler( pelaaja, PelaajaOsuu );
157
158        GameObject suuntaTikku = new GameObject( 0.2, 0.1 );
159        suuntaTikku.Color = Color.Green;
160        suuntaTikku.X = 0.5;
161        pelaaja.Add( suuntaTikku );
162
163        for ( int i = 0; i < 30; i++ )
164        {
165            Otus otti = LuoOttiainen();
166            otti.X = RandomGen.NextDouble( Level.Left + 1, Level.Right - 1 );
167            otti.Y = RandomGen.NextDouble( Level.Bottom + 1, Level.Top - 1 );
168        }
169
170        Esine timantti = new Esine( 0.3, 0.3, Shapes.Circle, EsineenTyyppi.Timantti );
171        timantti.X = RandomGen.NextDouble( Level.Left, Level.Right );
172        timantti.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
173        timantti.Image = timantinKuva;
174        Add( timantti, -1 );
175
176        Camera.StayInLevel = true;
177        Camera.Follow( pelaaja );
178    }
179
180    void PelaajaOsuu( PhysicsObject pelaaja, PhysicsObject kohde )
181    {
182        if ( kohde is Esine )
183        {
184            viimeksiKoskettuEsine = (Esine)kohde;
185            esineRuutu.Nayta( viimeksiKoskettuEsine );
186        }
187    }
188
189    Esine LuoTaikaSauva()
190    {
191        Esine s = new Esine( 0.8, 0.1, Shapes.Rectangle, EsineenTyyppi.Taikasauva );
192        s.Tag = "taikaSauva";
193        s.Color = Color.Red;
194        s.X = 2;
195        s.Y = 0;
196        return s;
197    }
198
199    Otus LuoOttiainen()
200    {
201        Otus ottiainen = new Otus( 0.6, 0.6, new Animation( ottiaisenKuvat[0] ) );
202        ottiainen.Mass = 20;
203        ottiainen.LiikkumisAnimaatio = new Animation( ottiaisenKuvat ) { FPS = 5 };
204        ottiainen.HyokkaysAnimaatio = new Animation( ottiaisenSyomisKuvat ) { FPS = 20 };
205        ottiainen.PalanutKuva = ottiainenPalanutKuva;
206        ottiainen.Angle = RandomGen.NextAngle();
207        Add( ottiainen );
208        return ottiainen;
209    }
210
211    protected override void Update( Time time )
212    {
213        lyhdynValo.Position = pelaaja.Position;
214        base.Update( time );
215    }
216
217    void AsetaOhjaimet()
218    {
219        Keyboard.Listen( Key.Escape, ButtonState.Pressed, Exit, null );
220
221        Keyboard.Listen( Key.Up, ButtonState.Down, Etene, null );
222        Keyboard.Listen( Key.Up, ButtonState.Released, pelaaja.Stop, null );
223
224        Keyboard.Listen( Key.Left, ButtonState.Down, KaannaVasemmalle, null );
225        Keyboard.Listen( Key.Right, ButtonState.Down, KaannaOikealle, null );
226        Keyboard.Listen( Key.Left, ButtonState.Released, EiKaanny, null );
227        Keyboard.Listen( Key.Right, ButtonState.Released, EiKaanny, null );
228
229        Keyboard.Listen( Key.Q, ButtonState.Pressed, esineValikko.Vasemmalle, null );
230        Keyboard.Listen( Key.W, ButtonState.Pressed, esineValikko.Oikealle, null );
231        Keyboard.Listen( Key.Space, ButtonState.Pressed, KaytaValittuaEsinetta, null );
232
233        Keyboard.Listen( Key.P, ButtonState.Pressed, Keraa, null );
234    }
235
236    void KaytaValittuaEsinetta()
237    {
238        Esine valittu = esineValikko.ValittuEsine;
239
240        switch ( valittu.Tyyppi )
241        {
242            case EsineenTyyppi.Taikasauva:
243                KaytaTaikaSauvaa();
244                break;
245            case EsineenTyyppi.Lyhty:
246                KaytaLamppua();
247                break;
248            case EsineenTyyppi.Timantti:
249                break;
250            default:
251                break;
252        }
253    }
254
255    double Etaisyys( Vector p1, Vector p2 )
256    {
257        double dx = p2.X - p1.X;
258        double dy = p2.Y - p1.Y;
259        return Math.Abs( dx * dx + dy * dy );
260    }
261
262    void Keraa()
263    {
264        if ( viimeksiKoskettuEsine == null )
265            return;
266
267        if ( ( Etaisyys( pelaaja.Position, viimeksiKoskettuEsine.Position ) - pelaaja.Width / 2 - viimeksiKoskettuEsine.Width / 2 ) > 0 )
268            return;
269
270        Remove( viimeksiKoskettuEsine );
271        esineValikko.Add( viimeksiKoskettuEsine );
272
273        switch ( viimeksiKoskettuEsine.Tyyppi )
274        {
275            case EsineenTyyppi.Taikasauva:
276                GameObject klooni = new GameObject( viimeksiKoskettuEsine.Width, viimeksiKoskettuEsine.Height );
277                klooni.Color = viimeksiKoskettuEsine.Color;
278                pelaaja.Add( klooni );
279                klooni.X = pelaaja.Width / 2 + klooni.Width / 4;
280                break;
281            case EsineenTyyppi.Lyhty:
282                break;
283            case EsineenTyyppi.Timantti:
284                Level.AmbientLight = 0.8;
285                MessageBox viesti = new MessageBox(
286                    "Peli läpi!", "Löysit timantin, pimeys poistui maasta. Onneksi olkoon!" );
287                Add( viesti );
288                break;
289            default:
290                break;
291        }
292
293        viimeksiKoskettuEsine = null;
294    }
295
296    void KaytaLamppua()
297    {
298        if ( lyhdynValo.Intensity <= 0.1 )
299        {
300            lyhdynValo.Intensity = 1.0;
301        }
302        else
303        {
304            lyhdynValo.Intensity = 0.0;
305        }
306    }
307
308    void KaytaTaikaSauvaa()
309    {
310        Vector paikka = pelaaja.Position + Vector.FromLengthAndAngle( 1, pelaaja.Angle );
311        tuliJaLeimaus.Suunta = pelaaja.Angle;
312        tuliJaLeimaus.AddEffect( paikka.X, paikka.Y, 40 );
313
314        int sateidenMaara = 5;
315        Angle pieninKulma = pelaaja.Angle + Angle.Degrees( -10 );
316        Angle suurinKulma = pelaaja.Angle + Angle.Degrees( 10 );
317        Angle sateidenVali = ( suurinKulma - pieninKulma ) / sateidenMaara;
318
319        for ( int i = 0; i < sateidenMaara; i++ )
320        {
321            Angle kulma = pieninKulma + i * sateidenVali;
322            Vector suuntaVektori = Vector.FromLengthAndAngle( 1, kulma );
323            RaySegment sadeKuvio = new RaySegment( suuntaVektori * 1.0, suuntaVektori, 5 );
324            PhysicsObject liekinSade = new PhysicsObject( sadeKuvio );
325            liekinSade.MaximumLifetime = TimeSpan.FromSeconds( 0.5 );
326            liekinSade.Position = pelaaja.Position;
327            liekinSade.Color = Color.Red;
328            liekinSade.IsVisible = false;
329            Add( liekinSade );
330
331            AddCollisionHandler( liekinSade, LiekkiSadeOsuu );
332        }
333    }
334
335    void LiekkiSadeOsuu( PhysicsObject sade, PhysicsObject kohde )
336    {
337        if ( kohde is Otus && kohde != pelaaja )
338        {
339            sade.Destroy();
340            Otus otus = (Otus)kohde;
341            otus.Liekita();
342        }
343    }
344
345    void Etene()
346    {
347        pelaaja.Velocity = Vector.FromLengthAndAngle( PelaajanNopeus, pelaaja.Angle );
348    }
349
350    void KaannaVasemmalle()
351    {
352        pelaaja.AngularVelocity = PelaajanKulmanopeus;
353    }
354
355    void KaannaOikealle()
356    {
357        pelaaja.AngularVelocity = -PelaajanKulmanopeus;
358    }
359
360    void EiKaanny()
361    {
362        pelaaja.AngularVelocity = 0;
363    }
364}
Note: See TracBrowser for help on using the repository browser.