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

Revision 1486, 12.5 KB checked in by tekrjant, 11 years ago (diff)

vähäsen hienompi.

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