source: 2014/24/EemeliK/Zombieland/Jypeli/Assets/Automobile.cs @ 10335

Revision 5974, 5.8 KB checked in by empaheik, 5 years ago (diff)
Line 
1using System;
2using AdvanceMath;
3using Jypeli;
4using Microsoft.Xna.Framework;
5using System.Collections.Generic;
6using Microsoft.Xna.Framework.Graphics;
7
8
9namespace Jypeli.Assets
10{
11    /// <summary>
12    /// Auto.
13    /// </summary>
14    public class Automobile : PhysicsObject
15    {
16        private static Image commonImage = null;
17
18        private double topspeed;
19
20        /// <summary>
21        /// Nopeusmittari, joka mittaa auton nopeuden (moottorin nopeus).
22        /// Huomaa, että ei vastaa aina <c>Velocity</c>-ominaisuuden arvoa.
23        /// </summary>
24        public DoubleMeter SpeedMeter { get; set; }
25
26        /// <summary>
27        /// Auton moottorin nopeus.
28        /// Huomaa, että ei vastaa aina <c>Velocity</c>-ominaisuuden arvoa.
29        /// </summary>
30        public double Speed
31        {
32            get { return SpeedMeter.Value; }
33        }
34
35        /// <summary>
36        /// Suurin nopeus, johon auto voi kiihdyttää.
37        /// </summary>
38        public double TopSpeed
39        {
40            get { return topspeed; }
41            set
42            {
43                topspeed = value;
44                SpeedMeter.MaxValue = topspeed;
45            }
46        }
47
48        /// <summary>
49        /// Auton kiihtyvyys, eli kuinka monta yksikköä korkeintaan nopeutta voidaan
50        /// lisätä sekunnissa kiihdyttämällä.
51        /// </summary>
52        public double Acceleration { get; set; }
53
54        /// <summary>
55        /// Jarrujen hidastavuus, eli kuinka monta yksikköä korkeintaan nopeutta voidaan
56        /// vähentää sekunnissa jarruttamalla.
57        /// </summary>
58        public double BrakeDeceleration { get; set; }
59
60        /// <summary>
61        /// Ohjattavuus, eli kulma jonka auto voi korkeintaan kääntyä sekunnissa.
62        /// </summary>
63        public Angle Maneuverability { get; set; }
64
65        private double pendingAcceleration = 0;
66        private double pendingDeceleration = 0;
67
68        /// <summary>
69        /// Alustaa uuden auton.
70        /// </summary>
71        /// <param name="width">Auton leveys (X-suunnassa).</param>
72        /// <param name="height">Auton korkeus (Y-suunnassa).</param>
73        public Automobile( double width, double height )
74            : base( width, height, Shape.Rectangle )
75        {
76            SpeedMeter = new DoubleMeter( 0 );
77            TopSpeed = 1000;
78            Acceleration = 100;
79            BrakeDeceleration = 200;
80            Maneuverability = Angle.FromDegrees( 20 );
81            if ( commonImage == null )
82                commonImage = Game.LoadImageFromResources( "Auto" );
83            Image = Image.Color( commonImage, Color );
84            IsUpdated = true;
85        }
86
87        /// <summary>
88        /// Kiihdyttää.
89        /// </summary>
90        /// <param name="time">Kuinka monta sekuntia kiihdytetään.</param>
91        public void Accelerate( double time )
92        {
93            pendingAcceleration += Acceleration * time;
94        }
95
96        /// <summary>
97        /// Jarruttaa.
98        /// </summary>
99        /// <param name="time">Kuinka monta sekuntia jarrutetaan.</param>
100        public void Brake( double time )
101        {
102            pendingDeceleration += BrakeDeceleration * time;
103        }
104
105        /// <summary>
106        /// Kiihdyttää.
107        /// </summary>
108        public void Accelerate()
109        {
110            pendingAcceleration += Acceleration * Game.Time.SinceLastUpdate.TotalSeconds;
111        }
112
113        /// <summary>
114        /// Kiihdyttää takaperin.
115        /// </summary>
116        public void Reverse()
117        {
118            pendingAcceleration += -Acceleration * Game.Time.SinceLastUpdate.TotalSeconds;
119        }
120
121        /// <summary>
122        /// Jarruttaa.
123        /// </summary>
124        public void Brake()
125        {
126            pendingDeceleration += BrakeDeceleration * Game.Time.SinceLastUpdate.TotalSeconds;
127        }
128
129        /// <summary>
130        /// Kääntyy niin paljon kuin auton ohjattavuus sallii.
131        /// </summary>
132        /// <param name="angle">Kääntökulma.</param>
133        /// <param name="time">Aika, joka kääntämiseen käytetään.</param>
134        public void Turn( Angle angle, double time )
135        {
136            int sign = Math.Sign( angle.Radians );
137            Angle += ( sign * angle <= time * Maneuverability ) ? angle : sign * time * Maneuverability;
138        }
139
140        /// <summary>
141        /// Ajetaan kun pelitilannetta päivitetään. Päivityksen voi toteuttaa omassa luokassa toteuttamalla tämän
142        /// metodin. Perityn luokan metodissa tulee kutsua kantaluokan metodia.
143        /// </summary>
144        public override void Update( Time time )
145        {
146            double dt = time.SinceLastUpdate.TotalSeconds;
147            bool nochange = true;
148
149            if ( pendingAcceleration != 0 )
150            {
151                // Accelerate               
152                double accel = Math.Min( pendingAcceleration, Acceleration * dt );
153                pendingAcceleration -= accel;
154
155                Velocity += Vector.FromLengthAndAngle( accel, Angle );
156                SpeedMeter.Value += accel;
157
158                nochange = false;
159            }
160
161            if ( pendingDeceleration > 0 )
162            {
163                // Brake
164                double decel = AdvanceMath.MathHelper.Min((float)pendingDeceleration, (float)(BrakeDeceleration * dt), (float)Velocity.Magnitude);
165                pendingDeceleration -= decel;
166
167                Velocity += Vector.FromLengthAndAngle( -decel, Velocity.Angle );
168                SpeedMeter.Value -= decel;
169
170                nochange = false;
171
172            }
173
174            if ( nochange )
175            {
176                SpeedMeter.Value -= dt * Acceleration;
177            }
178
179            base.Update( time );
180        }
181    }
182}
Note: See TracBrowser for help on using the repository browser.