示例#1
0
        public override void RemoveAvatar(PhysicsActor actor)
        {
            BasicActor act = (BasicActor)actor;

            if (_actors.Contains(act))
            {
                _actors.Remove(act);
            }
        }
示例#2
0
        public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 velocity, Vector3 size, bool isFlying)
        {
            BasicActor act = new BasicActor(size);

            act.Position = position;
            act.Velocity = velocity;
            act.Flying   = isFlying;
            _actors.Add(act);
            return(act);
        }
示例#3
0
 public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 velocity, Vector3 size, bool isFlying)
 {
     BasicActor act = new BasicActor(size);
     act.Position = position;
     act.Velocity = velocity;
     act.Flying = isFlying;
     _actors.Add(act);
     return act;
 }
示例#4
0
        public override float Simulate(float timeStep)
        {
//            Console.WriteLine("Simulating");

            float fps = 1.0f / timeStep;

            for (int i = 0; i < _actors.Count; ++i)
            {
                BasicActor actor         = _actors[i];
                Vector3    actorPosition = actor.Position;
                Vector3    actorVelocity = actor.Velocity;

                //Console.WriteLine(
                //    "Processing actor {0}, starting pos {1}, starting vel {2}", i, actorPosition, actorVelocity);

                actorPosition.X += actor.Velocity.X * timeStep;
                actorPosition.Y += actor.Velocity.Y * timeStep;

                if (actor.Position.Y < 0)
                {
                    actorPosition.Y = 0.1F;
                }
                else if (actor.Position.Y >= m_regionExtent.Y)
                {
                    actorPosition.Y = (m_regionExtent.Y - 0.1f);
                }

                if (actor.Position.X < 0)
                {
                    actorPosition.X = 0.1F;
                }
                else if (actor.Position.X >= m_regionExtent.X)
                {
                    actorPosition.X = (m_regionExtent.X - 0.1f);
                }

                float terrainHeight = 0;
                if (_heightMap != null)
                {
                    terrainHeight = _heightMap[(int)actor.Position.Y * (int)m_regionExtent.Y + (int)actor.Position.X];
                }

                float height = terrainHeight + actor.Size.Z;
//                Console.WriteLine("height {0}, actorPosition {1}", height, actorPosition);

                if (actor.Flying)
                {
                    if (actor.Position.Z + (actor.Velocity.Z * timeStep) < terrainHeight + 2)
                    {
                        actorPosition.Z   = height;
                        actorVelocity.Z   = 0;
                        actor.IsColliding = true;
                    }
                    else
                    {
                        actorPosition.Z  += actor.Velocity.Z * timeStep;
                        actor.IsColliding = false;
                    }
                }
                else
                {
                    actorPosition.Z   = height;
                    actorVelocity.Z   = 0;
                    actor.IsColliding = true;
                }

                actor.Position = actorPosition;
                actor.Velocity = actorVelocity;
            }

            return(fps);
        }