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

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