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

Revision 1542, 7.0 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 Jypeli;
27using Jypeli.Effects;
28
29class Otus : PhysicsObject
30{
31    enum Tila
32    {
33        Paikallaan,
34        Etenee,
35        Kaantyy,
36        Kuollut,
37    }
38
39    static ParticleSystem savu = null;
40
41    Timer liikkumisAjastin = new Timer();
42    Timer hyokkaysAjastin = new Timer();
43    Timer kaantymisAjastin = new Timer();
44    TimeSpan edellisenSeinaTormayksenAika;
45    Angle kohdeKulma;
46    Tila tila;
47
48    public double Nopeus = 0.3;
49    public Animation AnimaatioPaikallaan;
50    public Animation LiikkumisAnimaatio;
51    public Animation HyokkaysAnimaatio;
52    public Image KuollutKuva;
53    public Image PalanutKuva;
54
55    public int OsumaPisteet = 10;
56
57    public bool OnKuollut { get { return tila == Tila.Kuollut; } }
58
59    public Otus( double width, double height, Animation animaatioPaikallaan )
60        : base( width, height, Shapes.Circle )
61    {
62        IsUpdated = true;
63        this.AnimaatioPaikallaan = animaatioPaikallaan;
64        this.Animation = animaatioPaikallaan;
65        animaatioPaikallaan.Start();
66
67        LinearDamping = 0.96;
68        AngularDamping = 0.96;
69
70        AddedToGame += LisattyPeliin;
71    }
72
73    public override void Destroy()
74    {
75        liikkumisAjastin.Destroy();
76        hyokkaysAjastin.Destroy();
77        base.Destroy();
78    }
79
80    public override void Update( Time time )
81    {
82        if ( tila == Tila.Etenee )
83        {
84            // Käytettävä voima suhteessa olion massaan,
85            // joten toimii eripainoisilla olioilla.
86            double voima = Mass / 2;
87
88            Push( Vector.FromLengthAndAngle( voima, Angle ) );
89        }
90        else if ( tila == Tila.Kaantyy )
91        {
92            double virheMarginaali = 2;
93
94            if ( Math.Abs( ( kohdeKulma - this.Angle ).Degree ) > virheMarginaali )
95            {
96                double vaanto = Mass / 2;
97                ApplyTorque( vaanto );
98            }
99            else
100            {
101                Pysahdy();
102                tila = Tila.Paikallaan;
103                liikkumisAjastin.Start( 1 );
104            }
105        }
106
107        base.Update( time );
108    }
109
110    void LisattyPeliin()
111    {
112        if ( savu == null )
113        {
114            savu = new ParticleSystem( Game.LoadImage( "savu" ), 50, false );
115            savu.MinLifetime = 2;
116            savu.MaxLifetime = 8;
117            savu.MinScale = 0.01;
118            savu.MaxScale = 0.02;
119            savu.MinVelocity = 0.0005;
120            savu.MaxVelocity = 0.001;
121            savu.MinAcceleration = 0.005;
122            savu.MaxAcceleration = 0.009;
123            savu.MinRotationSpeed = -Math.PI / 4;
124            savu.MaxRotationSpeed = Math.PI / 4;
125            Game.Add( savu );
126        }
127
128        liikkumisAjastin.Interval = RandomGen.NextDouble( 0.1, 1.5 );
129        liikkumisAjastin.Trigger += AloitaEteneminen;
130        liikkumisAjastin.Start( 1 );
131
132        hyokkaysAjastin.Interval = 1;
133        hyokkaysAjastin.Trigger += JatkaEteenpain;
134
135        kaantymisAjastin.Interval = RandomGen.NextDouble( 5, 20 );
136        kaantymisAjastin.Trigger += TeeSatunnainenKaannos;
137        kaantymisAjastin.Start();
138
139        if ( Game is PhysicsGame )
140        {
141            PhysicsGame p = (PhysicsGame)Game;
142            p.AddCollisionHandler( this, Tormays );
143        }
144    }
145
146    public void TeeVahinkoa( int pisteet )
147    {
148        OsumaPisteet -= pisteet;
149        if ( OsumaPisteet <= 0 )
150        {
151            OsumaPisteet = 0;
152            Kuole();
153        }
154    }
155
156    public void Kuole()
157    {
158        liikkumisAjastin.Stop();
159        hyokkaysAjastin.Stop();
160        kaantymisAjastin.Stop();
161        Animation.Stop();
162        // RemoveCollisionHandler() olis kiva
163        tila = Tila.Kuollut;
164        MaximumLifetime = Lifetime + TimeSpan.FromMinutes( 1 );
165
166        if ( KuollutKuva != null )
167            Image = KuollutKuva;
168    }
169
170    public void Liekita()
171    {
172        Kuole();
173        if ( PalanutKuva != null )
174            this.Image = PalanutKuva;
175        savu.AddEffect( this.X, this.Y, 1 );
176    }
177
178    void TeeSatunnainenKaannos( Timer sender )
179    {
180        double asteet = RandomGen.NextDouble( 30, 180 );
181        Kaanny( Angle.Degrees( asteet ) );
182    }
183
184    void Tormays( PhysicsObject otus, PhysicsObject kohde )
185    {
186        if ( OnKuollut ) return;
187
188        if ( kohde.Tag.ToString() == "ruoka" )
189        {
190            kohde.Destroy();
191            Animation = HyokkaysAnimaatio;
192            Animation.Start( 1 );
193            hyokkaysAjastin.Start( 1 );
194        }
195        else if ( !kohde.IgnoresCollisionResponse && ( kohde.Mass > ( this.Mass / 10 ) ) )
196        {
197            Pysahdy();
198            TimeSpan aikaNyt = Game.Time.SinceStartOfGame;
199            if ( ( aikaNyt.TotalSeconds - edellisenSeinaTormayksenAika.TotalSeconds ) > 2 )
200            {
201                edellisenSeinaTormayksenAika = aikaNyt;
202                double asteet = RandomGen.NextDouble( 30, 180 );
203                Kaanny( Angle.Degrees( asteet ) );
204            }
205        }
206    }
207
208    public void Kaanny( Angle kulma )
209    {
210        if ( OnKuollut ) return;
211
212        kohdeKulma = this.Angle + kulma;
213        tila = Tila.Kaantyy;
214    }
215
216    public void Hyokkaa()
217    {
218        if ( OnKuollut ) return;
219
220        Animation = HyokkaysAnimaatio;
221        Animation.Start( 1 );
222        hyokkaysAjastin.Start( 1 );
223    }
224
225    public void Pysahdy()
226    {
227        if ( OnKuollut ) return;
228
229        this.Stop();
230        Animation = AnimaatioPaikallaan;
231        Animation.Start();
232    }
233
234    public void Etene()
235    {
236        if ( OnKuollut ) return;
237
238        Animation = LiikkumisAnimaatio;
239        Animation.Start();
240        tila = Tila.Etenee;
241    }
242
243    void JatkaEteenpain( Timer sender )
244    {
245        Pysahdy();
246        liikkumisAjastin.Start( 1 );
247    }
248
249    void AloitaEteneminen( Timer timer )
250    {
251        Etene();
252    }
253}
Note: See TracBrowser for help on using the repository browser.