source: 2013/30/MiskaK/MW2(My Warfare 2)/Paranneltu Jypeli/Assets/DriverBrain.cs @ 4507

Revision 4507, 5.0 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1using System;
2using AdvanceMath;
3using Jypeli;
4using Microsoft.Xna.Framework;
5using System.Collections.Generic;
6
7namespace Jypeli.Assets
8{
9    /// <summary>
10    /// Ajajan aivot.
11    /// Laskee checkpointteja ja kierroksia automaattisesti.
12    /// Nämä aivot ovat ihmispelaajalle, käytä tietokoneautoille <c>ComputerDriverBrain</c>-luokkaa.
13    /// </summary>
14    public class DriverBrain : Brain
15    {
16        private List<PhysicsObject> chkpoints;
17
18        /// <summary>
19        /// Lista checkpointeista eli tarkistuspisteistä radalla.
20        /// Auton tulee ajaa kaikkien näiden pisteiden läpi oikeassa järjestyksessä, että kierros
21        /// lasketaan suoritetuksi.
22        /// </summary>
23        public List<PhysicsObject> Checkpoints
24        {
25            get { return chkpoints; }
26            set
27            {
28                chkpoints = value;
29                CheckpointsPassed.Value = 0;
30                CheckpointsPassed.MaxValue = value.Count;
31            }
32        }
33
34        /// <summary>
35        /// Seuraava tarkistuspiste.
36        /// </summary>
37        public PhysicsObject NextCheckpoint
38        {
39            get
40            {
41                return ( CheckpointsPassed.Value < Checkpoints.Count ) ? Checkpoints[CheckpointsPassed.Value] : null;
42            }
43        }
44
45        /// <summary>
46        /// Mittari joka mittaa ajettuja kierroksia.
47        /// </summary>
48        public IntMeter RoundsDriven { get; set; }
49
50        /// <summary>
51        /// Mittari joka mittaa läpäistyjä tarkistuspisteitä tällä kierroksella.
52        /// </summary>
53        public IntMeter CheckpointsPassed { get; set; }
54
55
56        /// <summary>
57        /// Alustaa uudet ajajan aivot.
58        /// </summary>
59        /// <param name="checkpoints">Tarkistuspisteet, joiden läpi pelaajan on ajettava.</param>
60        /// <param name="rounds">Kierrosten määrä.</param>
61        public DriverBrain( List<PhysicsObject> checkpoints, int rounds )
62        {
63            RoundsDriven = new IntMeter( 0 );
64            RoundsDriven.MaxValue = rounds;
65
66            CheckpointsPassed = new IntMeter( 0 );
67            CheckpointsPassed.MaxValue = 1;
68            CheckpointsPassed.UpperLimit += nextRound;
69
70            Checkpoints = checkpoints;
71        }
72
73        private void nextRound()
74        {
75            CheckpointsPassed.Reset();
76            ++RoundsDriven.Value;
77        }
78
79        /// <summary>
80        /// Kutsutaan, kun tapahtuu törmäys.
81        /// </summary>
82        /// <param name="target">Toinen törmääjä.</param>
83        public override void OnCollision( IGameObject target )
84        {           
85            if ( target == NextCheckpoint )
86            {
87                // Checkpoint reached, set next
88                CheckpointsPassed.MaxValue = Checkpoints.Count;
89                ++CheckpointsPassed.Value;
90            }
91
92            base.OnCollision( target );
93        }
94    }
95
96    /// <summary>
97    /// Tietokoneajajan aivot.
98    /// Kuten <c>DriverBrain</c>, mutta osaa automaattisesti suunnistaa checkpointilta toiselle
99    /// vauhtia säädellen.
100    /// </summary>
101    public class ComputerDriverBrain : DriverBrain
102    {
103        /// <summary>
104        /// Alustaa uudet tietokoneajajan aivot.
105        /// </summary>
106        /// <param name="checkpoints">Tarkistuspisteet, joiden läpi pelaajan on ajettava.</param>
107        /// <param name="rounds">Kierrosten määrä.</param>
108        public ComputerDriverBrain( List<PhysicsObject> checkpoints, int rounds )
109            : base( checkpoints, rounds )
110        {
111        }
112
113        /// <summary>
114        /// Kutsutaan, kun tilaa päivitetään.
115        /// Ajamislogiikka sijaitsee täällä.
116        /// </summary>
117        /// <param name="gameTime">The game time.</param>
118        protected override void Update( Time time )
119        {
120            Automobile OwnerAuto = Owner as Automobile;
121
122            if ( OwnerAuto != null )
123            {
124                Vector distance = NextCheckpoint.Position - OwnerAuto.Position;
125                Angle turnAngle = distance.Angle - OwnerAuto.Angle;
126
127                double dt = time.SinceLastUpdate.TotalSeconds;
128                double dist = Math.Max( distance.Magnitude, Double.Epsilon );
129                double spd = Math.Max( OwnerAuto.Velocity.Magnitude, Double.Epsilon );
130                double eta = dist / spd;
131                double braketime = spd / OwnerAuto.BrakeDeceleration;
132                double turntime = Math.Abs( turnAngle.Radians ) / OwnerAuto.Maneuverability.Radians;               
133
134                if ( turntime >= eta || braketime * OwnerAuto.KineticFriction >= eta )
135                {
136                    OwnerAuto.Brake( dt );
137                }
138
139                else
140                {
141                    OwnerAuto.Accelerate( dt );
142                }
143
144                OwnerAuto.Turn( turnAngle, dt );
145            }
146
147            base.Update( time );
148        }
149    }
150}
Note: See TracBrowser for help on using the repository browser.