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

Revision 1269, 11.7 KB checked in by tekrjant, 10 years ago (diff)

Pelissä on tavoite :)

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