source: 2014/24/EemeliK/Zombieland/Jypeli/Brains/RandomMoverBrain.cs @ 5974

Revision 5974, 3.2 KB checked in by empaheik, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6namespace Jypeli
7{
8    /// <summary>
9    /// Aivot, jotka laittavat omistajansa liikkumaan satunnaisesti eri suuntiin törmäyksissä ja tietyn ajan jälkeen.
10    /// </summary>
11    public class RandomMoverBrain : AbstractMoverBrain
12    {
13        private Timer changeDirectionTimer;
14        private Angle currentDirection;
15
16        /// <summary>
17        /// Aika sekunteina, jonka kuluttua muutetaan liikesuuntaa
18        /// </summary>
19        public double ChangeMovementSeconds
20        {
21            get { return changeDirectionTimer.Interval; }
22            set { changeDirectionTimer.Interval = value; }
23        }
24
25        /// <summary>
26        /// Paikka, jonka ympärillä harhaillaan, jos WanderRadius on asetettu.
27        /// </summary>
28        public Vector WanderPosition { get; set; }
29
30        /// <summary>
31        /// Säde, jonka sisälle harhailu rajoittuu.
32        /// </summary>
33        public double WanderRadius { get; set; }
34
35        /// <summary>
36        /// Luo uudet satunnaisliikkujan aivot.
37        /// </summary>
38        public RandomMoverBrain()
39            : base()
40        {
41            changeDirectionTimer = new Timer();
42            changeDirectionTimer.Timeout += ChangeDirection;
43            changeDirectionTimer.Interval = 3;
44
45            ChangeDirection();
46            WanderRadius = double.PositiveInfinity;
47        }
48
49        /// <summary>
50        /// Luo uudet satunnaisliikkujan aivot ja asettaa niille nopeuden.
51        /// </summary>
52        public RandomMoverBrain( double speed )
53            : this()
54        {
55            Speed = speed;
56        }
57
58        protected override void OnAdd( IGameObject newOwner )
59        {
60            changeDirectionTimer.Start();
61            WanderPosition = newOwner.AbsolutePosition;
62            base.OnAdd( newOwner );
63        }
64
65        protected override void OnRemove( IGameObject prevOwner )
66        {
67            changeDirectionTimer.Stop();
68            base.OnRemove( prevOwner );
69        }
70
71        void ChangeDirection()
72        {
73            currentDirection = RandomGen.NextAngle();
74        }
75
76        /// <summary>
77        /// Kutsutaan, kun tapahtuu törmäys.
78        /// </summary>
79        /// <param name="target">Olio, johon törmätään.</param>
80        public override void OnCollision( IGameObject target )
81        {
82            Vector d = target.AbsolutePosition - Owner.AbsolutePosition;
83            Angle n1 = d.Angle - Angle.RightAngle;
84            Angle n2 = d.Angle + Angle.RightAngle;
85
86            currentDirection = RandomGen.NextAngle( n1, n2 );
87
88            base.OnCollision( target );
89        }
90
91        protected override void Update( Time time )
92        {
93            if ( Owner == null )
94                return;
95
96            if ( !double.IsInfinity( WanderRadius ) )
97            {
98                Vector d = WanderPosition - Owner.AbsolutePosition;
99                if ( d.Magnitude > WanderRadius )
100                    currentDirection = d.Angle;
101            }
102
103            Move( currentDirection );
104            base.Update( time );
105        }
106    }
107}
Note: See TracBrowser for help on using the repository browser.