root/Code/oMaE/oMaE/Overworld/Objects/Elephant.cs @ 120

Revision 120, 5.5 KB (checked in by acarter, 2 years ago)

Committing changes

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Content;
7using Microsoft.Xna.Framework.Graphics;
8using Microsoft.Xna.Framework.Input;
9
10namespace oMaE.Overworld.Objects
11{
12       
13    class Elephant: GameObject {
14        public Elephant() {
15        }
16
17        public Elephant(float x, float y, float z): this(new Vector3(x, y, z)) {
18        }
19
20        public Elephant(Vector3 position) {
21            this.position = position;
22        }
23        private bool running =false;
24        private float angle = 0.0f;
25        private float angularVelocity = 0.0f;
26        private Vector3 bounceMomentum = Vector3.Zero;
27        private float velocity = 0.0f;
28        private float topSpeed { get { return running ? 0.07f : 0.02347f; } }
29        private static readonly float slowDown = 0.75f;
30        private float topTurningSpeed { get { return (running ? 2 : 1) * (float)((MathHelper.TwoPi / 5) * 1e-3); } }
31        private float acceleration { get { return running ? 2.734e-4f : 2.734e-5f;} }
32        private float angularAcceleration { get { return (float)(topTurningSpeed * 1e-3); } }
33        private static readonly float stopTurning = 0.75f;
34
35        private Model trunk;
36        protected Matrix[] transformBones;
37
38        private void SetupEffectDefaults()
39        {
40            transformBones = new Matrix[trunk.Bones.Count];
41            trunk.CopyAbsoluteBoneTransformsTo(transformBones);
42            foreach (ModelMesh mesh in trunk.Meshes)
43            {
44                foreach (BasicEffect effect in mesh.Effects)
45                {
46                    effect.EnableDefaultLighting();
47                    effect.TextureEnabled = false;
48                }
49            }
50        }
51        public override void LoadContent(ContentManager Content)
52        {
53            if (trunk == null)
54            {
55                trunk = Content.Load<Model>("Models/trunk");
56                SetupEffectDefaults();
57            }
58
59            base.LoadContent(Content);
60        }
61
62        public override void Update(GameState gameState) {
63            float delta = gameState.EllapsedMilliseconds * acceleration;
64            float deltaAngle = gameState.EllapsedMilliseconds * angularAcceleration;
65            bool moving = gameState.Down(Keys.W) || gameState.Down(Keys.S),
66                    turning = gameState.Down(Keys.A) || gameState.Down(Keys.D);
67            running = moving && (gameState.Down(Keys.LeftShift) || gameState.Down(Keys.RightShift));
68            if (gameState.Down(Keys.W))
69                    velocity += delta;
70            if (gameState.Down(Keys.S))
71                    velocity -= delta;
72            if (gameState.Down(Keys.A))
73                    angularVelocity += deltaAngle;
74            if (gameState.Down(Keys.D))
75                angularVelocity -= deltaAngle;
76            float vmult = moving ? topSpeed / (delta + topSpeed) : slowDown;
77            float tmult = turning ? topTurningSpeed / (deltaAngle + topTurningSpeed) : stopTurning;
78
79            velocity *= vmult;
80            bounceMomentum *= vmult;
81            angularVelocity *= tmult;
82
83            angle += gameState.EllapsedMilliseconds * angularVelocity;
84            Vector3 deltaPosition = driver.World3D.Collide(position, (Heading * velocity + bounceMomentum) * gameState.EllapsedMilliseconds);
85            if(gameState.EllapsedMilliseconds != 0)
86                    bounceMomentum += (deltaPosition / gameState.EllapsedMilliseconds) - Heading * velocity - bounceMomentum;
87            position += deltaPosition;
88            driver.World3D.Near(position);
89            base.Update(gameState);
90        }
91
92        public void reset(float x, float y, float z) {
93            reset(new Vector3(x, y, z));
94        }
95
96        public void reset(Vector3 position) {
97            stop();
98            this.position = position;
99            angle = -MathHelper.Pi;
100        }
101
102        public void stop() {
103            velocity = 0.0f;
104            angularVelocity = 0.0f;
105        }
106
107        public Vector3 Heading {
108            get {
109                return new Vector3((float)Math.Sin(angle), 0.0f, (float)Math.Cos(angle));
110            }
111        }
112
113        public Vector3 Position {
114            get {
115                return Vector3.Multiply(position, driver.World3D.WorldScale);
116            }
117            set
118            {
119                position = value / driver.World3D.WorldScale;
120            }
121        }
122        private Vector3 position;
123
124        public Matrix ViewMatrix {
125            get {
126                return Matrix.CreateLookAt(Position, Vector3.Add(Position, Heading), Vector3.Up);
127            }
128        }
129        public void DrawModel(Model model, Matrix modelTransform, Matrix[] absoluteBoneTransforms)
130        {
131            //Draw the model, a model can have multiple meshes, so loop
132            foreach (ModelMesh mesh in model.Meshes)
133            {
134                //This is where the mesh orientation is set
135                foreach (BasicEffect effect in mesh.Effects)
136                {
137                    effect.Projection = driver.World3D.ProjectionMatrix;
138                    effect.View = driver.World3D.ViewMatrix;
139                    effect.World =
140                        absoluteBoneTransforms[mesh.ParentBone.Index] *
141                        modelTransform;
142                }
143                //Draw the mesh, will use the effects set above.
144                mesh.Draw();
145            }
146        }
147        public override void Draw()
148        {
149            Matrix transformMatrix = Matrix.CreateScale(0.25f) * Matrix.CreateRotationZ(7 * MathHelper.Pi / 8) * Matrix.CreateRotationY(angle + 9 * MathHelper.Pi / 8)  * Matrix.CreateTranslation(position + 0.2f * Vector3.Up + 2f * Heading + 0.0f * Vector3.Cross(Heading, Vector3.Up));
150            DrawModel(trunk, transformMatrix, transformBones);
151            base.Draw();
152        }
153    }
154}
Note: See TracBrowser for help on using the browser.